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
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