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

Mesures d'humidité et de température DHT11,DHT22 et PICAXE X2

Mesure d'humidité et de température par capteur DHT11, DHT21 et DHT22

Centrale de contrôles d'humidité et de température pour climatiseur, serre, VMC...

 

Retrouvez cette page
et toutes les mises à jour
sur

http://electromag1.wifeo.com/ 

 

 

Ces capteurs sont décodables par un picaxe de la série X2. Voir l'étude sur cette page.

 

Ces trois modèles utilisent le même protocole propriétaire One Wire .

 

Voici le tableau des caractéristiques:  

 

 

  DHT11 DHT21 DHT22
HR       20 à 80 %   0 à 100 % 0 à 100 %
  résolution HR   1%   0,1%   0.1%
précision HR 5 % 3 %  2  %
T   0 à 50 °C   -40 à 80 °C      -40 à 80 °C
  résolution T   1 °C   0.1°C   0.1°C
précision T +/- 2°C +/- 1 °C +/- 0.5 °C

 

 

 

Voir cette page, "Mesure et régulation d'humidité et température à  DHT22

 

 

Les DHT11 sont une alternative aux H25R5A (voir la page sur ce blog).

Ils regroupent un capteur d'humidité capacitif et un capteur de température.

 

Leur coût est également très faible, on en trouve à moins de 2 euros pièce sur eBay.

 

Après une commande de deux individus qui a tardé à arriver et une autre de quatre livrée en une quinzaine de jour, je suis l'heureux possesseur de 6 DHT11. J'ai donc pu les comparer à une référence:

  • Deux sont dans les spécifications
  • Trois indiquent entre - 4 à - 8 % d'humidité
  • Un indique - 8 % d'humidité et + 4 °C de température

C'est capteurs sont probablement triés en fonction du respect des spécifications et ceux à  2 euros ne sont pas dans le peloton de tête.

Mais ces écarts sont faciles à corriger (par soft) et le plus "anormal" retrouve un comportement standard.

 

 

Je vous propose une petite application associant ce capteur à un afficheur LCD 1602 , lui aussi à quelques euros sur eBay (j'en ai même vu à moins de 3 euros, port gratuit, c'est fou)

 

ou chez votre fournisseur favori.

 

Le picaxe est un 20X2 permettant de lire les données du DHT11 à 64MHz. 

 

Cahier des charges:

 

Mesurer l'hygrométrie

Mesurer la température

Fixer des valeurs de consigne d'humidité et de température (potentiomètres).

Afficher les mesures et les consignes

Agir sur quatre périphériques différents en fonction des écarts constatés: trop chaud, trop froid, trop sec, trop humide.

  

Le schéma proposé: (cliquez sur le dessin pour agrandir) 

 

 

    Climat DHT11 DHT2 20X2

 

 

La maquette: à part les mocs et les triacs, tout est là.

Trop chaud, trop sec.

 

 

  clim DHT11

 

 

 

  Le programme:

 

Il est adapté au DHT11, données sur 1 octet, sans partie décimale.

Les DHT21 et 22 demandent une adaptation pour lire les données sur 2 octets et positionner la virgule. Il faut aussi traiter le bit n°1 de la température pour les valeurs négatives. Voir cette page

     

 

Le .bas est en téléchargement ICI

A ouvrir  dans le Picaxe Programming Editor ou dans le bloc note.

 

Voici (presque) le même ci dessous , sans tabulations.

  

 

  ' DHT11 et picaxe 20X2 AVEC check sum
 ' MM 26/09/2011
 
  
 #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 ************

 DATA 10,("HR(%)=")
 DATA 16,(" Cgne:")    'Texte sur l'afficheur ligne1
 DATA 22,("T(")
 DATA 24,("C)=")
     'Texte sur l'afficheur ligne2
 DATA 28,(">ERREUR<")
 
' Nomination des variables et ports

 symbol DHT=C.6
 Symbol STT=C.0
 
 symbol diz=b17
 symbol unit=b18
 
 symbol HR=b20
 symbol TP=b21
 symbol val=b22
 symbol CHK=b25
 symbol total=b23
 symbol bit_num=b24
 
 symbol CHR=w20
 symbol CTP=w21
'*******************************************  
debut:
 setfreq m64
 
 ptr=60 'scrachpad 20X2 voir doc

 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 longueurs des 40 bits data dans le scratchpad '*******HR 61à 68 + 69 à 76   T° 77 à 84 + 85 à 92  CHK 93 à 100 
 
 
 pulsin DHT,0,@ptrinc 'HR 61
 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 
 
 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 
 pulsin DHT,0,@ptrinc 'fin HR
 
 pulsin DHT,0,@ptrinc 'T
 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 
  
 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
 pulsin DHT,0,@ptrinc 'fin T
 
 pulsin DHT,0,@ptrinc 'check 
 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


       

 setfreq m32

 

