Overblog
Editer la page Suivre ce blog Administration + Créer mon blog

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

 

Retrouvez cette page
et toutes les mises à jour
sur

 

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)

 

.Climat-DHT11-DHT2-20X2.png

 

 

DHT22 2  DHT22 3

 trop froid est allumé

 

 consignes HR et T° au maximum

trop froid et trop sec sont allumés 

 DHT22 4  DHT22 5

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

 

 

 

typon climatDHT11-22

 

 

 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  

 

Partager cette page
Repost0
Pour être informé des derniers articles, inscrivez vous :