Software: Sensor Luftfeuchte und Temperatur DHT11

Nun zum Sensor für Luftfeuchte und Temperatur, dem DHT11. Der Anschluss ist einfach und schnell gemacht. Die Spannungsversorgung wird über 2 I/O Pins vorgenommen, somit kann man den Sensor auf drei (vier, da ein Pin nicht angeschlossen ist) nebeneinander liegende Ports stecken und die Pins entsprechend programmieren. Mit dem DHTTester Programm lässt sich der Sensor komfortabel ausprobieren. Nach der Programmierung für das Projekt funktioniert der Sensor einwandfrei.

Damit sieht die Sensor Software so aus:

/****************************************************************************
* Projekt – Messtechnik 1
* (c) 2017 softwareentwicklung-als-prozess.de
* Dokumentation s. Blog
***************************************************************************/

// Sensor Pins
// DHT11: GND pin -> Arduino Digital 47
// VCC pin -> Arduino Digital 49
// I/O pin -> Arduino Digital 51
#define DHT11_GND_PIN 47
#define DHT11_VCC_PIN 49
#define DHTPIN 51 // DHT11 data pin
#define DHTTYPE DHT11

// Int the DHT11 Sensor
// Set data pin
DHT_Unified dht(DHTPIN, DHTTYPE);

void setup()
{
DebugPrintInit();
DebugPrint(„Messtechnik1 – Display + Tasten“);

// LCD
lcd.begin(16, 2); // Anzahl Spalten und Zeilen vom Display setzen
lcd.setBacklight(ON); // Beleuchtung einschalten
lcd.clear(); // erstmal alles loeschen
lcd.home(); // Cursor nach links oben
ActualizeDisplay(); // Werte ausgeben

// RTC
RTCActivate(); // RTC aktivieren
RTCCheckStatus(); // RTC Status einlesen
RTCRead(); // RTC einlesen
ActualizeDisplay(); // eingelesene Werte ausgeben
SaveTimeToFallback(); // aktuelle Zeit merken
RTCStart(); // RTC Clock starten

// DHT11
DHT11Activate(); // Temp-/Feuchtesensor aktivieren
dht.begin(); // Schnittstelle init
DHT11GetInfoTemperature(); // Sensorinformation einlesen
DHT11GetInfoHumidity(); // Sensor Messwerte einlesen
delayMS = sensor.min_delay / 1000; // Wartezeit berechnen
temperatur = DHT11ReadTemperature(); // Temperaturwert
feuchte = DHT11ReadHumidity(); // relative Luftfeuchte
#ifdef DEBUG
Serial.print(„Verzoegerungszeit = „);
Serial.print(delayMS,DEC);
Serial.println(“ ms“);
#endif
ActualizeDisplay(); // eingelesene Werte ausgeben

starttime = actualtime = millis(); // naechste Minute Wartezeit starten
DebugPrint(„Setup abgeschlossen“);
}

void loop()
{
uint8_t buttons = (uint8_t)0;

if ((actualtime – starttime) > MINUTE) // Eine Minute ist abgelaufen
{
DebugPrint(„Minute abgelaufen: RTC und Messwerte einlesen“);
RTCRead(); // RTC einlesen
// Messwerte einlesen
temperatur = DHT11ReadTemperature(); // Temperaturwert
feuchte = DHT11ReadHumidity(); // relative Luftfeuchte
CursorBlinkAus(); // Cursor und Blinken aus
ActualizeDisplay(); // Werte ausgeben
buttonpressed = false; // kein Button gedrueckt
starttime = millis(); // Start fuer naechste Minute
RestoreFallbackToTime(); // keine neuen Werte uebernommen
} // Innerhalb der minute
actualtime = millis(); // aktuelle Zeit einlesen
CheckTimeOverrun(); // Ueberlauf von millis() oder Programmfehler
buttons = GetButtons(); // Tasten einlesen
CheckButtons(buttons); // Tasten vorauswerten
if (selectbuttonpressed == true) // Select Taste wurde gedrueckt
{
selectbuttonpressed = false; // Select Taste fertig ausgewertet
RTCWrite(); // RTC mit neuer Zeit setzen
CursorBlinkAus(); // Cursor und Blinken aus
ActualizeDisplay(); // Werte ausgeben
curpos = (byte)CURSORMARGINLEFT; // Cursor auf Startposition
lcd.setCursor(curpos,0); // auf Startposition setzen
}
}

