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

 

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

 

Afficher la suite de cette page



Créé avec Créer un site
Créer un site