Electromag1 Circuits électroniques et Picaxes

Petit site pour ceux qui bricolent en électronique en général et sur les PICAXES en particulier.
Les PICAXES sont des microprocesseurs (PIC de Microship) programmables en BASIC. Pleins de qualités, pas chers, ultra faciles à programmer.
Tout (ou presque) est sur le site du distributeur Gotronic (voir les liens).
Les pages  seront ajoutées ou modifiées petit à petit.
Dans le but d'améliorer ce blog, communiquez moi vos remarques et les erreurs que vous pouvez constater.
Pour me contacter: Envoyez un mail à l'adresse : mag1mic@free.fr .  Tout message reçoit une réponse
Pour retourner au menu, Cliquer sur "LISTE DES PAGES", ici ou en haut de la colonne de gauche
Pour laisser un message, allez dans le "LIVRE D'OR"
Bonne visite
 
 

 2 - AFFICHAGE SUR LCD (voir page dédiée au LCD type HD44780)

C'est finalement la solution retenue par le demandeur.
L'afficheur LCD choisi est un transflectif 8 digits à grands caractères, c'est le plus économique en énergie, de jour, il est visible sans éclairage, de nuit, le rétroéclairage est activé par l'unique bouton poussoir du système.
Un autre, sur eBay, mais il faut un rétroéclairage

Le nouveau cahier des charges est un peu modifié, un seul poussoir permet d'accéder aux menus: PLEIN, AJOUT, ALARME
Principe de base: Un appui court pour faire défiler le menu et les chiffres à introduire , un appui long (3 s) pour valider le choix.
Les choix validés sont mémorisés et présentés par défaut, ce qui évite des manipulations:
Ex, si le plein est de 200 litres, il est mémorisé et affiché au remplissage suivant, il n'y a plus qu'à valider
De même pour le niveau d'alarme (ex 30 litres).
Une fonction "AJOUT" permet d'augmenter la quantité restante.

Le schéma:
 Le code:;    totalisateur consommation eau
;    LCD 1602 selection poussoir
;    MM 13 11 2013
    #picaxe 14M2
 Debut:   
    setfreq m32    ;horloge à 32MHz
    pause 500    
;********** Nom des broches ******************    
    SYMBOL  RS        = B.0         ; 0 = Command   1 = Data
    SYMBOL  E         = B.1         ; 0 = Idle      1 = Active
    SYMBOL  DB4       = B.2         ; LCD Data Line 4
    SYMBOL  DB5       = B.3         ; LCD Data Line 5
    SYMBOL  DB6       = B.4         ; LCD Data Line 6
    SYMBOL  DB7       = B.5         ; LCD Data Line 7   
   symbol    pous    =pinC.3    ;appuyé =0 sinon 1 validation remplissage       
   ;                    C.1         ;interruption    
    symbol    lum        = C.2
    symbol    alert    = C.0
;********** Nom des variables bit (1 bit)  
   symbol        rsbit        = bit0    
   symbol        stopalert    = bit1
;********** Nom des variables bytes (1 octet)      
   symbol        cpt        = b1     ;compteur
   symbol        deci    = b2    ;décilitre    
   symbol        unit    = b3    ;unité
   symbol        diz        = b4    ;dizaine
   symbol        cent    = b5    ;centaine
     symbol        car        = b6    ;caractère
   symbol        partiel    = b7    ;conso    partielle
   symbol        memorest= b8    ;mémo de la valeur restante
   symbol        choix    = b9           
;********** Nom des variables word (2 octets)
    symbol        valplein= w13    ;volume plein
    symbol        valaff    = w12    ;valeur affichée           
   symbol        rest    = w11    ;volume restant       
   symbol        wtemp    = w10    ;Word temporaire
   symbol        valalert= w9    ;valeur seuil alerte      
     dirsB=%111111        'défini les I/O ports B0 à B5 en sortie    
    dirsC=%000101        'broches C.0 et C.2 en sorties    
    pullup %0000100000000000    ;R pullup sur C.3    
