DHT11, DHT22 hőmérséklet és páratartalom szenzor

A DHT11 és DHT22 páratartalom szenzornak négy kivezetése van, ami valójában 3. Az egyiket ugyanis semmire nem lehet használni (NC=No Connection). A DHT11 beltéri mérésekre alkalmas, míg a DHT22 0 fok alatt is mér 100% páratartalomig és pontosabb is. Kicsit drágább mint a DHT11. Azt hiszem 1000Ft/db. 5V tápfeszültségről (Vcc láb) működik.
Egy alkalommal párhuzamosan mértem egy DHT11, DHT22 és 4db DS18B20 hőmérő szenzorokkal. A DHT11 lógott ki legjobban a sorból, kb 1-2 fokkal tért el az általa mért érték a többi öt szenzor által mért értékek átlagától. Ráadásul ez csak egész fokokat ad vissza. Egy fok eltérés nem sok, de nekem úgy tűnt, hogy inkább a DHT22-őt érdemes beszerezni beltérre is. Esetleg valamilyen más típust is érdemes megnézni (pl. BME280 vagy HDC1080)

Mielőtt konkrétan megnézzük a szenzor működését, érdemes megismerni a páratartalom definíciójával és a lehetséges mérési elvekkel.
Abszolút páratartalom: a levegő vízgőz tartalma kg/m3 vagy mol/dm3 koncentráció-egységben. A képlettel adott definíciója: abszolút páratartalom: AH

ahol n a vízmolekulák száma, Mv a víz molekuláris tömege, V pedig a térfogat. A levegő nem tud tetszőleges mennyiségben felvenni vizet – ha telítődik, megindul a kicsapódás. Azt a nyomást, amelyen ez a jelenség megtörténik, telített gőznyomásnak nevezzük.
A tapasztalatok szerint az abszolút páratartalom nincsen összhangban a szubjektív nyirkosság-érzetünkkel, ezért vezették be a relatív páratartalmat, amely a levegőben oldott vízgőz mennyisége a maximálisan oldható vízmennyiség százalékában kifejezve. A pontos definíciója a következő: relatív páratartalom RH

ahol pv a részleges vízgőznyomás, ps pedig az adott hőmérséklethez tartozó telítési nyomás. Ez utóbbi – és így a teljes mennyiség is – hőmérsékletfüggő. Ennek következményeként egy páratartalom-érzékelőnek tartalmaznia kell egy hőmérséklet-érzékelőt is a mért értékek értelmezéséhez. A levegő által oldható vízgőz mennyisége a hőmérséklet emelkedésével nő. Ha egy állandó térfogatban és állandó nyomáson lévő levegőmennyiségnek csökkentjük a hőmérsékletét, a relatív páratartalom nőni kezd. Egy bizonyos hőmérsékletérték alatt a víz elkezd kicsapódni – ez a harmatpont. Ezért harmatos reggel a réten a fű még nyáron is!

A rezisztív mérési elv azon alapul, hogy egy porózus anyag vezetőképessége (ellenállása) megváltozik az anyag felületén kicsapódó páratartalom hatására. Az érzékelő nagyon lassan áll be a pontos értékre, ez akár percekig is tarthat.

Kapacitív mérési elvű érzékelők esetén egy kondenzátor dielektrumának tulajdonságait változtatja meg a páratartalom, vagyis a kondenzátor kapacitása változik meg. Ezek az érzékelők lényegesen drágábbak, de egyben pontosabbak is és az érzékelő is gyorsabban áll be a pontos értékre. Sajnos arról nem találtam konkrét adatot, hogy mennyi a beállási idő. Amatőr gyakorlatban talán nem is érdekes, én pl. félóránként akartam mérni.

A specifikációból a következő adatokat sikerült kihámoznom:
DHT11:
Rezisztív mérési elven alapul
Hőmérséklet mérés 0-50 °C tartományban
Hőmérséklet mérés felbontása:1°C
Hőmérséklet mérés pontossága +/- 2 %
Páratartalom mérés 20-90% RH
Páratartalom mérés felbontása: 1%RH
Páratartalom mérés pontossága +/- 5%

Felbontás hőmérséklet mérés és páratartalom mérésben is 1, vagyis csak egész fokokat és páratartalom értékeket lehet mérni vele. Gyakorlatilag csak szoba hőmérőnek megfelelő.

DHT22:
Kapacitív mérési elven alapul
Hőmérséklet mérés -40 – +80 °C tartományban
Hőmérséklet mérés felbontása:0.1°C
Hőmérséklet mérés pontossága +/- 0.5 %
Páratartalom mérés 0-100% RH
Páratartalom mérés felbontása: 0.1%RH
Páratartalom mérés pontossága +/- 5%

Adatátvitel:
Az adatok átvitelét a mikrovezérlő kezdeményezi azzal, hogy lehúzza a DATA vezetéket 18ms időre a földre. Ekkor a DHT11 (DHT22-is ugyanígy működik) a low-power módból átkapcsol a leírás szerint high-speed üzemmódba. Ez utóbbi szerintem az adatátviteli módot jelenti. Ezt követően a mikrovezérlő a DATA vezetéket figyelni kezdi, azaz írás állapotból olvasás állapotba vált át. A DHT11 pedig egy 40 bites adatsorozatot jelenít meg a DATA vezetéken azzal, hogy azt meghatározott időzítés szerint a ciklikusan földre húzza és elengedi. Az így kialakuló jelsorozat a következő képen néz ki:

