DHT11 1-Wire Luftfeuchtigkeit und Temperatur Sensor

Veröffentlicht von

Auf meinem Roboter Julia habe ich auch das DFRobot DHT11 Luftfeuchtigkeit und Temperatur Modul verbaut. Da hat Julia zwar nichts von, aber ich mag alle Arten von Sensoren 🙂

Der DHT11 ist ein 1-Wire Sensor mit digitalem Ausgang. Er verbraucht also nur einen Portpin. In meinem Fall ist es Pin3, eigentlich einer der Analogeingänge, man kann ihn aber auch als digitalen Eingang verwenden.

Näheres zum Sensor findet ihr im Datenblatt .

Bei DFRobot gibt es auch ein ZipFile mit Beispiel Code für den Arduino. Diesen Code verwende ich auch, ich spreche den Sensor alle 5 Sekunden über die Metro library an.

Bei einer Messgenauigkeit von +/- 5% bei der Luftfeuchte und +/-2C bei der Temperatur darf man natürlich keine wunder erwarten.

Verglichen mit einer digitalen Wetterstationen arbeitet er, zumindest bei der Temperatur recht genau.Bei der Luftfeuchtigkeit sieht das allerdings anders aus. Hier mal ein Bild der seriellen Konsole, die Wetterstation zeigt gleichzeitig 45% und 23,4 °C.

Der Unterschied bei der Luftfeuchtigkeit ist doch schon deutlich, dabei traue ich der Wetterstation ein wenig mehr. Aber wie gesagt, bei dem Preis des Sensors erwarte ich kein Wunder an Genauigkeit.

Hier ein funktionierender Auszug aus Julias Code:

#include
#define DHT11_PIN 3

Metro dhtl11Metro = Metro(5000); 

void setup(void)
{
 Serial.begin(115200);
 Serial.print ("** DHT11 "); Serial.print (__DATE__); Serial.print (" "); Serial.println (__TIME__);
 delay(500);
}

void loop(void)
{
 if (dhtl11Metro.check() == 1) {
 outdht11();
 }
}

byte read_dht11_dat()
{

 byte i = 0;
 byte result=0;
 for(i=0; i< 8; i++)
 {
 while(!(PINC & _BV(DHT11_PIN)));  // wait for 50us
 delayMicroseconds(30);
 if(PINC & _BV(DHT11_PIN))
 result |=(1<<(7-i));
 while((PINC & _BV(DHT11_PIN)));  // wait '1' finish
 }
 return result;
}

void outdht11(void)
{
 DDRC |= _BV(DHT11_PIN);
 PORTC |= _BV(DHT11_PIN);

 byte dht11_dat[5];
 byte dht11_in;
 byte i;// start condition
 // 1. pull-down i/o pin from 18ms
 PORTC &= ~_BV(DHT11_PIN);
 delay(18);
 PORTC |= _BV(DHT11_PIN);
 delayMicroseconds(40);
 DDRC &= ~_BV(DHT11_PIN);
 delayMicroseconds(40);

 dht11_in = PINC & _BV(DHT11_PIN);
 if(dht11_in)
 {
 Serial.println("dht11 start condition 1 not met");
 return;
 }
 delayMicroseconds(80);
 dht11_in = PINC & _BV(DHT11_PIN);
 if(!dht11_in)
 {
 Serial.println("dht11 start condition 2 not met");
 return;
 }

 delayMicroseconds(80);// now ready for data reception
 for (i=0; i<5; i++)
 dht11_dat[i] = read_dht11_dat();
 DDRC |= _BV(DHT11_PIN);
 PORTC |= _BV(DHT11_PIN);
 byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];// check check_sum
 if(dht11_dat[4]!= dht11_check_sum)
 {
 Serial.println("DHT11 checksum error");
 }
 Serial.print("Current humdity = ");
 Serial.print(dht11_dat[0], DEC);
 Serial.print(".");
 Serial.print(dht11_dat[1], DEC);
 Serial.print("%  ");
 Serial.print("temperature = ");
 Serial.print(dht11_dat[2], DEC);
 Serial.print(".");
 Serial.print(dht11_dat[3], DEC);
 Serial.println("C  ");
}

2 Kommentare

  1. Danke für die Info, ich habe es angepasst. Den Code findest du aber auch in dem beschriebenen Zip File.
    Gruß Ingo

  2. Hallo,

    da gibt es ein paar Fehler im Code bedingt durch den Zeichensatz. Könntet ihr das vielleicht bei Gelegenheit anpassen?

    Danke
    Peter

Kommentar verfassen