'*****Données d'initialisation de l'afficheur Type HD44780 ***********
'*****Dans cette application, on utilise les ports BO à B5 du 14M2********
'***** Initialisation LCD*******************
    'Nibble commands - To initialise 4-bit mode
    DATA 0,( $33 )    ; %0011---- %0011----   8-bit / 8-bit
    DATA 1,( $32 )    ; %0011---- %0010----   8-bit / 4-bit   
    'Byte commands - To configure the LCD   
    DATA 2,( %00101000 )    ;  %001LNF00   Display Format
    DATA 3,( %00001100 )    ;  %00001DCB   Display On
    DATA 4,( %00000110 )    ;  %000001IS   Cursor Move
                            ; L : 0 = 4-bit Mode    1 = 8-bit Mode
                            ; N : 0 = 1 Line        1 = 2 Lines
                              ; F : 0 = 5x7 Pixels    1 = N/A
                              ; D : 0 = Display Off   1 = Display On
                            ; C : 0 = Cursor Off    1 = Cursor On
                            ; B : 0 = Cursor Steady 1 = Cursor Flash
                            ; I : 0 = Dec Cursor    1 = Inc Cursor
                            ; S : 0 = Cursor Move   1 = Display Shift
    DATA 5,( $01 )            ; Clear Screen        
'***** Envoi de ces données au LCD ***************
PowerOnReset:
    FOR cpt = 0 TO 5
        READ cpt,car
        GOSUB Init
    NEXT
;********** Table de données texte *************
    table 0,("P      L")
    table 10,("+      L")
    table 20,("R      L")
    table 30,(" PLEIN ?")
    table 40,(" AJOUT ?")
    table 50,("ALERTE ?")
    table 60,("A      L")
    setint %00000000,%00000010    ;interruption niveau 0 sur C.1
    read 6 ,word rest,word valplein, word valalert    ;lecture des valeurs enregistrées en EEPROM    
    if valplein<>rest then
        rest=rest- 5    ;compensation perte aléatoire entre 0 et 1 L à la coupure
    endif                ;statistiquement, l'erreur de troncature à la sauvegarde tend vers 0
    partiel=0
    gosub affrest
    ;serout B.7,N2400, (254,128,"R      L") ;pour simu   
    time=0
    stopalert=0
    high lum   
