Mesure température et humidité par capteur SHT30
affichage sur LCD I2C
Les capteurs SHT30, SHT31, SHT35 ont
la même datasheet , les différences portent sur les tolérences.
Ce sont des cousins des SI7020,
voir cette page ou
celle-ci. Les différences:
Les paramètres des formules sont légèrement différents.
Deux adresses I2C possibles suivant la connexion sur la plaquette d'une pin AD à VDD ou VCC (0V ou 5V). Sur 7bits: $44 ou $45
Les adresses picaxes doivent être codées sur 8 bits, avec le bit R/W
7 bits | 8 bits | décimal |
$44 = %1000100 | %10001000 = $88 | 136 |
$45 = %1000101 | %10001010 = $8A | 138 |
Le code est celui fourni par le forum picaxe anglais, allégé pour ne garder que le stricte nécessaire. (Pas de controle CRC, de RAZ, etc). La fréquence horloge est laissée à 4MHz, c'est moins rapide, c'est tout.
Le code:
;essai SHT31 MM 18/08/2018
;LCD 1602 I2C
;SHT31 Connection Diagram
;
; V+ ----------.----.---.----.-------------- V+
; | .|. .|. |
; PICAXE-08M2 | | | | | | SHT31
; .---------. | |_| |_| | .-------.
; | V+ |--' | | `---| VIN |
; | SDA C.2 |-------^---|--------| SDA |
; | |--- | -| RST |
; | SCL C.1 |-----------^--------| SCL |
; | 0V |--. 2 x 4K7 .---| ADR |
; `---------' | Internal | -| ALR |
; | }---| GND |
; | | `-------'
; 0V ----------^-------------^-------------- 0V
#picaxe 08M2
Symbol SDA = C.2 ; I2C SDA
Symbol SCL = C.1 ; I2C SCK
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
symbol crc=b12
;w13= (b27,b26) lecture registre température SHT
symbol tempe=w11 ;valeur à afficher
symbol HR=w12 ;lecture registre HR
virg=","
pause 500 ;stabilistu=ion LCD
;**** 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
;******Entrée des données texte en EEPROM ***********
data 0,(51,50,40,12,6) ;initialisation LCD 4 bits
data $10,("Tempe= ßC")
data $20,("Humid= % ")
;**** Initialisation LCD I2C .*************
hi2csetup i2cmaster,%01001110, i2cslow, i2cbyte
for cpt=0 to 4
read cpt,car
gosub EnvoiByteCommInit
next
;**** affichage texte fixe ****************
car=1:gosub EnvoiByteComm ;raz afficheur
text(128,$10,$1F) ;macro texte
text(192,$20,$2F)
;**** boucle principale lecture SHT30 ************************************
do
hi2csetup i2cmaster,$88,i2cfast,i2cbyte ;adresse I2C SHT
HI2cOut ( $24, $00 ) ;SingleShot
Pause 50
hi2cin (b27,b26,b12,b25,b24,b12) ;(b27,b26) c'est w13, registre température
sign=" " ;pas de signe, à priori
tempe=w13**17500-4500 ;valeur mémorisée dans tempe
if w13<=16852 then ;on est dans les valeurs négatives
tempe=-tempe ;idem complément à 2
sign="-"
endif
pause 1000
HR=HR**10000 ;valeur mémorisée dans HR
pause 1000
gosub affich ;vers affichage
loop
;***** sub affichage *****************************
affich:
hi2csetup i2cmaster,$4E, i2cslow, i2cbyte ;adresse I2C LCD
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