A DHT11 adatlapja szerint az adatátvitel során mindig az utoljára mért értéket küldi át. Ha nagyon hosszú ideig nem kérdeztük le a mért értékeket (erre vonatkozóan nem írja az adatlap mi a hosszú), akkor érdemes egy második lekérdezért is kezdeményezni, hogy a pontos mért értékeket kapjuk meg. Feltételezem, hogy ez azért van, mert amikor a 18ms start jellel felébresztjük a DHT11-et, kell számára idő, hogy pontos mérési eredményei legyenek. Vagyis ha pl félóránként kérdezzük le az adatokat, akkor az első kiolvasás az adott kiolvasási pillanat előtt félórával történt mérés adata. Szóval szerintem pár másodperc eltéréssel két mérést kell indítani, és csak a másodikat kell felhasználni. Ha meg folyamatosan kérdezgetjük le a mérési eredményeket, akkor ezzel nem kell foglalkozni!

A DHT11 kiolvasása a következő lépésekből áll:

1. lépés:
Ha a DHT11-re tápfeszt kapcsolunk, legalább legalább 1 másodpercet kell várni, hogy a chip stabil mérési eredményeket produkáljon. Ez idő alatt nem szabad lekérdezni az adatokat. A DHT11 DATA kivezetése ez alatt folyamatosan bemenet
2. lépés:
A mikrovezérlő kivezetése kimenet, amit a kommunikáció indítására minimum 18ms időre 0-ra kell kapcsolni. Ezt követően a mikrokontroller kivezetését bemenetre kell állítani. A felhúzó ellenállás természetesen ekkor a bemeneti feszültséget felhúzza 1-re. A mikrovezérlő ettől kezdve figyeli a vonalat a DHT11 pedig a DATA kivezetés 0-ra húzásával tud jelzéseket adni. Az adatlap ehhez a következő ábrát mutatja:

3. lépés:
A DHT11 a DATA kivezetését átállítja kimenetnek és 0-ra húzza 80mikrosec időtartamra. Ezt követően a mikrovezérlőnek fel kell készülnie az adatok fogadására, amire 80mikrosec idő áll rendelkezésére. Ennyi ideig a DHT11 DATA kivezetése 1-re vált. A következő 0-ra váltás már értékes adatot fog jelenteni. Ez az adatlap szerint így néz ki:

4. lépés:
Minden egyes bit átvitele előtt a DHT11 a DATA vonalat lehúzza 0-ra 50mikrosec-re. Ezt követi egy bit, melynek értéke attól függ, hogy mennyi ideig marad 1-en a DATA kivezetés. Ha az 50mikrosec-es 0 jelzés után 26-28mikrosec magas állapot következik a DATA kivezetésen, akkor az átvitelre kerülő bit értéke 0, ha az állapot 70mikrosec, akkor pedig 1. A két különböző bit érték átvitelét az alábbi ábra mutatja:

Adatátvitel befejezése:
Miután a DHT11 mind a 40 bitet „lejátszotta” elengedi a vonalat és a DATA kivezetés olvasás állapotba kerül. Várja a következő 18ms-es start jelet. Közben megcsinálja a következő hőmérséklet és páratartalom mérést, amit beír a belső regisztereiben. Bár az adatlap erről nem írt, de feltételezem, hogy a mérések végrehajtása után low-power módba kapcsol, hogy kicsi legyen az áramfelvétele.

Első lépésként kerestem hozzá programcsomagot:

A kezelő program roppan egyszerű, mindkét típus kezelésére alkalmas, csak a kommentezett sorokat kell megcserélni a típusnak megfelelően. Az eredményeket a soros monitorra írtam ki!
A katalógusok a DHT22 esetében 100m hosszú vezetékezést említenek. A DHT11 esetében már óvatosabb a gyártó, itt már csak azt mondja, hogy a vezeték hosszabb lehet mint 20m. Nekem egy 15m-es riasztó vezetékem volt otthon, azzal gond nélkül működött.

Példaprogram:

#include "DHT.h"
#define DHTPIN 2     // A 2. kivezetéshez kapcsolódik
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(9600);
  Serial.println("DHTxx test!");
  dht.begin();
}

void loop() {
  delay(2000); //2 másodfperc várakozás a mérésre
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t) ) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  
 // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print("Paratartalom: ");
  Serial.print(h);
  Serial.print(" % ");
  Serial.print("Homerseklet: ");
  Serial.print(t);
  Serial.print(" Celsius ");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.println(" *C ");
}

Mennyire volt hasznos amit olvastál?

Kattints egy csillagra az értékeléshez!

Sajnálom, hogy amit olvastál nem volt hasznos számodra!

Szeretném ha elégedett lennél!

Írd le kérlek, hogy mi nem tetszett!?