From 08439581028b36f0c4fe87a9117c951824a703ec Mon Sep 17 00:00:00 2001 From: 3020772 <3020772@stud.hs-mannheim.de> Date: Tue, 3 Nov 2026 11:06:36 +0100 Subject: [PATCH] Fotowiderstand an A0: Helligkeit als dritte LCD-Seite Zweiter LDR (Fenster, A1) ist vorbereitet, aber per LDR_FENSTER_AKTIV deaktiviert, bis er angeschlossen ist. README um Verkabelung ergaenzt. Co-Authored-By: Claude Opus 5.5 --- README.md | 7 ++++-- firmware/dht11_lcd/dht11_lcd.ino | 41 ++++++++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ef61e09..4d96ce5 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,8 @@ Live-Messwerte laufen Ende-zu-Ende: Der Arduino misst Temperatur, Luftfeuchte, e | **Arduino Uno** (Haupt-Uno) | Herz der Messstation: liest alle 2 s die Sensoren, zeigt die Werte auf dem LCD und gibt sie an den ESP weiter. | | **DHT11** | Misst **Temperatur** (°C) und **Luftfeuchte** (%). Langsam, braucht ca. 2 s zwischen zwei Messungen. | | **CCS811 / CJMCU-811** | Misst die Luftqualität: **eCO₂** (ppm) und **TVOC** (ppb, flüchtige organische Stoffe). eCO₂ ist ein aus den Gasen *geschätzter* CO₂-Wert, keine echte CO₂-Messung. Temperatur und Feuchte vom DHT11 bekommt er zur Korrektur. In den ersten ~20 min nach dem Einschalten oft 400 ppm / 0 ppb. | -| **LCD 16×2** | Zeigt die Werte direkt an der Station. Nur 2 Zeilen, daher Wechsel zwischen Temp/Luft und CO2/TVOC. Beim Start zeigt es den WLAN-Status („WLAN OK“ oder „Fehler E1“ …). | +| **Fotowiderstand (LDR)** | Misst die **Helligkeit** an der Tafel als relativen Wert (0–100 %, keine Lux). Ein zweiter für das Fenster ist vorgesehen, aber noch nicht angeschlossen. Wird bisher nur auf dem LCD angezeigt, nicht ans Backend gesendet. | +| **LCD 16×2** | Zeigt die Werte direkt an der Station. Nur 2 Zeilen, daher Wechsel zwischen Temp/Luft, CO2/TVOC und Licht. Beim Start zeigt es den WLAN-Status („WLAN OK“ oder „Fehler E1“ …). | | **Potentiometer** | Stellt den Kontrast des LCD ein. | | **ESP-01 (ESP8266)** | WLAN-Modul, da der Uno selbst kein WLAN hat. Der Uno schickt ihm Textbefehle („AT-Befehle“), der ESP verbindet sich mit dem Hotspot und schickt die Werte an den Laptop. | | **Zweiter Uno** | Liefert dem ESP nur Strom (3,3 V), weil der Haupt-Uno zu wenig Strom für den ESP hat. Braucht **gemeinsame Masse** (GND) mit dem Haupt-Uno. | @@ -53,7 +54,7 @@ Live-Messwerte laufen Ende-zu-Ende: Der Arduino misst Temperatur, Luftfeuchte, e ### Ablauf einer Messung 1. Der **Uno** liest **DHT11** und **CCS811** aus und zeigt die Werte auf dem **LCD**. -2. Etwa alle 4 s schickt er sie über Pin 0/1 an den **ESP-01**. +2. Etwa alle 6 s schickt er DHT11- und CCS811-Werte über Pin 0/1 an den **ESP-01**. 3. Der ESP sendet sie über den **Hotspot** an den **Laptop** (`server.py`, Port 3000). 4. Der **Browser** fragt den Server alle 2 s nach den neuesten Werten und zeigt sie auf der Website. @@ -63,6 +64,8 @@ Live-Messwerte laufen Ende-zu-Ende: Der Arduino misst Temperatur, Luftfeuchte, e | DHT11 | Daten → Pin 2 | | LCD 16×2 | RS 7, E 8, D4–D7 → 9–12, RW → GND, V0 → Poti | | CCS811 (CJMCU-811) | VCC → 3,3 V, GND, SDA → A4, SCL → A5, WAK → GND, ADD → GND (Adresse 0x5A) | +| LDR Tafel | Ein Bein → 5 V, anderes Bein → A0 und über 10 kΩ → GND | +| LDR Fenster (noch nicht angeschlossen) | Ein Bein → 5 V, anderes Bein → A1 und über 10 kΩ → GND; danach im Sketch `LDR_FENSTER_AKTIV` auf `true` setzen | | ESP-01 | **TX → Pin 0, RX → Pin 1 (gekreuzt!)**, VCC + EN → 3,3 V, GND; RST, GPIO0, GPIO2 frei | Der 3,3-V-Pin des Uno liefert nur ca. 150 mA, der ESP-01 braucht beim Start kurz bis zu 300 mA. Wir versorgen den ESP deshalb aus einer eigenen 3,3-V-Quelle (zweiter Uno); deren **GND muss mit dem GND des Haupt-Uno verbunden** sein. diff --git a/firmware/dht11_lcd/dht11_lcd.ino b/firmware/dht11_lcd/dht11_lcd.ino index e7c36fe..2edf95b 100644 --- a/firmware/dht11_lcd/dht11_lcd.ino +++ b/firmware/dht11_lcd/dht11_lcd.ino @@ -21,6 +21,17 @@ DHT dht(DHTPIN, DHTTYPE); Adafruit_CCS811 ccs; bool ccsOk = false; +// --- Fotowiderstände (LDR) Setup --- +// Je ein Spannungsteiler: 5V -> LDR -> Analogpin -> 10 kOhm -> GND. Heller = höherer Wert. +#define LDR_TAFEL_PIN A0 +#define LDR_FENSTER_PIN A1 +const bool LDR_FENSTER_AKTIV = false; // auf true setzen, sobald der zweite LDR an A1 hängt (offener Pin liefert Zufallswerte) + +// Helligkeit in Prozent des Messbereichs (relativer Wert, keine Lux) +int lichtProzent(uint8_t pin) { + return map(analogRead(pin), 0, 1023, 0, 100); +} + // --- CCS811-Baseline im EEPROM --- // Die Baseline ist der Kalibrierwert des Sensors. Wird sie nach einem Neustart // wieder gesetzt, ist der eCO2/TVOC-Wert sofort deutlich stabiler. @@ -70,8 +81,9 @@ void ccsStarten() { } } -// Anzeige wechselt zwischen zwei Seiten, da das LCD nur 2 Zeilen hat -bool zeigeLuftqualitaet = false; +// Anzeige wechselt zwischen drei Seiten, da das LCD nur 2 Zeilen hat +enum Seite { SEITE_KLIMA, SEITE_LUFTQUALITAET, SEITE_LICHT }; +uint8_t seite = SEITE_KLIMA; void setup() { // Serial gehoert dem ESP8266 (wird in wifiVerbinden() gestartet), kein Serial-Monitor moeglich @@ -124,9 +136,28 @@ void loop() { return; // Loop hier abbrechen und von vorne starten } + // --- Seite 3: Helligkeit an Tafel und Fenster --- + if (seite == SEITE_LICHT) { + seite = SEITE_KLIMA; + + lcd.clear(); + lcd.setCursor(0, 0); + lcd.print("Tafel: "); + lcd.print(lichtProzent(LDR_TAFEL_PIN)); + lcd.print(" %"); + + if (LDR_FENSTER_AKTIV) { + lcd.setCursor(0, 1); + lcd.print("Fenster: "); + lcd.print(lichtProzent(LDR_FENSTER_PIN)); + lcd.print(" %"); + } + return; + } + // --- Seite 2: CO2 und TVOC vom CCS811 --- - if (zeigeLuftqualitaet) { - zeigeLuftqualitaet = false; + if (seite == SEITE_LUFTQUALITAET) { + seite = SEITE_LICHT; lcd.clear(); if (!ccsOk) { @@ -168,7 +199,7 @@ void loop() { } // --- Seite 1: Ausgabe auf dem LCD Display --- - zeigeLuftqualitaet = true; + seite = SEITE_LUFTQUALITAET; // Zeile 1: Temperatur lcd.setCursor(0, 0); // Spalte 0, Zeile 0