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
 
 

Compteur d'eau électronique

Affichage sur 5 digits MAX7219

ou sur LCD

Ce projet est le résultat d'une demande sur un forum d'électronique:
Comment savoir avec précision la quantité d'eau restant dans le réservoir d'un bateau?

En effet, la forme du réservoir et les mouvements du bateau ne permetent pas aux sondes mécaniques d'origine de donner une valeur fiable.
Par contre, la contenance du réservoir est connue et une mesure précise de la quantité consommée permet de connaitre avec exactitude le volume d'eau disponible à chaque instant.

Les composants:

 

débimète à
effet hall

picaxe
20M2
afficheur 5 digits
avec MAX7219

Cout des trois composants principaux (dans l'ordre): 10,90 + 3,55 + 4 = 18,45 euros

Cahier des charges:

  • Réglage du volume de départ (en général, la capacité du réservoir)

  • Affichage du volume d'eau disponible sur afficheur 5 digits.

  • Résolution = 0,1 litre

  • Réglage automatique de la luminosité en fonction de l'éclairage ambiant.

  • Sauvegarde des données en cas de coupure de l'alimentation.

  • Option: alarme bas niveau

Compléments d'information:
Sur le débimètre
Sur l'afficheur

1- AFFICHAGE SUR LED par MAX7219

Il n'est pas précisé dans cette vidéo que les paramètres sont sauvegardés à chaque changement de litre. Il y a donc à chaque coupure une perte aléatoire comprise entre 0 et 1 litre. On peut penser que cette erreur va se cumuler.
Et bien non, car chaque remise sous tension est accompagnée d'une compensation de +0,5 l, correspondant à l'erreur moyenne due à la troncature aléatoire.
Ce qui fait que, paradoxalement, plus il y a de coupures et moins il y a d'erreur.


 

 

Un schéma répondant à ce cahier:

 

Code proposé

;    totalisateur consommation eau
;    capteur débimètre
; MM 07/11/13
;Configuration câblage:  
'        +V 1 v 8 0V
'           2   7 C.0 vers DIN (DATA IN) du 7219
'           3   6 C.1 vers LOAD du 7219
'TEST/LUM   4   5 C.2 vers CLK du 7219
;Format des registres MAX 7219 sur 16 bits:
;|------------------------------w13------------------------------|                                                               |
;|-----------b27-----------------|------------b26 ---------------|
;|-X-|-X-|-X-|-X-|--ADRESSE------|----------DONNEES--------------|   
;|D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|

    #picaxe20M2
    setfreq m32
;********** Nom des broches ******************    
    symbol        DIN      = B.0    ;Entrée Data In de l'afficheur
    symbol        LOAD     = B.1    ;Entrée Load de l'afficheur
    symbol        CLK      = B.2    ;Entrée CLK de l'afficheur
    symbol        pous    = pinC.6    ;appuyé =0 sinon 1
    symbol        eclair    = C.3        ;mesure LDR
    symbol        potar    = C.7        ;réglage volume max
;********** Nom des variables bytes (1 octet)   
    symbol        flag    =bit0
    symbol        cpt        = b1     ;compteur
    symbol        deci    = b2    ;décilitre    
    symbol        unit    = b3    ;unité
    symbol        diz        = b4    ;dizaine
    symbol        cent    = b5    ;centaine
    symbol        lum        = b6    ;mesure lumière
    symbol        partiel    = b7    ;conso    partielle
    symbol        memorest= b8    ;mémo de la valeur restante
;********** Nom des variables word (2 octets)       
    symbol        volmax    = w9    ;volume max départ       
    symbol        rest    = w10    ;volume restant       
    symbol        conso    = w11    ;cumul conso
                       ;    w 12    ;occupé    
    symbol        regis    = w13    ;=(b27,b26) chaque bit sera envoyé dans le registre
;****************************************       
    low DIN
    low LOAD
    low CLK       
;******** initialisation 7219 *******
    b27=$09  'mode décodage
    b26=%11111111  'code B tous digits
    gosub shiftt
 
      b27=$0b  'limite scanner = Nbre de digits
      b26=$04  '$04=5 digits ,$03=4 digits,, etc...
      gosub shiftt

      b27=$0c  'shutdown mode
      b26=$01  '=normal (afficheur actif)
      gosub shiftt      

      b27=$0a  'luminosité
      b26=$04  '=croissante de 0 à 15, ici c'est 4
      gosub shiftt
      
      b27=$0f  'display test
      b26=$00  '=normal
      gosub shiftt
      
;***** Affichage  dernier digit "L"   
    b27=1
    b26=%00001101   ;
    gosub shiftt     

Debut:
    setint %00000000,%00000010    ;niveau 0 sur C.1
    read 0 ,word conso,word volmax    ;lecture des valeurs enregistrées en EEPROM
    if conso>0 then
        conso=conso + 5    ;compensation perte aléatoire entre 0 et 1 L à la coupure
    endif                ;statistiquement, l'erreur de troncature à la sauvegarde s'annule
    partiel=0
    gosub affich   
;******    Boucle de lecture *****************
    Do
        time=0
        Do                         ;sortie de la boucle vers init
            if time>3 then init    ;au bout de 3 secondes
        loop while pous=0         ;d'appui sur le poussoir
                       
        readadc eclair, lum        ;mesure de l'éclairage
        lum= 15*lum/255            ;gradation entre 0 et 15
        gosub lumiere            ;réglage
        
        rest= volmax-conso        ;calcul volume restant
        if rest>=10000 then        ;on essaye de passer en dessous de 0? (0-1=65535)
            rest=0                ;blocage à 0
        endif
        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
        endif   
    loop   
 ;****** sub interruption ***************************************       
interrupt:    
    inc partiel
    if partiel>=45 then        ;n litres/min = fréq/7,5
        inc conso            ;-> 1 litre/min = 7,5 impulsions/s
        partiel=0            ;-> 1 L = 7,5 x60 = 450 impulsions -> 0,1L =45 impulsions
    endif
    do loop while pous=0
    setint %00000000,%00000010    ;niveau 0 sur C.1    
    return   
;******* sub affichage ******************************************    
affich:        
    bintoascii rest,cent,cent,diz,unit,deci
    b27=2
    b26=deci-48   ;- 48 pour la valeur non ascii
    gosub shiftt    
    b27=3
    b26=unit-48
    b26=b26 | $80        ;avec point décimal   ;
    gosub shiftt
    b27=4
    b26=diz-48
    gosub shiftt
    b27=5
    b26=cent-48
    gosub shiftt  
    return   
;******** sub réglage lumonosité *************************************    
lumiere:
    b27=$0a  'réglage luminosité
    b26=lum '=croissante de 0 à 15
    gosub shiftt
    return
    
;********* sub sauvegarde **********************************    
sauv:
     unit=rest/10            ;valeur arrondie au litre
     if unit = memorest then    ;la sauvegarde est déjà faite
              return            ;on ne passe qu'une fois par changement de valeur
     endif
     memorest=unit            ;mémo de la nouvelle valeur
     write 0,word conso        ;écriture en EEPROM
     return    
;********* sub initialisation valeurs ******************************************     
init:
    b27=2
    b26=14        ;caractère 'P", ça fait "PL", comme le début de 'PLEIN' (Ouai, bon...)
    gosub shiftt
    do loop while pous=0    ;on peut relacher le poussoir quand "PL" apparait       
     Do
        readadc potar,volmax            ;lecture du volume max
        bintoascii volmax,cent,diz,unit    ;décomposition pour affichage    
        b27=3
        b26=unit-48     
        gosub shiftt
        b27=4
        b26=diz-48
        gosub shiftt
        b27=5
        b26=cent-48
        gosub shiftt  
    loop while pous=1        ;attente de la validation
    volmax= volmax*10        ;c'est validé, valeur en décilitres
    conso = 0                ;RAZ de la conso
    write 0,word conso,word volmax    ;Sauvegarde des valeurs en EEPROM
    do loop while pous=0            ;Dès que l'on relache,
  goto debut                        ;ça repart
    
;******** Sous programme affichage *************************
  ;Format du registre sur 16 bits:
;|------------------------------w13------------------------------|                                                               |
;|-----------b27-----------------|------------b26 ---------------|
;|-X-|-X-|-X-|-X-|--ADRESSE------|----------DONNEES--------------|   
;|D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|
;Ex: chiffre 5 dans digit 2
;|-X-|-X-|-X-|-X-| 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
;La broche DIN va prendre successivementla valeur de chaque bit de w13, scanné de gauchee à droire
shiftt:
    for cpt=1 to 16            ;test des 16 bits de w13
        w12=w13 & $8000        ;w13 = b27,b26 & %1000 0000 0000 0000: on ne garde que le 1er bit à gauche de w12   
        low DIN                ; broche DIN à 0 à priori
        if w12=0 then saut     ;w12 contient la valeur (0 ou 1) à transmettre
        high DIN            ;;on ne passe ici que si w12 <> 0, alors DIN =1 (évidemment)
saut:    pulsout CLK,1     ; envoi 1 pulse (1/4 de ms) horloge pour valider DIN
w13=w13*2             ; on décale w13 vers la gauche pour examiner le bit suivant
    next cpt
      pulsout LOAD,1    ;chargement du registre terminé, un pulse sur load valide le registre (commande ou affichage)
      return

 Voir suite page 2, l'affichage sur LCD




:
 


 



Créer un site
Créer un site