'********* Leture des consignes ********


  readadc C.1,CTP    'Consigne Température
 CTP=50*CTP/255   'de 0 à 50°C
 readadc C.7,CHR   'Consigne humidité 

CHR=80*CHR/255+10    'de 10 à 90 %

 


   
 '****** Restitution des 8 bits de HR , T° et check*******

HR=0              'tous les bits à 0
 for ptr = 61 to 68          'lecture du 1er octet

bit_num = 68 - ptr         'position du bit dans l'octet
  if @ptr > 60 then     'bit long ou court   
   setbit HR,bit_num   'si bit long, bit correspondant=1
  endif
 next
 
 TP=0
 for ptr=77 to 84        '3ème octet
  bit_num = 84 - ptr          'Bit# 7 - 0 for Temperature
  if @ptr > 60 then            'set  bit(x) to 1
   setbit TP,bit_num
  endif
 next 
 
 CHK=0
 for ptr= 93 to 100
  bit_num = 100 - ptr          'Bit# 7 - 0 for Check sum
  if @ptr > 60 then            'set  bit(x) to 1
   setbit CHK,bit_num
  endif
 next
 
 total=HR+TP
 if CHK <> total OR total=0 then erreur
  
 '***** Correction d'erreur de lecture si nécessaire ********
 'TP=TP-2
 'HR=HR+6
 '***********************************************
 
 gosub ligne1
 val=HR
 gosub decoupe
 gosub ecrit
 for cpt=16 to 21
  READ cpt,car
  GOSUB SendDataByte
 NEXT
 val=CHR
 gosub decoupe
 gosub ecrit  
 
 
 
 gosub ligne2
 val=TP
 gosub decoupe
 gosub ecrit
  for cpt=16 to 21
  READ cpt,car
  GOSUB SendDataByte
 NEXT
 val=CTP
 gosub decoupe
 gosub ecrit
 
'******** Plages de régulation *****************
'*********Humidité : + ou - 2 % ***************
'*********Température + ou - 1 °C ***************
  
 if HR=CHR then: low C.2:low C.3: end if
  
 CHR=CHR+2
 if HR>CHR then: high C.2:end if 'trop humide 
 CHR=CHR-4
 if HR<CHR then: high C.3:end if 'trop sec
 
 if TP=CTP then: low C.4: low C.5:endif
 
 CTP=CTP+1 
 if TP>CTP then: high C.4:end if 'trop chaud
 CTP=CTP-2
 if TP<CTP then: high C.5:end if 'trop froid
 wait 1
 goto debut

'***************************************** 
 
ligne1: 'position du curceur ligne 1 et écriture du label

 car= $80 | $00 'curseur début ligne1
 gosub SendCmdByte
   
 FOR cpt = 10 to 15 '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 23 'lecture texte ligne2
  READ cpt,car
  GOSUB SendDataByte
 NEXT
 car=$DF
 GOSUB SendDataByte
 FOR cpt =24 TO 26 'lecture texte ligne2
  READ cpt,car
  GOSUB SendDataByte
 NEXT
 return
'************************************************
decoupe:

 Diz=val/10+48
 Unit=val//10+48
 
 return
'******************************************
 
ecrit:  'on écrit de gauche à droite
 
 car=Diz  'affichage dizaines
 GOSUB SendDataByte
 
 car=Unit  'affichage unités
 GOSUB SendDataByte

 return
 
'******************************************************
 
efface:
 READ 5,car 'effacement écran
 GOSUB SendInitCmdByte
 return     
'************** Gestion erreur **************

erreur:
 gosub efface
 
  car= $80 | $00 'curseur début ligne1
 gosub SendCmdByte
   
 FOR cpt = 28 TO 35 'lecture texte ligne1
  READ cpt,car
  GOSUB SendDataByte
 NEXT
 wait 5
 goto debut

  
 '****** FIN PROGRAMME PERSO **************
 
'Sous programmes d'écriture du LCD
 
SendInitCmdByte:
 
 PAUSE 60                        ; Delay 15mS
 
SendCmdByte:
 
 rsbit = RSCMDmask               ; Send to Command register
 
SendDataByte:
 
 pinsB = car & $F0 / 4 | rsbit   ; Put MSB out first
  PULSOUT E,1                     ; Give a 10uS pulse on E
 
 pinsB = car & $0F * 4 | rsbit   ; Put LSB out second
 PULSOUT E,1                     ; Give a 10uS pulse on E
  
 rsbit = RSDATmask               ; Send to Data register next
 
 RETURN

 

 

     



Partager cette page

Repost 0
Pour être informé des derniers articles, inscrivez vous :