Mesure tempérarure et humidité
GY-21 et LCD1602 I2C avec picaxe 08M2
Cette page est une alternative à l'utilisation du capteur I2C GY-21 déjà traité avec
un afficheur LCD série. L'afficheur utilse ici une
interface I2C à bas cout. Le GY-21 et le LCD I2C utilisent les mêmes broches dédiées à l'I2C du picaxe 08M2. Restent donc 3 broches libres pour d'autres extensions.
Le schéma:
Le résultat:
Le code:
;essai GY-21 08/08/18
;RH(%)=(125*S/2**16)-6
;T(°C)=(175.72*S/2**16)-46,85
;LCD 1602 I2C
#picaxe 08M2
symbol rsbit=bit0
symbol deci=b1 ;valeurs décimales
symbol sign=b2
symbol cpt=b3 ;compteur
symbol car=b4
symbol dat=b5
symbol mil=b6
symbol cen=b7
symbol unit=b8
symbol decim=b9
symbol centi=b10
symbol virg=b11
;w13= (b27,b26) lecture registre SI7021
symbol tempe=w12 ;valeur à afficher
symbol HR=w11
virg=","
setfreq M16
pause 500
;**** macro affichage texte ****************
#macro text(posi,deb,fin)
car=posi:gosub EnvoiByteComm ;position curseur
for cpt=deb to fin
read cpt,car ;texte
gosub EnvoiBytedata
next
#endmacro
;**** Initialisation LCD I2C .*************
hi2csetup i2cmaster,%01001110, i2cfast_16, i2cbyte
;** Entrée des données texte en "data" ***********
data 0,(51,50,40,12,6) ;initialisation LCD 4 bits
data $10,("Tempe= ßC")
data $20,("Humid= % ")
;***** Initialisation LCD *********
for cpt=0 to 4
read cpt,car
gosub EnvoiByteCommInit
next
;**** affichage texte fixe ****************
car=1:gosub EnvoiByteComm ;raz afficheur
text(128,$10,$1F)
text(192,$20,$2F)
;**** boucle principale ************************************
do
hi2csetup i2cmaster,$80,i2cfast_16,i2cbyte
hi2cout ($E3) ;température
hi2cin (b27,b26) ;(b27,b26) c'est w13
sign=" " ;pas de signe, à priori
tempe=w13**17575-4685 ;valeur mémorisée dans tempe
if w13<=17473 then ;on est dans les valeurs négatives
tempe=-tempe ;idem complément à 2
sign="-"
endif
pause 1000
hi2cout ($E5) ;humidité
hi2cin (b27,b26)
HR=w13**12500-600 ;valeur mémorisée dans H
pause 1000
gosub affich ;vers affichage
loop
;***** sub affichage *****************************
affich:
hi2csetup i2cmaster,%01001110, i2cfast_16, i2cbyte
car=134:gosub EnvoiByteComm ;position curseur
bintoascii tempe,mil,cen,unit,decim,centi ;décomposition en chiffres ascii
for cpt=0 to 6
lookup cpt,(sign,mil,cen,unit,virg,decim,centi),car
gosub EnvoiByteData
next
car=199 :gosub EnvoiByteComm ;position curseur
bintoascii HR,mil,cen,unit,decim,centi
for cpt=0 to 5
lookup cpt,(mil,cen,unit,virg,decim,centi),car
gosub EnvoiByteData
next
return
;***** Sub envoi LCD via I2C *************
EnvoiByteCommInit: ;sans la pause , ça fonctionne aussi
pause 15
EnvoiByteComm:
rsbit=0 ;val de la broche RS du LCD pour une commande
EnvoiBytedata:
;1ère moitié
dat=car & $F0 | %1000 | rsbit ;%1000 pour l'éclairage
hi2cout (dat)
pause 2
dat=dat | %1100
hi2cout (dat) ;pulse sur E cad P2
pause 2 ;pause 2 pour 32 MHz
dat=dat | %1000 ;fin pulse
hi2cout (dat)
pause 2
;2ème moitié
dat=car & $0F * 16 | %1000 | rsbit
hi2cout (dat)
pause 2
dat=dat | %1100
hi2cout (dat)
pause 2
dat=dat | %1000 & %1011
hi2cout (dat)
rsbit=1
return