Oldalforrás megtekintése Korábbi változatok Hivatkozások Exportálás PDF-be Share on ... Google+ Twitter LinkedIn Facebook Pinterest Telegram Tartalomjegyzék Arduino páratartalom-mérés DHT11 / DHT22 szenzor Páratartalom-mérő modul Specifikáció Vezetékezés Szoftver SI7021, GY-21 modul Technikai adatok Vezetékezés Szoftver Ez a dokumentum egy előző változata! Arduino páratartalom-mérés DHT11 / DHT22 szenzor A DHTxx modul egy rezisztív típusú nedvességmérési komponenst és egy NTC hőmérsékletmérő komponenst tartalmaz. A méréseket egy integrált 8 bites mikrokontroller végzi el, mely kalibrált digitális jelkimenetet biztosít. A modul nagy megbízhatósággal és kiváló hosszú távú stabilitással rendelkezik. A DHT22-be az AM2302 típusú IC került integrálásra. A DHT22 szenzor nagyon- , míg a DHT11 "ultra" olcsónak számít, nyilván a 11-es némileg kevesebbet is "tud" (lásd lent az összehasonlítást). A DHTxx modul lekérdezését egy egyvezetékes soros interfészen keresztül lehet megvalósítani, a jelátvitel maximális távolsága 20 méter. A szenzort digitális pin-re kell csatlakoztatni. Páratartalom-mérő modul A DHT 11/22 moduloknak két változata van. Az egyiken a kapcsolat kiépítéshez szükséges ellenállás és kondenzátor integrálásra került (pl. 140C80, KY-015,..), a másik típuson az érzékelőn kívül nincs más alkatrész, így ezeknél az ellenállást és kondenzátort még külön be kell építeni (lásd: vezetékezés). Specifikáció jellemzőDHT11DHT22 Tápfeszültség3.3 ~ 5.5V DC Jelátviteli távolságmaximum 20 m Páratartalom mérési tartomány20 - 80% RH0 - 100% RH Páratartalom mérési hibahatár± 5%± 2 ~ 5% Hosszú távú stabilitás< ± 1% RH / év Hőmérséklet mérési tartomány0 - 50 °C-40 - 125 °C Hőmérséklet mérési hibahatár± 2%± 0.5% Felbontáspáratartalom 1% RH, hőmérséklet 1 ℃ Vezetékezés A fenti kötés sémája: Szoftver A szenzort egy Arduino Uno-val teszteltem. A legegyszerűbb módszer a beállítására, hogy az alábbi (Adafruit) könyvtárt: https://github.com/adafruit/DHT-sensor-library A könyvtár nem fog lefordulni az alábbi további könyvtár elérése nélkül: https://github.com/adafruit/Adafruit_Sensor Szóval, ezt a két könyvtárt a Githubról telepíteni kell (lásd könyvtár telepítése a Github-ról), majd a szintén innen települő példaprogramok közül futtatni kell a DHTtestert. A "lecsupaszított" program, "delay" funkció nélkül, belső időzítéssel (a fenti könyvtárak kellenek hozzá): #include "DHT.h" #define DHTPIN 2 // DHT22 pin // Uncomment whatever type you're using! //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //#define DHTTYPE DHT21 // DHT 21 (AM2301) unsigned long actTime, oldTime = 0; DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(115200); Serial.println("Start, wait.."); dht.begin(); delay(2000); } void loop() { actTime = millis(); if (actTime - oldTime > 2000) { // time to DHT22 check oldTime = actTime; float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); return; } float hic = dht.computeHeatIndex(t, h, false); Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.print(" *C "); Serial.print("Heat index: "); Serial.print(hic); Serial.println(" *C "); }; delay(10); } SI7021, GY-21 modul Az SI7021 egy páratartalom és hőmérsékletmérő modul, mely I²C kommunikációval érhető el. A modul (elvileg) technikailag az alábbi modulokkal egyezik meg: HTU21D, SHT20, SHT21, HDC1080. Technikai adatok Üzemi feszültség: 1.9 .. 3.6 V DC (3,3V ajánlott) Készenléti áram: 60nA Hőmérséklettartomány: -40 és 85 °C (-10 .. 60 °C ajánlott) Hőmérséklet pontosság: ± 0,4 °C (-10 .. 85 °C) Páratartalom: 0-100% relatív páratartalom (20% - 80% relatív páratartalom) Páratartalom pontosság: ± 3% relatív páratartalom (0-80% relatív páratartalom) Hőmérséklet-konverziós idő: 7ms Páratartalom-konverziós idő: 17ms Kommunikáció: I²C Fix I²C cím: 0x40 Az IC apró fehér fedele egy Politetrafluoretilén (PTFE) membránszűrő. A kommunikáció összekötése után érdemes az Arduino I²C scanner programmal tesztelni a modul jelenlétét. Az Arduino I²C összefoglalása itt található: Arduino I²C. A modul 3.3V TTL logikával működik, az 5V-os logikához való csatoláshoz 10kΩ-os ellenállást kell alkalmazni. A modul beépített 4.7 KΩ-os lehúzó ellenállásokkal rendelkezik az I²C kommunikációhoz. Amennyiben más résztvevőket is akar az I²C-re csatolni, ezt az ellenállást le kell forrasztani (vagy a többi résztvevőhöz már ezek nem kellenek). A modul PTFE szűrője lassítja a mérést, de a szűrő eltávolítása a készülék rövidített élettartamát vagy meghibásodását eredményezheti nagyon nedves környezetben. A szenzort óvni kell a fizikai / kémiai szennyeződéstől, mert ezek erőteljesen befolyásolják a mérés pontosságát. Vezetékezés Szoftver // source: http://www.arduinoprojects.net/temperature-projects/arduino-si7021-i2c-humidity-temperature-sensor.php #include <Wire.h> const int ADDR =0x40; int X0,X1,Y0,Y1,Y2,Y3; double X,Y,X_out,Y_out1,Y_out2; void setup() { Serial.begin(9600); Wire.begin(); delay(100); Wire.beginTransmission(ADDR); Wire.endTransmission(); } void loop() { /**Send command of initiating temperature measurement**/ Wire.beginTransmission(ADDR); Wire.write(0xE3); Wire.endTransmission(); Serial.print("Temp"); Serial.print("\t"); Serial.println("Humidity"); /**Read data of temperature**/ Wire.requestFrom(ADDR,2); if(Wire.available()<=2); { X0 = Wire.read(); X1 = Wire.read(); X0 = X0<<8; X_out = X0+X1; } /**Calculate and display temperature**/ X=(175.72*X_out)/65536; X=X-46.85; Serial.print(X); Serial.print("C"); Serial.print("\t"); /**Send command of initiating relative humidity measurement**/ Wire.beginTransmission(ADDR); Wire.write(0xE5); Wire.endTransmission(); /**Read data of relative humidity**/ Wire.requestFrom(ADDR,2); if(Wire.available()<=2); { Y0 = Wire.read(); Y2=Y0/100; Y0=Y0%100; Y1 = Wire.read(); Y_out1 = Y2*25600; Y_out2 = Y0*256+Y1; } /**Calculate and display relative humidity**/ Y_out1 = (125*Y_out1)/65536; Y_out2 = (125*Y_out2)/65536; Y = Y_out1+Y_out2; Y=Y-6; Serial.print(Y); Serial.println("%"); delay(300); Serial.println(); delay(1000); }