Czujniki wilgotności i temperatury DHT11 i DHT22
DHT11 i DHT22 są 8-bitowymi, cyfrowymi czujnikami wigotności i temperatury, komunikującym się za pośrednictwem interfejsu podobnego do 1 wire.
DHT11 doskonale nadaje się do pomiaru tempeatur z zakresu 0ºC do 50ºC oraz wilgotności powietrza od 20% do 95%RH. Czujnik nie nadaje się zatem do pomiaru tempeatur ujmenych, a tym samym nie przyda nam się do mierzenia temperatury np. za oknem. Doskonale natomiast sprawdzi się w pomiarach w pomieszczeniach zamkniętych. Jeśli chodzi o błąd pomiarowy mieści się w zakresie ±2ºC dla temperatury oraz ±5%RH dla wilgotności.
Jeśli chodzi o DHT22 to ma on już szersze zastosowanie, bowiem potrafi mierzyć temperatury z zakresu -40ºC do 125ºC oraz wilgotności powietrza od 0% do 100%RH. Błąd pomiarowy wilgotności jest taki sam jak w przypadku DHT11, natomiast o wiele dokładniejszy jest pomiar temperatury, wynoszący ±0.5ºC .
Błędy pomiarowe mogą być niższe i w dużej mierze zależą od warunków otoczenia - dokładną tabelę znajdziedzie w karcie katalogowej tego czujnika.
DHT11
DHT22
DHT11 i DHT22 posiadają wyprowadzone cztery piny, z czego dwa wykorzystane są do zasilania napięciem z zakresu 3.3V do 5.5V (typowe zasilanie to 5V) oraz jeden pin sygnałowy, Pobór prądu w trakcie pomiaru może wynieść maksymalnie 2.5mA dla DHT11 i 1.5mA dla DHT22.
DHT11 | DHT22 | ||||||
Typ | Minimalnie | Typowe | Maksymalnie | Minimalnie | Typowe | Maksymalnie | |
Napięcie zasilania | DC | 3V | 5V | 5.5V | 3.3V | 5V | 6V |
Pobór prądu | Pomiar | 0.5mA | 2.5mA | 1mA | 1.5mA | ||
Czuwanie | 100uA | 150uA | 40uA | 50uA | |||
Czas pomiaru | Minimalnie | 1s | 2s |
Schemat połączeń
Cała filozofia czujnika ogranicza się do podłączenia do niego zasilania 5V oraz doprowadzenie pinu sygnałowego do mikrokontrolera. Należy również wpiąć rezystor o wartości 10kΩ pomiędzy pin zasilania VCC, a pin sygnałowy DAT. Aby jednak ze sprawiedliwości stała się zadość, poniżej schemat :)
Program
Jedą z wielu dostępnych, jest biblioteka DHT-sensor-library od Adafruit, która należy rozpakować do katalogu sketchbook/libraries/
- bash-4.2$ tree -d ~/sketchbook/libraries/DHT/
- /home/santyago/sketchbook/libraries/DHT/
- `-- examples
- `-- DHTtester
Program przedstawia się następująco:
- #include "DHT.h" // biblioteka DHT
- #define DHTPIN 2 // numer pinu sygnałowego
- #define DHTTYPE DHT11 // typ czujnika (DHT11). Jesli posiadamy DHT22 wybieramy DHT22
- DHT dht(DHTPIN, DHTTYPE); // definicja czujnika
- void setup()
- {
- Serial.begin(9600); // otworzenie portu szeregowego
- dht.begin(); // inicjalizacja czujnika
- }
- void loop()
- {
- // Odczyt temperatury i wilgotności powietrza
- float t = dht.readTemperature();
- float h = dht.readHumidity();
- // Sprawdzamy czy są odczytane wartości
- if (isnan(t) || isnan(h))
- {
- // Jeśli nie, wyświetlamy informację o błędzie
- Serial.println("Blad odczytu danych z czujnika");
- } else
- {
- // Jeśli tak, wyświetlamy wyniki pomiaru
- Serial.print("Wilgotnosc: ");
- Serial.print(h);
- Serial.print(" % ");
- Serial.print("Temperatura: ");
- Serial.print(t);
- Serial.println(" *C");
- }
- }
Alternatywna biblioteka
Jeszcze jedną ciekawą biblioteką do obsługi czujników DHTxx znajdziesz tutaj. Została ona napisana przez Marka Ruysa. Od pierwowzoru różni się automatycznym wykrywaniem podpiętego czujnika, którym może być DHT11, DHT22, AM2302 oraz RHT03. Dodatkowo biblioteka posiada funkcję wyświetlania temperatury w skali Fahrenheita.
- #include "DHT.h" // biblioteka DHT
- #define DHTPIN 2 // numer pinu sygnałowego
- DHT dht; // definicja czujnika
- void setup()
- {
- Serial.begin(9600); // otworzenie portu szeregowego
- dht.setup(DHTPIN); // inicjalizacja czujnika
- // dht.setup(DHTPIN, DHT11); // inicjalizacja czujnika DHT11
- // dht.setup(DHTPIN, DHT22); // inicjalizacja czujnika DHT12
- }
- void loop()
- {
- // Miniamalne opóźnienie odczytu
- delay(dht.getMinimumSamplingPeriod());
- // Odczyt temperatury i wilgotności powietrza
- float t = dht.getTemperature();
- float h = dht.getHumidity();
- // Sprawdzamy poprawność danych
- if (dht.getStatus())
- {
- // Jeśli nie, wyświetlamy informację o błędzie
- Serial.println("Blad odczytu danych z czujnika");
- } else
- {
- // Jeśli tak, wyświetlamy wyniki pomiaru
- Serial.print("Wilgotnosc: ");
- Serial.print(h);
- Serial.print(" % ");
- Serial.print("Temperatura: ");
- Serial.print(t);
- Serial.print(" *C / ");
- Serial.print(dht.toFahrenheit(t));
- Serial.println(" *F ");
- }
- }
Uruchomienie
Po przesłaniu programu do Arduino, możemy śledzić wyniki pomiarów w monitorze portu szeregowego.
Materiały dodatkowe
Biblioteka DHT-sensor-library od Adafruit.
Biblioteka arduino-DHT od Marka Ruysa
Mirror bibliotek DHT: https://www.jarzebski.pl/arduino/DHT/
Karta katalogowa czujnika DHT11.pdf
Karta katalogowa czujnika DHT22.pdf
Reklama
Komentarze
masz 25 stopni w pokoju ? cieplo
//pomyłka w nicku
Możesz zamiast wypisywania ciągłego użyć zmiennych pomocniczych, które będą zapisywały informacje o poprzednim pomiarze i gdy któraś wartość się zmieni dopiero wypisywać wynik
#include "DHT.h" // biblioteka DHT
#define DHTPIN 2 // numer pinu sygnałowego
#define DHTTYPE DHT11 // typ czujnika (DHT11). Jesli posiadamy DHT22 wybieramy DHT22
DHT dht(DHTPIN, DHTTYPE); // definicja czujnika
float a = 0.0,b = 0.0;
void setup()
{
Serial.begin(9600); // otworzenie portu szeregowego
dht.begin(); // inicjalizacja czujnika
}
void loop()
{
// Odczyt temperatury i wilgotności powietrza
float t = dht.readTemperature();
float h = dht.readHumidity();
// Sprawdzamy czy są odczytane wartości
if (isnan(t) || isnan(h))
{
// Jeśli nie, wyświetlamy informację o błędzie
Serial.println("Blad odczytu danych z czujnika");
} else
{
// Jeśli tak, wyświetlamy wyniki pomiaru
if(a != h || b != t){
Serial.print("Wilgotnosc: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.println(" *C");
a = h;
b = t;
}
}
}
A czy można podpiąć dwa lub więcej takich czujników pod jedno arduino. Jak tak to jak to rozwiązać ?
jakkolwiek :) każdy dht wymaga jednego pinu cyfrowego, np jeden pod 2 ,a drugi pod 3:
dht1.setup(2);
dht2.setup(3);
jak się nie mylę to 1 wire umożliwia podpięcie kilku czujników pod ten sam pin
Też się na to naciąłem - problem w tym, że dht11 i dht22 nie są 1 wire
witam,czy można zrobić żeby dane z projektu Marka Ruysa były na LCD_Counter_I2C_short wyświetlane.Łączyłem dwa skecze ale nie zabardzo mi działa.
#include "DHT.h" // biblioteka DHT
#include
#include
#define BACKLIGHT_PIN 3
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7);
#define DHTPIN 2 // numer pinu sygnałowego
DHT dht; // definicja czujnika
void setup()
{
Serial.begin(9600); // otworzenie portu szeregowego
dht.setup(DHTPIN); // inicjalizacja czujnika
// dht.setup(DHTPIN, DHT11); // inicjalizacja czujnika DHT11
// dht.setup(DHTPIN, DHT22); // inicjalizacja czujnika DHT12
lcd.begin (16,2);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);
lcd.home ();
lcd.print("C/F");
}
void loop()
{
lcd.setCursor(0, 1);
lcd.print(millis()/10);
// Miniamalne opóźnienie odczytu
delay(dht.getMinimumSamplingPeriod());
// Odczyt temperatury i wilgotności powietrza
float t = dht.getTemperature();
float h = dht.getHumidity();
// Sprawdzamy poprawność danych
if (dht.getStatus())
{
// Jeśli nie, wyświetlamy informację o błędzie
Serial.println("Blad odczytu danych z czujnika");
} else
{
// Jeśli tak, wyświetlamy wyniki pomiaru
Serial.print("Wilgotnosc: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.print(" *C / ");
Serial.print(dht.toFahrenheit(t));
Serial.println(" *F ");
}
}
O ile dht11 na tej bibliotece dziala i pokazuje prawidlowe dane o tyle dht22 niestety nie dziala temperatura a wilgotnosc normalnie ;/ co jest nie tak ? :) Uszkodzony czujnik czy co ? caly czas pokazuje 25.10
Uszkodzony był czujnik, biblioteka wzorowa działa bardzo dobrze ;)
Cześć,
A nie próbowałeś może uruchomić obsługi DHT11/DHT22 bezpośrednio z portu LPT?
Kiedyś walczyłem z tym zagadnieniem, niestety poległem, jak sądze z powodu trudności w utrzymaniem reżimów czasowych.
http://www.elektroda.pl/rtvforum/topic2886665.html#13911710
Pozdrawiam,
Robert
Witam.
Potrzebuję połączyć 24 czujniki DS18B20 za pomocą i2c ,
jak rozróżnić który jest który???
A może da się ustawić ich adresy???
Pozdrawiam
Piotr
Adresy są wpisane w ROM. Maxim ma w ofercie konwerter 1Wire-I2C. A jak odróżnić? Po kolei brać do łapki i obserwować wskazania :)
Witam. Jak napisać funkcję która będzie mi zapamiętywać z DTH11 temperaturę minimalną jak i maksymalną?
int minTemp = 666;
int maxTemp = 666;
void saveTemp(int currentTemp) {
if (minTemp == 666) {
minTemp = currentTemp;
maxTemp = currentTemp; }
if (currentTemp > maxTemp) maxTemp = currentTemp;
if (currentTemp < minTemp) minTemp = currentTemp;
}
Witam.
Genialna strona z przykładami:)
Właśnie Z Twojej strony zaczęło się moje zainteresowanie Arduino.
Chciałbym zbudować prostą stację pogodową w której będzie również wyświetlany czas.
Tu pojawia się problem: Zegar na DS1307 jak i BMP180 korzystają z t wejść A4 i A5.
Co zrobić aby moja stacja pogodowa zadziałała??
Z tego co pamiętam DS1307 i BMP180 mają inne adresy na I2c, więc mogą pracować razem.
Witam
Myślę że bardzo istotne jest aby sprostować informacje na tej stronie a są one bardzo mylące. Chodzi mi o pierwsze zdanie w którym pisze że czytnik komunikuje sie za pomocą interfejsu 1 wire. Może to wprowadzać w błąd. Nie jest to popularny protokół transmisji Dallas-a 1-wire, gdzie każde urządzenie ma swój unikalny adres. DHT korzysta z własnego protokołu który być może przypomina 1-wire ale nie można go tak nazwać. Proszę o sprostowanie artykułu.
Więcej info:
http://hirt.se/blog/?p=493
http://forum.r-pi.pl/nasze-projekty/ds18b20-dht22-lcd-rtc-t149903-10.html
Wielkie dzięki za informację. Oczywiście masz rację - migiem to poprawię
Koniec roku a mig nie przyleciał. Popraw !!!
Luty nowego roku, a w tekście dalej błąd (i to boldem). Popraw, bo wprowadzasz w błąd.
Eh :) nie odpuszczacie - poprawione - dzięki
Cześć , masz pomysł dla czego to nie działa nie mogę tego nawed skompilować
#include
#include
#include
#include
#include
#include
#include
#define CHILD_ID_HUM 0
#define CHILD_ID_TEMP 1
#define CHILD_ID_LIGHT 2
#define CHILD_ID_BARO 3
#define CHILD_ID_BTEMP 4
#define CHILD_ID_WINDSPEED 5
#define CHILD_ID_RAIN 6
#define MESSAGEWAIT 500
#define DIGITAL_INPUT_RAIN_SENSOR 3
#define HUMIDITY_SENSOR_DIGITAL_PIN 5
#define ENCODER_PIN 2
#define INTERRUPT DIGITAL_INPUT_RAIN_SENSOR-2
const int windSpeedPin = 2; // contact on pin 2 digital
int windSpeedPinCounter = 0; // impuls counter
int windSpeedPinStatus = 0; // actual impuls
int windSpeedPinStatusAlt = 0; // oude Impuls-Status
unsigned long windmeterStart;
unsigned long windmeterStartAlt = 0;
int windSpeed; // Variable voor Wind Speed
int beaufort = 0; // Variable Wind in Beaufort
const int windmeterTime = 10000;
//float knoten = 0.0;
//float wind = 0.0;
unsigned int knoten;
unsigned int wind;
boolean metric = false;
int altitude = 16; // meters above sealevel
float lastBmpTemp = -1;
float lastPressure = -1;
float lastHum = -1;
float lastTemp = -1;
double temp;
double hum;
int BATTERY_SENSE_PIN = A0;
int lastRainValue = -1;
int nRainVal;
boolean bIsRaining = false;
String strRaining = "NO";
int lastBatteryPcnt = 0;
int updateAll = 60;
int updateCount = 0;
uint16_t lastLux;
// unsigned long SLEEP_TIME = 60000;
unsigned long SLEEP_TIME = 600;
int batteryBasement = 800;
float batteryConstant = 100.0 / (1023 - batteryBasement);
MyTransportNRF24 radio; // NRFRF24L01 radio driver
MyHwATMega328 hw; // Select AtMega328 hardware profile
MySigningAtsha204 signer(true); // Select HW ATSHA signing backend
Adafruit_BMP085 bmp = Adafruit_BMP085();
BH1750 lightSensor;
dht DHT;
MySensor gw(radio, hw, signer);
MyMessage msgHum(CHILD_ID_HUM, V_HUM);
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
MyMessage msgLux(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
MyMessage msgBtemp(CHILD_ID_BTEMP, V_TEMP);
MyMessage msgPressure(CHILD_ID_BARO, V_PRESSURE);
MyMessage msgWindSpeed(CHILD_ID_WINDSPEED, V_WIND);
MyMessage msgRain(CHILD_ID_RAIN, V_TRIPPED);
void setup()
{
analogReference(INTERNAL);
gw.begin(incomingMessage, 3, true);
//dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);
bmp.begin();
gw.sendSketchInfo("Weather Sensor", "1.0");
gw.present(CHILD_ID_HUM, S_HUM, "WS Humidity");
gw.present(CHILD_ID_TEMP, S_TEMP, "WS Temperature");
gw.present(CHILD_ID_LIGHT, S_LIGHT_LEVEL, "WS Lux");
gw.present(CHILD_ID_BARO, S_BARO, "WS Pressure");
gw.present(CHILD_ID_BTEMP, S_TEMP, "WS P Temperature");
gw.present(CHILD_ID_WINDSPEED, S_WIND, "WS Windspeed");
gw.present(CHILD_ID_RAIN, S_MOTION, "WS Rain");
pinMode(DIGITAL_INPUT_RAIN_SENSOR, INPUT);
lightSensor.begin();
metric = gw.getConfig().isMetric;
}
// Wind Meter https://github.com/chiemseesurfer/arduinoWeatherstation/blob/master/weatherstation/weatherstation.ino
float windmeter()
{
windmeterStart = millis(); // Actual start time measuringMessung
windmeterStartAlt = windmeterStart; // Save start time
windSpeedPinCounter = 0; // Set pulse counter to 0
windSpeedPinStatusAlt = HIGH; // Set puls status High
while ((windmeterStart - windmeterStartAlt) <= windmeterTime) // until 10000 ms (10 Seconds) ..
{
windSpeedPinStatus = digitalRead(windSpeedPin); // Read input pin 2
if (windSpeedPinStatus != windSpeedPinStatusAlt) // When the pin status changed
{
if (windSpeedPinStatus == HIGH) // When status - HIGH
{
windSpeedPinCounter++; // Counter + 1
}
}
windSpeedPinStatusAlt = windSpeedPinStatus; // Save status for next loop
windmeterStart = millis(); // Actual time
}
windSpeed = ((windSpeedPinCounter * 24) / 10) + 0.5; // WindSpeed - one Pulse ~ 2,4 km/h,
windSpeed = (windSpeed / (windmeterTime / 1000)); // Devided in measure time in seconds
Serial.print("wind Speed : ");
Serial.println(windSpeed);
knoten = windSpeed / 1.852; //knot\'s
return windSpeed;
}
void loop()
{
updateCount += 1;
if (updateCount == updateAll) {
lastTemp = -1;
lastHum = -1;
lastLux = -1;
lastBmpTemp = -1;
lastPressure = -1;
lastRainValue = -1;
lastBatteryPcnt = -1;
updateCount = 0;
}
delay(2000);
int chk = DHT.read22(HUMIDITY_SENSOR_DIGITAL_PIN);
temp = DHT.temperature;
//Serial.print("Temperature DHT :");
//Serial.println(temp);
if (isnan(temp)) {
lastTemp = -1;
} else if (temp != lastTemp) {
lastTemp = temp;
if (!metric) {
temp = temp * 1.8 + 32.0;
}
gw.send(msgTemp.set(temp, 1));
}
hum = DHT.humidity;
if (isnan(hum)) {
lastHum = -1;
} else if (hum != lastHum) {
lastHum = hum;
gw.send(msgHum.set(hum, 1));
}
uint16_t lux = lightSensor.readLightLevel();
if (lux != lastLux) {
gw.send(msgLux.set(lux));
lastLux = lux;
}
float pressure = bmp.readSealevelPressure(altitude) * 0.01;
float bmptemp = bmp.readTemperature();
if (!metric) {
bmptemp = bmptemp * 1.8 + 32.0;
}
if (bmptemp != lastBmpTemp) {
gw.send(msgBtemp.set(bmptemp,1));
lastBmpTemp = bmptemp;
}
if (pressure != lastPressure) {
gw.send(msgPressure.set(pressure, 0));
lastPressure = pressure;
}
bIsRaining = !(digitalRead(DIGITAL_INPUT_RAIN_SENSOR));
Serial.print("Is Raining :");
Serial.println(bIsRaining);
if(bIsRaining){
strRaining = "YES";
}
else{
strRaining = "NO";
}
//Serial.print("Raining?: ");
//Serial.print(strRaining);
//Serial.print("t Moisture Level: ");
//Serial.println(nRainVal);
//http://henrysbench.capnfatz.com/henrys-bench/arduino-sensors-and-input/arduino-rain-sensor-module-guide-and-tutorial/
gw.send(msgRain.set(bIsRaining, 1));
wind = windmeter();
Serial.print("Wind : ");
Serial.println(wind);
gw.send(msgWindSpeed.set(wind, 1));
int sensorValue = analogRead(BATTERY_SENSE_PIN);
int batteryPcnt = (sensorValue - batteryBasement) * batteryConstant;
if (lastBatteryPcnt != batteryPcnt) {
gw.sendBatteryLevel(batteryPcnt);
lastBatteryPcnt = batteryPcnt;
}
gw.sleep(SLEEP_TIME);
}
void incomingMessage(const MyMessage & message) {
// We only expect one type of message from controller. But we better check anyway.
if (message.isAck()) {
Serial.println("This is an ack from gateway");
}
}
Tu jest adres tego
https://www.domoticz.com/forum/viewtopic.php?f=42&t=11490&p=82522&hilit=wind+meter#p82522
hej sory za odgrzewanie tematu ale mam problem i nie wiem jak go rozwiązać , potrzebował bym podpiąć czujnik temp pod WS2812B tak aby zmieniały barwę z czerwonej / ciepła woda / na niebieską / zimna woda / mógł by mi ktoś pomóc ze skeczem ? był bym wdzięczny :)
źle mi mierzy temp na zewnątrz gdzie jest błąd?
Co znaczy źle? Wewnątrz było dobrze a na zewnątrz źle?
Hej,
Mam problem. Czujnik pokazuje nieprawidlowe pomiary. Jak zaczynam go dotykac to temperatura i Wilgotnosc sie zmieniaja, ale porownuje to ze stacja pogodowa ktora mam w domu i wyniki sa mocno rozbierzne (2st C i 30% wilgotnosci). Spotkales sie moze z takim problemem?
Pozdrawiam
O ile 2st C mogę zrozumieć, to różnica 30% wilgotności jest spora - sprawdzałeś inny czujnik?
A bawił się ktoś może czujnikiem AM2322 pracującym na magistrali I2C? Odczytałem jego adres I2C ale nie wiem jak odczytać tą magistralą dane temperatury i wilgotności. Po podłączeniu go tak jak starsze czujniki (1 przewód) mam wartości rozbieżne podobnie jak SiMet. Szukałem w Internecie ale wszystkie opisy są pod starsze czujniki podłączone jednoprzewodowo.
Hej, macie pomysł jak wyświetlić dane zebrane przez dht11 w czasie rzeczywistym w oknie przeglądarki ? Połączenie przez ethernetshield. W książce Arduino w akcji jest zapis client.println(analogRead(0)); i niby po dodaniu tego wpisu do opisanego w książce szkicu serwera wwww analogowy czujnik powinien wyświetlić temp. jednakże nie mam analogowego czujnika więc starałem się zainicjować cyfrowy czujnik dht11 czy mógłby ktoś podpowiedzieć jak poprawnie to zainicjować ? Dopiero się uczę w związku z tym proszę o wyrozumiałość. Później będę kombinował z mysql jednak na razie chciałbym odczytać chodź by jeden wynik i wyświetlić go w oknie przeglądarki. Pozdro!
Witam,
mam mały problem, gdy dodaję bibliotekę DHT.h to nie mogę skompilować
programu i wyskakuje mi błąd:
exit status 1
Błąd kompilacji dla płytki Arduino / Genuino Uno.
Wie może ktoś o co może chodzić?
Pozdrawiam
Narzędzia -> Płytka i wybierz tą którą masz.
Mi pomogło po aktualizacji.
Witam.
Dlaczego wyświetlane wartości temp. jak i wilgotności mają wyzerowany człon po przecinku? tylko 34.00 i 25.00. Powiem szczerze mam ten sam problem, zmiana wartości o cały stopień - 25.00 26.00 itd.
Pozdrawiam
Bo DHT11 tak juz ma.