
A projektben a DHT11/DHT22 hőmérséklet és páraszenzor kerül terítékre. Boncolva a belseje is megismerésre kerül – valamint Arduino segítségével vizsgáljuk, hogy a környezetben hogyan és mitől változik e két jellemző. A cikkben a jövőbeni lehetőségek is terítékre kerülnek – megágyazva a hasonló célú, ám fejlettebb érzékelőknek. Legvégül pedig a hátrányokról sem szabad megfeledkezni…
Hozzávalók
Eszközök
- Arduino UNO alaplap vagy Arduino Mega alaplap (de bármelyik Arduino kompatibilis alaplap megfelel)
- DHT11 hő-/páraszenzor
- Jumper/Dupont kábel (anya-anya) – 3 ér
Szoftver
- Arduino IDE keretrendszer
A cikk a Windows alatti 1.8.13 verzióval készült. - Adafruit DHT eljáráskönyvtár (ver: 1.2.3)
DHT11/DHT22 a háttér
A DHT11/DHT22 (avagy az eredeti ASAIR (AOSONG) gyártói jelölés alapján: DHT11 és AM2302) érzékelők előre kalibráltak és nem igényelnek további alkatrészeket a méréshez és a használatukhoz. Így azonnal elkezdhető velük a relatív páratartalom és hőmérséklet mérése.
A DHTxx érzékelők egyik legjobb tulajdonsága, hogy mind a hőmérsékletet, mind a páratartalmat tized pontossággal mérik – így meglehetősen pontos eredményt adnak vissza. Azonban a DHT érzékelők egyik hátránya, hogy a többi hasonló célú eszközhöz képest ritkábban képesek csak mérni (egy mérés ideje: egy-két másodperc). Ezért a gyors folyamatok monitorozására nem igazán alkalmasak – de tekintve az árukat és tudásukat: nem lehet panasz rájuk.
(Az érzékelők kiválasztási szempontjairól más cikkben még esik még bőven szó, a DHT mérőszonda-család előny-hátrány összefüggései az összehasonlító cikkben elérhetőek el (majd): → DHT szenzorról bővebben és a kiválasztás.).
A DHT11 vagy a DHT22/AM2302 szenzor a legyen a tesztben?
A DHTxx szenzorsorozatból alapvetően két változat van. Kicsit hasonlónak tűnnek, ugyanaz a kivezetésük sorrendje – de eltérőek a jellemzőik. A részletek:
A DHT22 szenzor a drágább, amely jobb specifikációval is rendelkezik. A hőmérsékleti mérési tartománya -40°C és +125°C között van ±0,5 fokos pontossággal, míg a DHT11 hőmérsékleti méréstartománya 0°C és 50°C között van ±2 fokos pontossággal. Szintén a DHT22 szenzornak a jobb a páratartalom mérési tartománya, 0-tól 100RH%-ig 2-5RH%-os pontossággal, míg a DHT11 páratartalom mérési tartománya 20-80RH%-os 5RH%-os pontossággal.
DHT11 |
DHT22 |
|
Tápfeszültség |
3…5V |
3…5V |
Max. áramfelvétel |
2.5mA |
2.5mA |
Páratartalom mérés |
20-80RH% / 5RH% |
0-100RH% / 2-5RH% |
Hőmérséklet mérés |
0…50°C / ± 2°C |
-40…80°C / ± 0.5°C |
Mintavételezés |
1 Hz (mintavételezés: másodpercenként) |
0.5 Hz (mintavételezés: 2 másodpercenként) |
Méret |
15.5mm x 12mm x 5.5mm |
15.1mm x 25mm x 7.7mm |
Előny |
Alacsony ár |
Jobb pontosság |
Bár a DHT22 pontosabb, nagyobb hőmérséklet- és páratartalom-tartományban működik – azonban három dolog is van, ahol a DHT11 legyőzi a DHT22-t. Olcsóbb, kisebb méretű és sűrűbb mintavételezésre alkalmas. A DHT11 mintavételi frekvenciája 1 Hz, azaz másodpercenként egy leolvasás történhet – míg a DHT22 mintavételi frekvenciája 0,5 Hz, azaz két másodpercenként lehetséges egy leolvasás.
Ugyanakkor mindkét érzékelő üzemi feszültsége 3…5 V, míg a mérés során (illetve adatforgalomnál) az áramigény 2,5 mA. És a legjobb dolog az, hogy a DHT11 és DHT22 érzékelők „cserélhetőek egymással” – vagyis ha az egyikkel épül fel a projekt, egyszerűen kicserélhető az érzékelő a másik típusra. Ha a programkód nem univerzális, akkor a kódot kicsit módosítani kell! (De legalább a vezetékezés ugyanaz… (a hordozható/csereszabatos kódról a cikk végén esik majd szó)!)
Hardware áttekintés
Most jön az érdekesebb rész: a boncolás. Azaz lebontásra kerül mind a DHT11, mind a DHT22 érzékelő külső burka. Láthatóvá válik, hogy mi van belül…
Az érzékelő tokozat két részből áll, így csak egy éles kést kell elővenni és szét kell pattintani a ragasztásnál. A tokozat belsejében, a szenzor oldalon van egy páratartalom-érzékelő, valamint egy NTC hőmérséklet-érzékelő alkatrész.

