Electromag1 Circuits électroniques et Picaxes

Petit site pour ceux qui bricolent en électronique en général et sur les PICAXES en particulier.
Les PICAXES sont des microprocesseurs (PIC de Microship) programmables en BASIC. Pleins de qualités, pas chers, ultra faciles à programmer.
Tout (ou presque) est sur le site du distributeur Gotronic (voir les liens).
Les pages  seront ajoutées ou modifiées petit à petit.
Dans le but d'améliorer ce blog, communiquez moi vos remarques et les erreurs que vous pouvez constater.
Pour me contacter: Envoyez un mail à l'adresse : mag1mic@free.fr .  Tout message reçoit une réponse
Pour retourner au menu, Cliquer sur "LISTE DES PAGES", ici ou en haut de la colonne de gauche
Pour laisser un message, allez dans le "LIVRE D'OR"
Bonne visite
 
 

Mesure et régulation d'humidité et de température

DHT22 ou DHT11 ET PICAXE 20X2

Pour les mesures de température et d'humidité, voir les pages sur les capteurs de type SI7021, ou SHT30 mieux adaptés aux picaxes.
 

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.

Ex00000001 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.

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.

 

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



Créer un site
Créer un site