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
 
 

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

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 capteurs: DHT11, DHT21, DHT22

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.

 

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

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: 
A part les mocs et les triacs, tout est là.
Ces mocs et ces triacs peuvent être avantageusement remplacés par des relais statics sharp type S216S02 ou S208S02, ces derniers ne sont pas beaucoup plus chers.

Ici, les mesures sont:

Humidité relative = 49 %
Température       = 24 °C

Les consignes:

Humidité reletive =60 %
Température       =21 °C

Conséquence:
Trop chaud et  trop sec sont allumés



clim DHT11



Le typon:

Régulateur clim


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.0 à B.5 en sorties


'***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 (comparez avec un étalon)***
'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

Afficher la suite de cette page



Créer un site
Créer un site