A páratartalom mérése nem annyira egyszerű, mint ahogyan hangzik…
A szőke hajszállal lehet az egyik legegyszerűbb páraszenzort elkészíteni – de ez itt nem az igazi megoldás (→ Firka 2007). De ez elektronikusan is megoldható:
A nedvességérzékelő szenzor felépítéséhez két elektródát használnak, melyek közé ún. nedvességtartó szubsztrát (általában só vagy vezetőképes műanyag polimer) van elhelyezve. Amikor a szubsztrát a vízgőzt elnyeli – ionok válnak szabaddá, ami viszont növeli az elektródák között a vezetőképességet. A két elektróda közötti vezetőképesség változása arányos a relatív páratartalommal. A magasabb relatív páratartalom csökkenti az elektródák közötti ellenállást, míg az alacsonyabb relatív páratartalom növeli azt.

A páraszenzoron kívül az eszköz még egy NTC hőmérséklet-érzékelőből(termisztorból) áll. A termisztor nem más, mint egy hőfokfüggő ellenállás: azaz megváltoztatja ellenállását a hőmérséklettel összefüggésben. (Technikailag minden ellenállás termisztor – hiszen ellenállásuk enyhén változik a hőmérséklettel –, de ez a változás általában nagyon kicsi és nehezen mérhető.)
A termisztorok tulajdonsága, hogy az ellenállásuk a hőmérséklettel drasztikusan változik. Az „NTC” kifejezés „negatív hőmérsékleti együtthatót” jelent – ami azt jelenti, hogy az eszköz ellenállása a hőmérséklet emelkedésével csökken.

A érzékelő áramköri lapjának a másik oldalán van egy kis 8 bites SOIC-14 tokozású IC-vel. Ez abprogramozott áramkör méri és feldolgozza az analóg jelet a belső tárolt kalibrációs együtthatókkal, analóg-digitális átalakítást végez, és digitális kommunikációval visszaadja a mért hőmérsékleti és páratartalom adatokat.
DHT11 és DHT22 lábkiosztás
A DHT11 és DHT22 érzékelők csatlakoztatása az áramkörökhöz nagyon egyszerű. Négy kivezetéssel rendelkeznek:
Az érzékelő a Vcc kivezetésén keresztül kapja a tápfeszültséget. Bár ez 3.3 V és 5.5 V között lehet – az 5 V tápfeszültség javasolt. Ebben az esetben a mérőszonda és az adatfeldolgozó áramkör közti maximális távolság 20 méter is lehet, míg 3.3V tápellátás esetén a távolság maximum 1 méter. Az adatlapban megadott kábelhossz túllépése esetén a kommunikáció sérülhet – hibás/sérült adatcsomag érkezhet.
Az adat kivezetés az érzékelő és a mikrokontroller közötti kommunikációra szolgál. Az érzékelők lábkiosztása:
- Vcc – tápellátás (3…5V)
- Data pin – adatvonal/mérési eredmény digitális kommunikáció
- NC – nincs bekötve
- GND – rendszerföld
DHT11 és DHT22 összekötése az Arduino lappal
Most, hogy a DHT11/DHT22 érzékelők működése megismerésre került – akár az Arduinora is lehetne kötni…
Szerencsére elég könnyű a DHT11/DHT22 szenzorok Arduinohoz csatlakoztatása. A szenzorok hosszú lábakkal, 0,1” osztásközű kivezetésekkel rendelkeznek, így könnyedén csatlakoztathatók bármilyen breadboardhoz vagy akár közvetlenül az Arduino laphoz. A rendszer 5V tápfeszültsége és a GND összekötése egyértelmű, míg az adatvonalat a D4 Arduino kivezetésre kell bekötni (de bármelyik digitális I/O kivezetésre megfelelő e célra). Az adatvonal és a Vcc (tápfeszültség) közé szükséges még egy 10 kOhm felhúzó-ellenállás. Tipp: ha DHTxx modulként áll rendelkezésre az érzékelő, akkor a felhúzó ellenállás ott az áramköri lapon már elhelyezésre került.

