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