![]() | ![]() | ![]() |
débimète à | 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
; 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