Arduino program – szenzoradatok kiírása a soros terminálra
A DHT11 és DHT22 érzékelőknek saját egyvezetékes protokolljuk van az adatok átvitelére – azonban ez nem csereszabatos a Dallas OneWire busszal! A protokoll az időzítésre érzékeny, de szerencsére nem kell sokat aggódnunk emiatt, mert a DHT eljárás könyvtár (több írótól is) rendelkezésre áll és szinte mindenről gondoskodik. Viszont ez okozza a problémát is. A kódok minősége sosem egyenletes az Arduino esetén. Több DHT eljáráskönyvtárat kipróbálva, hibákba lehet belefutni:
- a szenzor lekérdezésekor időtúllépésre fut – így az adat helyett “Nincs adat/hibás szenzor” eredményt kapunk
- a szenzor típusát be kell állítani – nem ismeri fel automatikusan, hogy DHT11 vagy DHT22 a szenzor
- a program nem ellenőrzi a kommunikációt és nem használja a hibaellenőrzést
- csak az alapfunkciók vannak megírva az eljárásban (a kényelmi segédprogramok nem: Fahreinheit átszámítás, abszolút páratartalom kiszámítása, hőérzetszámítás, stb.)
A DHT függvénykönyvtárakból a keretrendszer többet is felkínál telepítésre:
- DHT sensor library (Adafruit) 1.2.3
Nincs autodetect funkció. Az újabb kiadások plusz eljáráskönyvtárakat (függőségeket) is telepítenek! Hőérzet számítást is tartalmaz. - DHTlib (Rob Tillaart) 0.1.34
Nincs autodetect funkció. Kommunikációs hibák típusát is kiírja. Csak az alap hőfok/páratartalmat adja vissza. - DHTNew (Rob Tillaart) 0.4.10
Hibás működés, szenzorokat eldobja időnként. Elvileg autodetect funkcióval rendelkezik- gyakorlatilag hibára fut. - DHTStable (Rob Tillaart) 1.1.0
Nincs autodetect funkció. Kommunikációs hibák típusát is kiírja. Csak az alap hőfok/páratartalmat adja vissza. - SDHT (Helder Rodrigues) 2.0.0
Nem jól települ – nem jelenik meg a példák közt. - SimpleDHT (Vinlin) 1.0.15
Nem jól települ – nem jelenik meg a példák közt. - TroykaDHT (Dementiev)
Alapfunkciók, nincs autodetect.
A legjobbnak a DHT sensor library (Adafruit) könyvtára tűnik, így a mintában is ezt használtam.
A DHTxx függvénykönyvtár telepítése
A telepítés az Arduino beépített könyvtárkezelőjével lehetséges. Ehhez meg kell nyitni a Vázlat – Könyvtár tartalmazása – Könyvtárak kezelése… útvonalon a Könyvtárkezelőt.
Az előugró ablakban a keresőmezőbe a DHT szöveget megadva és ENTER-t ütve – a lista leszűrésre kerül. Itt a DHT sensor library by Adafruit telepítést kell kiválasztani – a lenyíló menüből az 1.2.3 verziót választva.
A Telepítés gombra kattintva az eljáráskönyvtár letöltésre és installálásra is kerül. (Az Arduino keretrendszer újraindítása javasolt a telepítés után!)
Ellenőrizni a Fájl – Példák – DHT sensor library – DHTtester megnyitásával lehet a sikeres telepítést.
Saját DHT11/DHT22 mintakód
A gyári mintakód is használható DHT11/22 szenzor működésének ellenőrzésére. De a működés bemutatása a cikkbeli programkódon keresztül a legegyszerűbb.
A programkód lefordítása és feltöltése után az Arduino lapka a hőmérséklet és a relatív páratartalom értékeket írja ki a megnyitott soros monitorra.
#include <DHT.h> #define DHTpin 4 #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); dht.begin(); delay(2000); } void loop() { float t = dht.readTemperature(); float h = dht.readHumidity(); Serial.print("Temperature = "); Serial.print(t); Serial.print(" *C | "); Serial.print((t * 9.0) / 5.0 + 32.0); Serial.print(" *F | Humidity = "); Serial.print(h); Serial.println(" % "); Serial.println(""); delay(2000); }
Ha mindent jól csináltunk, akkor a soros terminál ablakban ilyet kell látni:
A program működése
A program elején megadásra kerül, hogy a DHT11/DHT22 modul melyik Arduino kivezetésre kapcsolódik (dataPin
). Majd DHT eljáráskönyvtár hozzáadásával előkészítésre kerül, hogy később a mérőszondát mely függvények fogják kezelni (DHT.h
meghivatkozása). És definiálni kell még, hogy melyik típusú érzékelőt használjuk, és a program ennek megfelelően kell majd hogy kiválassza. Ez a DHTTYPE
definícióval lehetséges (az a sor, amelyik a típusra utal – az fordításra kerül, míg a nem használt érzékelők a //
jellel megjegyzésként kerülnek leírásra. Ezen adatok segítségével létrehozásra kerül egy DHT
nevű objektum – amin keresztül elérhetőek a könyvtárban megvalósított funkciók.
#define dataPin 4 #include <DHT.h> #define DHTpin 4 #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTpin, DHTTYPE);
A setup()
funkcióban a soros kommunikáció beállításra kerül – hiszen a mérési eredményt ezen keresztül küldjük a PC felé – ahol az Arduino beépített soros termináljában kerül megjelenítésre. A dht.begin()
utasítás a dht objektumon keresztül a mérőszondát mérési állapotra készíti fel, ahogy az Arduino lapot is a kiolvasásra. Végül 2000 msec várakozás szükséges az első mérés lefutásához, a mérőszonda inicializálásához.
void setup() { Serial.begin(9600); dht.begin(); delay(2000); }
A loop()
függvényben a dht.readTemperature()
kiolvassa a hőmérsékletet – a dht.readHumidity()
pedig a páratartalmat. A kapott adatok a Serial.print()
utasítással a soros monitorra kiírásra kerülnek.
float t = dht.readTemperature(); float h = dht.readHumidity(); Serial.print("Temperature = "); Serial.print(t); Serial.print(" *C | "); Serial.print((t * 9.0) / 5.0 + 32.0); Serial.print(" *F | Humidity = "); Serial.print(h); Serial.println(" % "); Serial.println(""); delay(2000);
A dht.readTemperature()
Celsius (°C) hőmérsékleti értéket ad vissza. Fahrenheit-re (°F) konvertálható egy egyszerű képlet segítségével:
T(°F) = T(°C) × 9/5 + 32
A kapott Fahreinheit adat is kiírható a Serial.print()
utasítás segítségével. Tipp: a hőmérséklet fok jele a kiírásban * jellel került helyettesítésre. Így a speciális karakter kiírása elkerülhető.
Grafikon rajzolása
Az Arduino beépítve tartalmazza az ún. plotter funkciót. Az Arduino IDE használata során ehhez a kirajzolandó adatokat speciálisan formázva kell a PC fele soros vonalon küldeni. Az adatküldésnél a kiírandó adatokat szóköz, /t (tabulátor) kell hogy elválassza, és az összetartozó adatok sorát a sorvége jellel kell lezárni. Azaz az előző programban a kiíratási rész már módosításra került:
#include <DHT.h>
#define DHTpin 4
#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);
dht.begin();
delay(2000);}
void loop()
{
float t = dht.readTemperature();
float h = dht.readHumidity();
Serial.print(t);
Serial.print(" ");
Serial.println(h);
delay(2000);
}
A programkódban a változás piros színnel lett kiemelve. Fordítás és letöltés után az Arduino keretrendszerben a görbe rajzolása az Eszközök – Soros plotter alatt lehetséges. (Fontos! A lenyíló menüben a Soremelés és kocsi vissza is legyen kiválasztva) Ha mindent jól végeztünk, akkor képernyőn megjelenő görbe ehhez hasonló lesz:

Az Adafruit DHT eljáráskönyvtár egyéb szolgáltatásai
Az Adafruit eljáráskönyvtár (verzió: 1.2.3) segítségével a hőmérséklet kiolvasható Fahreinheit fokban is:
// Read temperature as Fahrenheit (isFahrenheit = true) float f = dht.readTemperature(true);
A kiolvasás után, ha a változók nem érvényes adatot adnak vissza, akkor a hiba lekezelhető az alábbi módon:
// Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t) || isnan(f)) { Serial.println("Failed to read from DHT sensor!"); return; }
Az eljáráskönyvtár a hőérzet számítást is tartalmazza (Hőérzet: magasabb páratartalom esetén javul, azaz ugyanazt a hőmérsékletet magasabbnak, alacsony páratartalom mellett pedig romlik hőérzetünk, azaz ugyanazt a hőmérsékletet alacsonyabbnak érezzük.)
// Compute heat index in Fahrenheit (the default) float hif = dht.computeHeatIndex(f, h); // Compute heat index in Celsius (isFahreheit = false) float hic = dht.computeHeatIndex(t, h, false);