diff --git a/firmware/dht11_lcd/dht11_lcd.ino b/firmware/dht11_lcd/dht11_lcd.ino new file mode 100644 index 0000000..693a100 --- /dev/null +++ b/firmware/dht11_lcd/dht11_lcd.ino @@ -0,0 +1,106 @@ +#include +#include "DHT.h" +#include +#include "Adafruit_CCS811.h" + +// --- LCD Setup --- +// Initialisierung des LCDs mit den Pins aus deinem Schaltplan +// RS = 7, E = 8, D4 = 9, D5 = 10, D6 = 11, D7 = 12 +LiquidCrystal lcd(7, 8, 9, 10, 11, 12); + +// --- DHT11 Setup --- +#define DHTPIN 2 // Der DHT11 Daten-Pin ist an Pin 2 angeschlossen +#define DHTTYPE DHT11 // Sensortyp festlegen +DHT dht(DHTPIN, DHTTYPE); + +// --- CJMCU-811 (CCS811) Setup --- +// I2C: SDA = A4, SCL = A5 (Arduino Uno). Der WAK-Pin des Moduls muss an GND liegen. +// Standardadresse 0x5A (ADDR an GND), alternativ 0x5B. +Adafruit_CCS811 ccs; +bool ccsOk = false; + +// Anzeige wechselt zwischen zwei Seiten, da das LCD nur 2 Zeilen hat +bool zeigeLuftqualitaet = false; + +void setup() { + // LCD initialisieren (16 Spalten, 2 Zeilen) + lcd.begin(16, 2); + + // DHT Sensor starten + dht.begin(); + + // CCS811 starten + ccsOk = ccs.begin(0x5A); + + // Kurze Startnachricht + lcd.setCursor(0, 0); + lcd.print("Sensor startet.."); + + // Der DHT11 braucht nach dem Start einen Moment + delay(2000); + lcd.clear(); +} + +void loop() { + // WICHTIG: Der DHT11 ist ein langsamer Sensor. + // Er benötigt ca. 2 Sekunden Pause zwischen den Messungen. + delay(2000); + + // Werte für Luftfeuchtigkeit und Temperatur auslesen + float h = dht.readHumidity(); + float t = dht.readTemperature(); + + // Überprüfen, ob das Auslesen fehlgeschlagen ist (z.B. Kabel locker) + if (isnan(h) || isnan(t)) { + lcd.clear(); + lcd.setCursor(0, 0); + lcd.print("Sensor Fehler!"); + return; // Loop hier abbrechen und von vorne starten + } + + // --- Seite 2: CO2 und TVOC vom CCS811 --- + if (zeigeLuftqualitaet) { + zeigeLuftqualitaet = false; + + lcd.clear(); + if (!ccsOk) { + lcd.setCursor(0, 0); + lcd.print("CCS811 Fehler!"); + return; + } + + // Temperatur/Feuchte zur Kompensation an den CCS811 geben + ccs.setEnvironmentalData(h, t); + + if (ccs.available() && !ccs.readData()) { + lcd.setCursor(0, 0); + lcd.print("CO2: "); + lcd.print(ccs.geteCO2()); + lcd.print(" ppm"); + + lcd.setCursor(0, 1); + lcd.print("TVOC: "); + lcd.print(ccs.getTVOC()); + lcd.print(" ppb"); + } else { + lcd.setCursor(0, 0); + lcd.print("CCS811 wartet.."); + } + return; + } + + // --- Seite 1: Ausgabe auf dem LCD Display --- + zeigeLuftqualitaet = true; + + // Zeile 1: Temperatur + lcd.setCursor(0, 0); // Spalte 0, Zeile 0 + lcd.print("Temp: "); + lcd.print(t, 1); // Die ", 1" sorgt dafür, dass nur eine Nachkommastelle gezeigt wird + lcd.print(" C "); // Leerzeichen am Ende überschreiben eventuelle alte Zeichen + + // Zeile 2: Luftfeuchtigkeit + lcd.setCursor(0, 1); // Spalte 0, Zeile 1 + lcd.print("Luft: "); + lcd.print(h, 1); + lcd.print(" % "); +}