Les capteurs de température et humidité
GY-21 et SI7021
Ces capteurs que l'on peut acheter pour quelque 2 euros sur eBay sont équipés du SI7021 (ou HTU21 suivant distributeurs), petite puce d'environ 4 mm², recouverte ou pas d'une pellicule de protection. La plaquette GY-21 intègre un régulateur 5V/3,3V et les résistances de pullup de 10k de la liaison I2C
DATASHEET du HTU21:
Le but de cette page est d'utiliser ces capteurs avec un picaxe.
L'adresse (unique) du capteur I2C est $40. Oui, mais la commande picaxe demande une adresse sur 8 bits, il faut ajouter le bit R/W, on obtient $80
La datasheet indique qu'il faut envoyer un octet de commande pour déclencher la lecture des paramètres:
Les codes qui fonctionnent avec notre picaxe sont $E3 et $E5.
Et après la commande, que reçoit-on?
Le contenu d'un registre de 16 bits, sous la forme de deux octets, qui formeront automatiquement un "word", c'est à dire un nombre entre 0 et 65535.
Et qu'est ce qu'on en fait? Et bien on applique les formules données dans les DS.
T
emp_Code et
RH_code sont les nombres lus dans le registre.
Pour la température:

Pour l'humidité:

Pour un picaxe qui ne connait que les nombres entiers de 0 à 65535 et les divisions euclidiennes la faisabilité n'apparait pas immédiatement, heureusement le forum picaxe anglais et hippy en particulier m'ont soufflé la solution:
Pour la température: La résolution est le 1/100 de degré. La fonction proposée pour transformer Temp_code est la suivante:
Température (°C)= 17572**Temp_code-4685
On obtient immédiatement la t° en centièmes de degrés.
Explication: "Bon sang, mais c'est bien sûr..."
Temp_code et 17572 sont deux variables "word" de 16 bits. Leur multiplication donne un "double word" de 32 bits.
L'opérateur ** renvoie un mot de 16 bits contenant le "word" de poids fort, l'opérateur * le word de poids faible.
Ne prendre en compte que le word de poids fort (sans le poids faible) revient à diviser le résultat de la multiplication par 65536.
Pour l'humidité:
La formule est la même que pour la température, avec des coefficients différents:
%RH=12500**RH_code-600
Le capteur d'humidité est très réactif, il suffit d'approcher le doigt, surtout quand il fait chaud.
Le résultat:
Le nombre sur les lignes 1 et 3 est la valeur du mot de 16 bits lu sur le capteur pour la température et l'humidité
Faisait chaud.....
Le schéma: Pas très compliqué...Un GY-21, un LCD série (
voir cette page) et un picaxe 08M2
Si vous préférez un afficheur LCD avec interface I2C,
c'est ici
Le lien soufflé par hippy sur le forum picaxe anglais concerne un cousin, le SHT31 Le code pour SI7021, inspiré du lien anglais:
Les températures deviennent négatives pour les valeurs de Temp_code inférieures à 17473. Un traitement spécifique permet d'afficher les valeurs négatives.
;essai GY-21 02/08/18
;RH(%)=(125*S/2**16)-6
;T(°C)=(175.72*S/2**16)-46,85
;LCD 2004
#picaxe 08M2
#no_data
symbol deci=b1 ;valeurs décimales
symbol signe=b2 ;signe négatif
symbol val=w12 ;valeur à afficher
pause 500
hi2csetup i2cmaster,$80,i2cfast,i2cbyte
serout C.0, T2400,(254,1,254,1)
pause 500
serout C.0, T2400,(254,192,"Temp= ßC",254,212,"Humi= %")
pause 500
do
hi2cout ($E3) ;température
hi2cin (b27,b26) ;(b27,b26) c'est w13
serout C.0, T2400,(254,128,#w13," ") ;affichage w13 première ligne
signe=" " ;pas de signe, à priori
val=w13**17572-4685
if w13 <= 17473 then ;on est dans les valeurs négatives
val=-val ;inversion argument = complément à 2
signe="-" ;affichage signe -
endif
deci=val//100 ;partie décimale
val=val/100 ;partie entière
serout C.0, T2400,(254,198,signe,#val,",",#deci," ") ;affichage t° LCD; ligne 2
pause 500
hi2cout ($E5) ;humidité
hi2cin (b27,b26) ;lecture registre
serout C.0, T2400,(254,148,#w13," ") ;affichage w13 ; ligne 3
val=w13**12500-600
deci=val//100 ;partie décimale
val=val/100 ;partie entière
serout C.0, T2400,(254,219,#val,",",#deci," ") ;affichage % HR ligne 4
pause 500
loop