;******    Boucle de lecture *****************
    Do       
        if pous=0 then
            time=0                   ;RAZ temps         
            low alert                ;arret alerte
            high lum                ;allumage éclairage                
        endif         
        Do     while pous=0                 ;sortie de la boucle vers choisir
            if time>3 then choisir        ;au bout de 3 secondes d'appui sur le poussoir                                      
        loop                   
        if time>60 then             ;extintion éclairage
            low lum                    ;au bout de env 60 s            
        endif     
        valaff=rest                 ;affichage du quantité restante                    ;
        ;serout B.7,N2400, (254,130,#valaff)    
           gosub affich                ;affichage valeur rest
           deci=rest//10                ;valeur de la décimale
           if deci=0 then                ;si elle est nulle,
               gosub sauv                 ;on sauvegarde une fois
           endif
           if rest < valalert  and stopalert =0 then    ;alerte en dessous de 100 dl
               high alert                            ;si stop
               stopalert=1                            ;flag passage
           endif   
    loop   
 ;******* choix plein  / ajout **************   
 choisir:
     choix=1        ;0 = plein
     ;serout B.7,N2400, (254,128," PLEIN ?"):pause 1000    ;pour simu
     gosub affchoixpl
     do loop while pous=0        ;attente relachement      
     Do
         Select case choix            
         case 1    ;1=plein        
            ;serout B.7,N2400, (254,128," PLEIN ?"):pause 1000    ;pour simu    
             gosub affchoixpl                       
               time=0
             Do     while pous=0            ;sortie de la boucle vers init
                if time>3 then plein    ;au bout de 3 secondes ->plein
                choix=2                    ;sinon changement de choix
            loop                          ;fin boucle  
                       
           case 2    ;2 = ajout
            gosub affchoixaj
            ;serout B.7,N2400, (254,128," AJOUT ?"):pause 1000    ;pour simu
            time=0
             Do     while pous=0            ;entrée si appui
                if time>3 then ajout    ;au bout de 3 secondes ->ajout
                choix=3                    ;sinon changement de choix
            loop              ;d'appui sur le poussoir  
            
           case 3    ;3 = seuilalert
            gosub affchoixal
            time=0
            Do     while pous=0            ;entrée si appui
                if time>3 then aler    ;au bout de 3 secondes ->ajout
                choix=1                    ;sinon changement de choix
            loop              ;d'appui sur le poussoir                   
                      
        endselect
   loop  
 ;********** remplissage ********************
 plein:
     gosub affplein
    ;serout B.7,N2400, (254,128,"P?     L")        ;pour simu    
     Do loop while pous=0    ;attente relachement
     valaff=valplein            ;affichage valeur plein
     gosub affich     
     do loop while pous=1    ;attente appui
     time=0    
     Do     while pous=0            ;sortie de la boucle vers init
        if time>3 then saut1    ;au bout de 3 secondes ->saut sans modif de valplein                       
    loop                          ;fin boucle  
     gosub selectpous        ;intro nouvelle valeur par poussoir
saut1:
     valplein= valaff            ;nouvelle valeur de plein
     rest=valplein
    write 6,word rest,word valplein    ;Sauvegarde des valeurs en EEPROM  
      goto debut                        ;on repart
 ;********* ajout *******************************
  ajout:         
     gosub affajout
     ;serout B.7,N2400, (254,128,"+      L"):        ;pour simu
     Do loop while pous=0  
     gosub selectpous
     rest=rest + valaff+5        ;c'est validé, valeur en décilitres    +5 , c'est pas une coupure
    write 6,word rest             ;Sauvegarde des valeurs en EEPROM    
      goto debut     
 ;******** Alerte ***************************      
 aler:
     gosub affalert
     Do loop while pous=0
     valaff=valalert        ;affichage valeur plein
     gosub affich     
     do loop while pous=1    ;attente appui
     time=0    
     Do     while pous=0            ;sortie de la boucle vers init
        if time>3 then saut2    ;au bout de 3 secondes ->saut sans modif de valplein                       
    loop                          ;fin boucle                            
    gosub selectpous
saut2:
    valalert=valaff
    write 10,word valalert    ;Sauvegarde des valeurs en EEPROM
    rest=rest+5                ;début sans -5 cause coupure
    write 6,word rest
    goto debut 
 ;****** sub interruption ***************************************       
interrupt:                    ;comptage des impulsions débitmètre
    inc partiel
    if partiel>=45 then        ;n litres/min = fréq/7,5
        dec rest            ;-> 1 litre/min = 7,5 impulsions/s
        partiel=0            ;-> 1 L = 7,5 x60 = 450 impulsions -> 0,1L =45 impulsions
    endif
    if rest>=10000 then            ;on essaye de passer en dessous de 0? (0-1=65535)
            rest=0                    ;blocage à 0
    endif
    do     loop while pinC.1=0        ;pour ne compter qu'une impulsion par cycle
    setint %00000000,%00000010    ;niveau 0 sur C.1    
    return   
;******** selectpous **************************************
selectpous:
    valaff=0
    bintoascii valaff,cent,cent,diz,unit,deci
    gosub affich
    car =$80 | $01        ;curseur col 2 de la ligne    
    gosub EnvoiCommande ;envoi commande
    car="C"
    gosub EnvoiDonnee    ;Affichage
    cpt=0    ;raz compteur
    Do        
        ;serout B.7,N2400, (254,128,"PC", cent,diz,unit,",",deci,"L")    
        Do loop while pous=1        ;attente appui                        
        time=0                        ;raz time
        Do
            if time>3 then dizain    ;appui + de 3 secondes =valiation
        loop while pous=0            ;attente relachement
        inc cpt                        ;incrémentation compteur
        
        valaff= valaff + 1000
        if cpt>9 then                ;on a fait un tour
            cpt=0                    ;raz compteur
            valaff=valaff-10000        ;effacement des ajouts
        ;serout B.7,N2400, (254,1)    
        endif
        bintoascii valaff,cent,cent,diz,unit,deci    ;affichage nouvelle valeur
        gosub affich
        ;serout B.7,N2400, (254,128,"PC", cent,diz,unit,",",deci,"L")    
    loop            
dizain:    
    car =$80 | $01        ;curseur col 2 de la ligne    
    gosub EnvoiCommande ;envoi commande
    car="D"
    gosub EnvoiDonnee    ;Affichage
    cpt=0
    Do
        ;serout B.7,N2400, (254,128,"PD", cent,diz,unit,",",deci,"L")    
        Do loop while pous=0        ;attente relachement        
        Do loop while pous=1        ;attente appui    
        time=0
        Do
            if time>3 then unite
        loop while pous=0
        inc cpt
        
        valaff= valaff + 100
        if cpt>9 then
            cpt=0
            valaff=valaff-1000
        endif
        bintoascii valaff,cent,cent,diz,unit,deci
        gosub affich
        ;serout B.7,N2400, (254,128,"PD", cent,diz,unit,",",deci,"L")    
    loop    
unite:
    car =$80 | $01        ;curseur col 2 de la ligne    
    gosub EnvoiCommande ;envoi commande
    car="U"
    gosub EnvoiDonnee    ;Affichage
    cpt=0
    Do
        ;serout B.7,N2400, (254,128,"PU", cent,diz,unit,",",deci,"L")    
        Do loop while pous=0    
        Do loop while pous=1    
        time=0
        Do
            if time>3 then finpous
        loop while pous=0
        inc cpt        
        valaff= valaff + 10
        if cpt>9 then
            cpt=0
            valaff=valaff-100
        endif
        bintoascii valaff,cent,cent,diz,unit,deci
        gosub affich
        ;serout B.7,N2400, (254,128,"PU", cent,diz,unit,",",deci,"L")        
    loop
finpous:
    return    
;******* sub affichage ******************************************    
affich:    
    car =$80 | $02        ;curseur col 3 de la ligne
    gosub EnvoiCommande ;envoi commande
        
    bintoascii valaff,cent,cent,diz,unit,deci
    car=cent
    gosub EnvoiDonnee    ;Affichage
    car=diz
    gosub EnvoiDonnee    ;Affichage
    car=unit
    gosub EnvoiDonnee    ;Affichage
    car=","
    gosub EnvoiDonnee    ;Affichage
    car=deci
    gosub EnvoiDonnee    ;Affichage
    return    
;******** affichage plein ***************    
affplein:    
    car =$80 | $00        ;curseur col 0 de la ligne
    gosub EnvoiCommande ;envoi commande
    for cpt=0 to 7
    readtable cpt,car
    gosub EnvoiDonnee
    next
    return
;******** affichage ajout ***************    
affajout:
    car =$80 | $00        ;curseur col 0 de la ligne
    gosub EnvoiCommande ;envoi commande    
    for cpt=10 to 17
    readtable cpt,car
    gosub EnvoiDonnee
    next
    return
;******** affichage reste ***************     
affrest:    
    car =$80 | $00        ;curseur col 0 de la ligne
    gosub EnvoiCommande ;envoi commande    
    for cpt=20 to 27
    readtable cpt,car
    gosub EnvoiDonnee
    next
    return
;******** affichage choix ajout ***************    
affchoixaj:    
    car =$80 | $00        ;curseur col 0 de la ligne
    gosub EnvoiCommande ;envoi commande    
    for cpt=40 to 47
    readtable cpt,car
    gosub EnvoiDonnee
    next
    return
;******** affichage choix plein ***************    
affchoixpl:
    car =$80 | $00        ;curseur col 0 de la ligne
    gosub EnvoiCommande ;envoi commande    
    for cpt=30 to 37
    readtable cpt,car
    gosub EnvoiDonnee
    next
    return
;******** affichage choix alerte ***************          
 affchoixal:
    car =$80 | $00        ;curseur col 0 de la ligne
    gosub EnvoiCommande ;envoi commande    
    for cpt=50 to 57
    readtable cpt,car
    gosub EnvoiDonnee
    next
    return
;******** affichage alerte ***************            
affalert:
    car=$80 | $00
    gosub EnvoiCommande
    for cpt=60 to 67
    readtable cpt,car
    gosub EnvoiDonnee
    next
    return            
;********* sub sauvegarde **********************************    
sauv:
     wtemp=rest/10            ;valeur arrondie au litre
     if wtemp = memorest then    ;la sauvegarde est déjà faite
              return            ;on ne passe qu'une fois par changement de valeur
     endif
     memorest=wtemp            ;mémo de la nouvelle valeur
     write 6,word rest        ;écriture en EEPROM
     return     
;********* sub initialisation valeurs ******************************************     
'Sous programmes d'écriture du LCD
Init:
    PAUSE 120                      ; Delay 15mS à 32MHz
EnvoiCommande:
    rsbit = 0                          ; RSbit = 0 ;C'est une commande    
EnvoiDonnee:
    pinsB = car & $F0 / 4 | rsbit   ; Put MSB out first
     PULSOUT E,1                     ; Give  pulse on E    
    pinsB = car & $0F * 4 | rsbit   ; Put LSB out second
    PULSOUT E,1                     ; Give  pulse on E        
    rsbit = 1                      ; ²RSbit = 1 par défaut ; C'est une donnée    
    RETURN


 
Afficher la suite de cette page



Créer un site
Créer un site