MESURE ET RÉGULATION D'HUMIDITÉ ET DE TEMPÉRATURE
MESURE ET RÉGULATION D'HUMIDITÉ ET DE TEMPÉRATURE
DHT22 ou DHT11 ET PICAXE 20X2
Les DHT22 sont les grands frères des DHT11. Ils utilisent le même protocole one wire. Les signaux doivent être traités de la même façon pour être lu par un picaxe 20X2.
La même carte peut donc servir pour les deux composants.
Toutefois, il faut différencier le traitement logiciel des données:
Ces composants codent l'humidité sur deux octets un premier pour la "partie entière" et un second pour la "partie décimale" idem pour la température soient quatre octets, un cinquième octet "check sum" est la somme des quatre octets précédents.
Le DHT11, avec des résolutions en température de 1°C et de 1% en humidité relative, n'utilise que les parties entières (octets 1 et 3), les parties décimales (octets 2 et 4) sont toujours à 0.
Le DHT22 code différemment, les deux octets de chaque variable forment un mot de 16 bit donnant la valeur de la variable en dixièmes.
Pour la température, premier bit de la séquence à 1 indique une valeur négative.
Ex: 00000001 01100100 = 356 soit 35,6 °C
10000001 01100100 = - 35,6 °C
Voir cette page pour complément d'information.
Il y a donc le choix entre:
le DHT11 que l'on trouve à environ 2 euros, limité aux températures positives et à faible résolution.
Et le DHT22, un peu plus cher, plus précis, plus universel.
Il demande un logiciel traitant les valeurs négatives pour les affichages et pour le traitement de la régulation.
Le schéma est le même pour DHT11 ou DHT22
(Cliquez sur le dessin pour agrandir)
trop froid est allumé
|
consignes HR et T° au maximum trop froid et trop sec sont allumés |
consignes HR et T° au minimum trop chaud et trop humide sont allumés |
Là, y a une >>ERREUR<< Pourquoi? |
La plage de consigne va de -30,0 à +72,3, c'est large.
Cette plage peut être réduite en fonction des besoins pour un réglage plus confortable.
Voici aussi un typon, tout est sur le circuit.
Ouvrir le fichier .tci avec le logiciel TCI 4.3
Le programme: maj 08/11/2011
Le fichier .bas est dans le .zip tétéchargeable ICI
' ' DHT22 et picaxe 20X2 AVEC check sum
' MM 26/10/2011
'****************************************************************
'MESURE ET RÉGULATION D'HUMIDITÉ ET DE TEMPÉRATURE
'MESURE HUMIDIÉ DE 0 à 100% - TEMPÉRATURE DE -40 à 80 °C
'RÉGLAGE DES CONSIGNES PAR POTENTIOMÈTRES
'HUMIDITÉ DE 0 à 99% - TEMPÉRATURE DE -30 à 72,3 °C
'AFFICHAGE DE CES VALEURS SUR LCD 2x16 (HD44780 - 1602)
'****************************************************************
#picaxe 20X2 'directive modèle picaxe
setfreq m32 'fréquence horloge
dirsB=%111111 'défini les I/O ports B
'*****Données d'initialisation de l'afficheur Type HD44780 ***********
'*****Pour l'affichage, on utilise les ports BO à B5 du 20X2********
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 RSCMDmask = %00000000 ; Select Command register
SYMBOL RSDATmask = %00000001 ; Select Data register
SYMBOL cpt = b1
SYMBOL car = b2
SYMBOL rsbit = b3
'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 SendInitCmdByte
next
'********** DEBUT PROGRAMME PERSO ************
'Texte sur l'afficheurs
DATA 10,("HR%=")
DATA 16,(" C:")
DATA 22,("Tß=") 'ß=Alt+0223 donne "°" sur afficheur
DATA 28,(" >>ERREUR<<")
' Nomination des variables et ports
symbol DHT=C.6 'lecture DHT22
Symbol STT=C.0 'impulsion start DHT22
symbol HRE=b10 'HR partie entière
symbol HRD=b11 'HR partie décimale
symbol TPE=b12 'Temp partie entière
symbol TPD=b13 'Temp partie décimale
symbol NEGT=b14 'Temp négative (bitpoids fort=1)
symbol NEGCT=b15 'Temp consigne négative
symbol bit_num=b16 'n° lecture bit DHT22
symbol diz=b17 'dizaine affichage
symbol unit=b18 'unité affichage
symbol deci=b19 'décimale affichage
symbol CHK=b20 'octet check sum
symbol total=b21 'total 4 premiers octets
symbol cor=b22 'correction calibration
symbol limit=w18
symbol TPC=w19 'Consigne TP (0 à 1023)
symbol CHR=w20 'Consigne humidité de 0 à 1000
symbol CTP=w21 'Affichage consigne (300 négatif à 723 positif)
symbol HR=w22 'total HR DHT22
symbol TP=w23 'total TP DHT22
symbol val=w24 'val ascii affichée
'*******************************************
debut:
gosub dht22
gosub calib
gosub consigne
gosub lcd
gosub regul
wait 5
goto debut
'************************************************************
dht22:
setfreq m64
ptr=0 'scrachpad 20X2
high STT
pulsout STT,32000 'Signal start \_/ >18ms
'64MHz 0.625us unit ->20ms ->32000
pulsin DHT,0,@ptrinc 'réponse DHT \_/ 80µs puis /¨\ 80µs
'En fait, on attend le 1er bit de donnée
'****** Enregistrement des 40 bits data dans le scratchpad ***
'*******HR 1à 8 + 9 à 16 T° 17 à 24 + 25 à 32 CHK 33 à 40
pulsin DHT,0,@ptrinc 'HR 1
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc 'HR 8
pulsin DHT,0,@ptrinc 'HR 9
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc 'fin HR 16
pulsin DHT,0,@ptrinc 'T 17
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc 'T 24
pulsin DHT,0,@ptrinc 'T 25
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc 'fin T 32
pulsin DHT,0,@ptrinc 'check 33
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc
pulsin DHT,0,@ptrinc 'fin check 40
'****** Restitution des 5 octets HRE, HRD, PTE, TPD et CHK *******
HRE=0 'octet "entier" HR
for ptr = 1 to 8 'lecture bit 1 à 8
bit_num = 8 - ptr 'position bit dans octet
if @ptr > 60 then
setbit HRE,bit_num 'bit long=1
endif
next
HRD=0 'octet "décimal" HR
for ptr = 9 to 16 'lecture bit 1 à 8
bit_num = 16 - ptr 'position bit dans octet
if @ptr > 60 then
setbit HRD,bit_num 'bit long=1
endif
next
TPE=0 'octet "entier" Température
for ptr=17 to 24 '3ème octet
bit_num = 24 - ptr 'lecture bit 1 à 16
if @ptr > 60 then '
setbit TPE,bit_num
endif
next
NEGT=TPE/128 'mémo bit n°1 "0"=T positive "1"=T négative
TPD=0 'octet "décimal" Température
for ptr=25 to 32 '4ème octet
bit_num = 32 - ptr 'lecture bit 1 à 16
if @ptr > 60 then
setbit TPD,bit_num
endif
next
CHK=0
for ptr= 33 to 40
bit_num = 40 - ptr 'Bit# 7 - 0 for Check sum
if @ptr > 60 then 'set bit(x) to 1
setbit CHK,bit_num
endif
next
'****Vérification du checksum ***********
total=HRE+HRD+TPE+TPD
if CHK <> total OR total=0 then erreur
low A.0 'pas d'alarme
'****Reconstitution des valeurs humidité et température
HR=HRE*256+HRD 'reconstitution valeur totale
if NEGT=1 then :clearbit TPE,7:endif 'suppression du 1er bit nuisible
TP=TPE*256+TPD 'reconstitution valeur totale
return
'*** Correction d'erreur de calibration si nécessaire ********
Calib:
'*******température***********
If NEGT=0 then
TP=TP+400
else
TP=400-TP
endif
TP=TP-12 'correction de température: -1,2°C (ajustez suivant sonde)
If TP>=400 then
TP=TP-400
else
TP=400-TP
NEGT=1
endif
'*********hygromérie*****************
HR=HR-100 'correction hygrométrie: - 10% (ajustez suivant sonde)
if HR>2000 then :HR=0:endif
return
'**Lecture des consignes*********************
consigne:
readadc10 C.1,TPC 'nombre de 0 à 1023
CTP=TPC-300
'les valeurs en dessous de 300 sont "négatives"
' et prennent les valeurs de 724 à 1023
' la plage de consigne va de -30,0 à +72,3 °C
if CTP>723 then
NEGCT=1 'c'est un nombre négatif
CTP=-CTP 'valeur d'affichage
else
NEGCT=0 'nombre positif
end if
readadc C.7,CHR 'lecture consigne humidité
CHR=99*CHR/255*10
return
'****** Ecriture sur l'afficheur LCD ******
lcd:
setfreq m32 'retour 32MHz pour affichage
gosub ligne1
val=HR
gosub decoupe
gosub ecrit
for cpt=16 to 18
read cpt,car
gosub SendDataByte
next
val=CHR
gosub decoupe
gosub ecrit
gosub ligne2
if NEGT=1 then
car="-"
else car=" "
endif
gosub SendDataByte
val=TP
gosub decoupe
gosub ecrit
for cpt=16 to 18
read cpt,car
gosub SendDataByte
next
if NEGCT=1 then
car="-"
else car=" "
endif
gosub SendDataByte
val=CTP
gosub decoupe
gosub ecrit
return
'************* Plages de régulation: *****************
'**************Humidité : + ou - 2 % ***************
'**************Température + ou - 1 °C ***************
regul:
limit=CHR+20
if HR>limit then: high C.2:else low C.2:end if 'trop humide
limit=CHR-20 :if limit>2000 then: limit=0:endif'suppression des valeurs <0
if HR<limit then: high C.3:else low C.3:end if 'trop sec
if NEGT=1 then 'mise à l'échelle des temp lues DHT22
TP=300-TP 'en fonction de la consignes (0 à 1023)
else 'pour temp négatives
TP=300+TP 'et positives
endif
limit=TPC+10
if TP>limit then: high C.4:else low C.4:end if 'trop chaud
limit=TPC-10 :if limit>2000 then: limit=0:endif'suppression des valeurs <0
if TP<limit then: high C.5:else low C.5:end if 'trop froid
return
'***************************************************
ligne1: 'position du curceur ligne 1 et écriture du label
car= $80 | $00 'curseur début ligne1
gosub SendCmdByte
for cpt = 10 to 13 'lecture texte ligne1
read cpt,car
gosub SendDataByte
next
return
'************************************************
ligne2: 'position du curceur ligne 2 et écriture du label
car= $80 | $40 'curseur début ligne2
gosub SendCmdByte
for cpt =22 TO 24 'lecture texte ligne2
read cpt,car
gosub SendDataByte
next
return
'************************************************
decoupe: 'decoupage du nombre en caractères et conversion ascii (+48)
diz=val/100+48
deci=val//10+48
val=val//100
unit=val/10+48
return
'******************************************
ecrit: 'on écrit de gauche à droite
car=Diz 'affichage dizaines
gosub SendDataByte
car=Unit 'affichage unités
gosub SendDataByte
car=","
gosub SendDataByte
car=deci
gosub SendDataByte
return
'******************************************************
efface:
read 5,car 'effacement écran
gosub SendInitCmdByte
return
'************** Gestion erreur **************
erreur:
high A.0 'alarme ON
gosub efface
car= $80 | $00 'curseur début ligne1
gosub SendCmdByte
for cpt = 28 TO 39 'lecture texte >>ERREUR<<
read cpt,car
gosub SendDataByte
next
LOW C.2:LOW C.3:LOW C.4:LOW C.5: LOW B.7
wait 5
goto debut
'****************** FIN PROGRAMME PERSO **************
'Sous programmes d'écriture sur le LCD
SendInitCmdByte:
PAUSE 60 ; Delay
SendCmdByte:
rsbit = RSCMDmask ; Send to Command register
SendDataByte:
pinsB = car & $F0 / 4 | rsbit ; Put MSB out first
PULSOUT E,1 ; Give a pulse on E
pinsB = car & $0F * 4 | rsbit ; Put LSB out second
PULSOUT E,1 ; Give a pulse on E
rsbit = RSDATmask ; Send to Data register next
RETURN