// Software – Temperatur- und Luftfeuchte Sensor ——————————-
void DHT11Activate(void)
{
digitalWrite(DHT11_GND_PIN, LOW); // GND = 0 Volt
pinMode(DHT11_GND_PIN, OUTPUT);
digitalWrite(DHT11_VCC_PIN, HIGH); // VCC = +5 Volt
pinMode(DHT11_VCC_PIN, OUTPUT);
DebugPrint(„DHT aktiviert“);
delay(1000); // Warten auf Chip…
}

void DHT11GetInfoTemperature(void)
{
dht.temperature().getSensor(&sensor);
#ifdef DEBUG
Serial.println(„Temperatur“);
Serial.print („Sensor: „); Serial.println(sensor.name);
Serial.print („Driver Ver: „); Serial.println(sensor.version);
Serial.print („Unique ID: „); Serial.println(sensor.sensor_id);
Serial.print („Max Value: „); Serial.print(sensor.max_value); Serial.println(“ *C“);
Serial.print („Min Value: „); Serial.print(sensor.min_value); Serial.println(“ *C“);
Serial.print („Resolution: „); Serial.print(sensor.resolution); Serial.println(“ *C“);
#endif
}

void DHT11GetInfoHumidity(void)
{
dht.humidity().getSensor(&sensor);
#ifdef DEBUG
Serial.println(„relative Luftfeuchte“);
Serial.print („Sensor: „); Serial.println(sensor.name);
Serial.print („Driver Ver: „); Serial.println(sensor.version);
Serial.print („Unique ID: „); Serial.println(sensor.sensor_id);
Serial.print („Max Value: „); Serial.print(sensor.max_value); Serial.println(„%“);
Serial.print („Min Value: „); Serial.print(sensor.min_value); Serial.println(„%“);
Serial.print („Resolution: „); Serial.print(sensor.resolution); Serial.println(„%“);
#endif
}

byte DHT11ReadTemperature(void)
{
byte retval = (byte)0;

delay(delayMS * 2); // Wartezeit einhalten
dht.temperature().getEvent(&event); // Temperatur einlesen
if (isnan(event.temperature))
{
DebugPrint(„DHT11 Lesefehler!“);
}
else
{
#ifdef DEBUG
Serial.print(„Temperatur: „);
Serial.print(event.temperature);
Serial.println(“ *C“);
#endif
retval = byte((event.temperature + (float)0.5));
}
return(retval);
}

byte DHT11ReadHumidity(void)
{
byte retval = (byte)0;

delay(delayMS * 2); // Wartezeit einhalten
dht.humidity().getEvent(&event); // Luftfeuchte einlesen
if (isnan(event.relative_humidity))
{
DebugPrint(„Error reading humidity!“);
}
else
{
#ifdef DEBUG
Serial.print(„relative Luftfeuchte: „);
Serial.print(event.relative_humidity);
Serial.println(“ %“);
#endif
retval = byte((event.relative_humidity + (float)0.5));
}
return(retval);
}

Links

Die Systemspezifikation

Datenblatt Micropik

Klicke, um auf dht11.pdf zuzugreifen

Datenblatt Aosong

Klicke, um auf DHT11.pdf zuzugreifen

Anleitung von Adafruit

Klicke, um auf dht.pdf zuzugreifen

Die verwendeten Bibliotheken von Adafruit
https://github.com/adafruit/DHT-sensor-library
https://github.com/adafruit/Adafruit_Sensor

Veröffentlicht von

Jürgen

Ich bin Software Ingenieur und habe meine Schwerpunkte in allen Aktivitäten, die zur Software Entwicklung gehören. Am längsten bin ich als Software Entwickler von Embedded Software in C tätig.