Czujnik wilgotności i temperatury DHT11 DHT22


Czujniki DHT11 oraz DHT22 są to dwa czujniki cyfrowe mierzące zarówno temperaturę jak i wilgotność. Transmisja pomiędzy mikrokontrolerem a czujnikiem odbywa się za pomocą jednej żyły (podobnie jak w przypadku termometru DS18b20 i magistrali OneWire).

Parametry techniczne czujników DHT11 oraz DHT22 różnią się pomiędzy sobą. Dla ułatwienia dane zostały zaprezentowane w tabeli aby łatwiejsze było ich porównanie.

  DHT11 DHT22
zakres temperatur 0ºC do 50ºC -40ºC do 125ºC
dokładność pomiaru temperatury ±2.0ºC  ±0.5ºC 
zakres wilgotności 20% do 95% 0% do 100%
dokładność pomiaru wilgotności ±5% ±5%
czas pomiaru 1s 2s
pobór prądu w stanie czuwania 100-150uA 40-50uA
pobór prądu podczas pracy 0,5-2,5mA 1,0-1,5mA
napięcie zasilania 3-5,5V 3,3-6V

Obydwa czujniki posiadają 4 piny – 5V, Sygnał, NC(nieużywany) oraz GND. Rozmieszczenie pinów przedstawia poniższe rysunek.

Budowa obydwu czujników jest taka sama. Rozmieszczenie pinów połączeniowe także jest jednakowe. Sposób podpięcia obydwu czujników do arduino (DHT11 oraz DHT22) jest taki sam i został przedstawiony na schemacie poniżej.

Podłączenie czujników DHT11 i DHT22 do ArduinoMając „goły” czujnik do jego prawidłowego działania musimy zrobić dodatkowe połączenie pomiędzy sygnałem a zasilaniem. Bardzo często jednak mamy już ten czujnik na specjalnie przygotowanych płytkach. Przyglądając się jej dokładnie widać, iż jest ona wyposażona już w wymagany rezystor. W tym przypadku podpinamy tylko zasilanie (5V), masę (GND) oraz pin sygnałowy (DATA). Taki czujnik zamontowany już na płytce pokazany jest na zdjęciu poniżej.

Do działania czujnika potrzebna jest biblioteka do pobrania tutaj. Poniższy kod został uproszczony do maksimum – zajmuje kilka linijek i pozwala na pokazywanie temperatury oraz wilgotności na serial monitorze.

#include "DHT.h"
DHT dht;
void setup() 
   {
      Serial.begin(9600); 
      dht.setup(2);
   }
void loop() 
   {
      float humidity = dht.getHumidity();
      float temperature = dht.getTemperature();
      Serial.print("H:");
      Serial.print(humidity,1);         //wilgotność z jednym miejscem po przecinku
      Serial.print("%  T:");
      Serial.print(temperature,1);  //temperatura z jednym miejscem po przecinku
      Serial.println("c ");
      delay (1000);
   }

Czujnik DTH11 lub też DHT22 można w bardzo prosty sposób użyć do kontroli wilgotności oraz temperatury pod obudową (lub też w terrarium). Można za jego pomocą uruchamiać grzałkę / klapy / wentylator czy tez wyłączać oświetlenie.

Schemat połączeń jest został przedstawiony poniżej:

Jeśli chodzi o skrypt wygląda on następująco:

#include "DHT.h"
DHT dht;
int wilgotnoscD = 40;
int wilgotnoscG = 60;
int TemperaturaD = 25;
int TemperaturaG = 30;
int StycznikW = 3;
int StycznikT = 4;
int StanW = 0;
int StanT = 0;

void setup() 
   {
      Serial.begin(9600); 
      dht.setup(2);
      pinMode(StycznikW, OUTPUT); 
      pinMode(StycznikT, OUTPUT);
   }

void loop() 
   {
      float humidity = dht.getHumidity();
      float temperature = dht.getTemperature();
      Serial.print("H:");
      Serial.print(humidity,1);
      Serial.print("% T:");
      Serial.print(temperature,1);
      Serial.println("c ");
 
      if(humidity<wilgotnoscD)
         {
            StanW = 0;
         }
      else if(wilgotnoscG<humidity)
         {
            StanW = 1;
         }
      else
         {
         }
  
      if(StanW == 1)
         { 
            digitalWrite(StycznikW,HIGH);
            Serial.print("stycznik W     działa ");
         }
      else
         { 
            digitalWrite(StycznikW,LOW);
            Serial.print("stycznik W nie działa ");
         }
      if(temperature<TemperaturaD)
         {
            StanT = 0;
         }
      else if(TemperaturaG<temperature)
         {
            StanT = 1;
         }
      else
         {
         }
      if(StanT == 1)
         { 
            digitalWrite(StycznikT,HIGH);
            Serial.print("stycznik T     działa ");
         }
      else
         { 
            digitalWrite(StycznikT,LOW);
            Serial.print("stycznik T nie działa ");
         }
      Serial.println();
      delay (500);
   }

Zasada skryptu jest  prosta – zarówno w przypadku temperatury jak i wilgotności ustawione są dwie wartości – górna oraz dolna. Po przekroczeniu górnej wartości uruchomiony zostanie stycznik (a co za tym idzie wentylator). Będzie on działał do momentu osiągnięcia dolnej wartości. Po jej osiągnięciu stycznik zostanie wyłączony.

Sposób działania skryptu został omówiony na filmie poniżej.

Powyższy skrypt w połączeniu z poprzednimi przedstawionymi skryptami (temperatura, zegar, wyświetlacz) można dołożyć kolejny element do sterownika akwariowego.