;pour 14M2:sda sur B.4 ; scl sur B.3
#picaxe 14M2 ;directive picaxe utilisé
dirsB =%000111
setfreq M16 ;fréquence 16MHz
;****** Nominations constantes ********
symbol baud= N2400_16 ;vitesse liaison RS232
symbol cycle =5 ; temps du cycle à partir du coucher du soleil (8hrs)
symbol Ligne1 =128 ; ligne 1, colonne 1
symbol Ligne2 =192 ; ligne 2, colonne 1
symbol Ligne3 =148 ; ligne 3, colonne 1
symbol Ligne4 =212 ; ligne 4, colonne 1
;******* noms variables bit sur b0 ***********
symbol rsbit=bit0 ;bit commande/data afficheur
symbol calibr=bit1 ;memo phase calibration
;***** noms variables bytes ****************
; b1,b2,b3,b4,b5 utilisés dans bintoascii
symbol posi =b6 ; position curseur
symbol car =b7 ; caractère à afficher
symbol dat =b8 ; utilisé dans la sous routine "EnvoiByteData"
symbol cpt =b9 ; compteur
;****** noms variables word *********
symbol etalon =w13 ; diviseur d'impulsion pour avoir 0.1 litre
symbol total =w12 ; consommation total depuis le dernier reset
symbol today =w11 ; consommation journalière ou douche
symbol mini =w10 ; consommation miminum depuis dernier reset
symbol maxi =w9 ; consommation miminum depuis dernier reset
symbol impulsions =w8 ; impulsion du bébitmètre
;******* Nominations ports ***********
symbol calibration =pinC.4 ; poussoir de calibration et de reset des valeurs enregistrées
symbol remise_0 =pinC.3 ; poussoir de remise à zéro des données
symbol PV =pinC.2 ; Entrée des panneaux solaires pour déclanchement du compteur de cycle
symbol ledROUGE = B.0 ; Sortie DEL rouge
symbol ledJAUNE = B.1 ; Sortie DEL jaune
symbol ledVERTE = B.2 ; Sortie DEL verte
#macro EnvoiLCD(Ligne,Texte)
car= Ligne
gosub EnvoiByteComm
for cpt=0 to 19
lookup cpt,(Texte),car
GOSUB EnvoiByteData
next
#endmacro
#macro VolumeLCD(Nbre,t5,t4,t3)
bintoascii Nbre,b5,b4,b3,b2,b1
for cpt=0 to 8
lookup cpt,(t5,t4,t3,b2,",",b1," L"),car
GOSUB EnvoiByteData
next
#endmacro
#macro NombreLCD(Ligne,Nbre)
car= Ligne+16 ' colonne 16
gosub EnvoiByteComm
bintoascii Nbre,b5,b4,b3,b2,b1
for cpt=0 to 3
lookup cpt,(b4,b3,b2,b1),car ;on a besoin que de 4 chiffres
GOSUB EnvoiByteData
next
#endmacro
; Initialisation I2C . pour 14M2:sda sur B.4 ; scl sur B.3
hi2csetup i2cmaster,%01001110, i2cfast_16, i2cbyte
; Initialisation LCD *********
for cpt=0 to 5
lookup cpt,($33,$32,$28,$c,$6,$01),car
gosub EnvoiByteCommInit
next
pause 100 ; temps init du LCD
if pinC.0 = 0 then ; armer l'interruption sur le bon niveau selon l'état du débitmètre
setint %01,%01 ; interruption niveau 1 sur C.0
else setint %00,%01 ; interruption niveau 0 sur C.0
endif
; lecteur des données en mémoire
read 0, word mini, word maxi, word total, word today, word etalon ; lecture de données enregistrées
if etalon =0 or calibration =0 then : gosub calib ; Afficher texte de calibration
endif ; pour forcer une calibration à la mise sous tension
main:
low ledVERTE
low ledJAUNE
low ledROUGE
disabletime ; Pour empêcher l'horloge de tourner et démarrer la fonction d'enregistrement des records
if mini =0 then
mini =10000 ; Nécessaire au démarrage sinon la valeur MIN sera toujours = à 0
endif
gosub AfficheInitial
gosub AfficheRecord
;boucle de comptage
do
if PV =0 then ; déclanche le timer au couché du soleil.
enabletime
else disabletime : time =0
endif
if time = cycle then ; Enregistre le temps de la douche après "cycle" secondes d'inactivitées
gosub record ; cette routine enregistre les minimums et maximums
inc time
today =0 ; consommation quotidienne remise à 0.
endif
if remise_0=0 then ; pour remettre toutes les valeurs à zéro sauf pour mini qui doit être à 10000
time =0 : mini =10000 : maxi =0 : total =0 : today =0
disabletime ; Pour empêcher la sous routine "record" d'être appeler avant une nouvelle consommation d'eau
write 0, word mini, word maxi, word total, word today
gosub AfficheCourant
gosub AfficheRecord
endif
gosub AfficheCourant ; sous-routine de la consommation d'eau.
loop
; les sousroutines **********************
interrupt: ;comptage des impulsions du débitmètre
inc impulsions ; compte les impulsions à chaque interrupt
if impulsions >=etalon then ; etalon = noombre d'impulsions pour 0.1 L
inc today ; incrémente de 0.1 L consommation quotidienne
inc total ; incrémente de 0.1 L volume total consommé
impulsions =impulsions - etalon ; remet impulsions à 0 et conserve le reste s'il y a lieu
endif
if pinC.0 = 0 then ; armer l'interruption sur le bon niveau selon l'état du débitmètre
setint %01,%01 ; interruption niveau 1 sur C.0
else setint %0,%01 ; interruption niveau 0 sur C.0
endif
return
;calcule les minimums et maxiums
record:
low ledVERTE
low ledJAUNE
low ledROUGE
if mini > today then ; Si consommation de la douche est inférieur au record mini enregistré, enregistrez nouveau record.
mini= today
write 0, word mini
high ledVERTE
endif
if maxi < today then ; Si consommation de la douche est supérieur au record maxi enregistré, enregistrez nouveau record.
maxi=today
write 2, word maxi
high ledROUGE
endif
if mini < today AND maxi > today then
high ledJAUNE ; del JAUNE = consommation moyenne
endif
gosub AfficheRecord ; afficher les nouveaux résultats
return
; Affichage texte initial ***********************
AfficheInitial:
EnvoiLCD(Ligne1,"Conso Total en LITRE")
EnvoiLCD(Ligne2,"Conso Quotidienne L")
EnvoiLCD(Ligne3,"Maximum Enregistre L")
EnvoiLCD(Ligne4,"Minimum Enregistre L")
pause 6000
gosub AfficheCourant
gosub AfficheRecord
pause 6000
return
; Affichage les valeurs Total et douche courante lors du comptage en ajustant le nombre de chiffre selon le nombre
AfficheCourant:
car= 139 'curseur ligne 1, position 12
gosub EnvoiByteComm
if total> 999 then
VolumeLCD(total," ",b4,b3)
else if total> 99 then
VolumeLCD(total," "," ",b3)
else
VolumeLCD(total," "," "," ")
endif
car= 203 'curseur ligne 2, position 12
gosub EnvoiByteComm
if today> 99 then
VolumeLCD(today,". "," ",b3)
else
VolumeLCD(today,". "," "," ")
endif
write 4, word total, word today ; écriture des volumes consommés
return
; Affiche minimum et maximum***********************
; L'usage de la flèche ".>" permet d'indiquer à l'invité s'il s'agit d'un nouveau record.
AfficheRecord:
car= 159 'curseur ligne 3, position 12
gosub EnvoiByteComm
if maxi =0 or maxi > today then ;Condition de départ OU aucun record enregistré
VolumeLCD(maxi,". "," "," ")
else if maxi > 999 then
VolumeLCD(maxi,".>",b4,b3)
else if maxi> 99 then
VolumeLCD(maxi,".>"," ",b3)
else
VolumeLCD(maxi,".>"," "," ")
endif
car= 223 'curseur ligne 4, position 12
gosub EnvoiByteComm
if mini > 9999 or mini <> today then ;Condition de départ OU aucun record enregistré
VolumeLCD(mini,". "," "," ")
else if mini > 999 then
VolumeLCD(mini,".>",b4,b3)
else if mini> 99 then
VolumeLCD(mini,".>"," ",b3)
else
VolumeLCD(mini,".>"," "," ")
endif
return
calib: ; routine de calibration obligatoire. Le débitmètre utilisé est -12% plus bas que spécifié dans la doc du manufacturier.
EnvoiLCD(Ligne1,"Calibration requise ")
EnvoiLCD(Ligne2,"Ajoutez 1 litre d'O ")
EnvoiLCD(Ligne3,"Impulsions= ")
EnvoiLCD(Ligne4,"Etalon calcule= ")
pause 4000
etalon =0 : total =0 : today =0 ; valeur remise à zéro
do
NombreLCD(Ligne3,total)
loop until calibration=0 ; le poussoir enregistre la fin du cycle de comptage et calcule l'etalon. Il est sur C.4
etalon = total+5/10 ; le "+5" est pour compenser l'erreur d'arrondis des PICAXEs
Write 8, etalon
NombreLCD(Ligne4,etalon) ; pour voir la valeur de l'étalon une fois le calibrage terminé
pause 8000
time =0 : mini =10000 : maxi =0 : total =0 : today =0 : impulsions =0
return
; Sub envoi vers LCD via I2C ************* ; copié du programme des sondes capacitives de MGU.
EnvoiByteCommInit:
pause 15
EnvoiByteComm:
rsbit=0
EnvoiByteData:
;1ére moitié
dat=car & $F0 | %1000 | rsbit ;%1000 pour l'éclairage
hi2cout (dat)
pause 1
dat=dat | %1100
hi2cout (dat) ;pulse sur E cad P2
pause 1
dat=dat | %1000 & %1011 ;fin pulse
hi2cout (dat)
pause 1
;2éme moitié
dat=car & $0F * 16 | %1000 | rsbit
hi2cout (dat)
pause 1
dat=dat | %1100
hi2cout (dat)
pause 1
dat=dat | %1000 & %1011
hi2cout (dat)
rsbit=1
return