Messung der Lichtintensität mit dem ESP32-LDR-Modul
Echtzeit-Anzeige des ADC-Rohwerts des LDR-Moduls und des anhand von Dunkel- und Hellreferenzwerten berechneten relativen Lichtwerts in Prozent im Serial Monitor. Dieser Prozentwert ist keine Lux-Messung. Vermittelt die Kalibrierungslogik des Moduls. Sollte idealerweise vor Projekt 10 durchgeführt werden, da es zur Festlegung des Schwellenwerts dient.

Video
Schaltplan

Quellcode
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Messung der Lichtintensität mit dem ESP32-LDR-Modul
4// ─────────────────────────────────────────
5// Liest den Analogausgang (AO) des LDR-Moduls mit dem 12-Bit-ADC und
6// rechnet ihn mit den Kalibrierwerten in einen Lichtanteil von 0-100 um.
7// Das Ergebnis wird alle 0.5 s im Serial Monitor ausgegeben (115200 Baud).
8//
9// Pins:
10// GPIO 34 (klassischer ESP32) / GPIO 1 (ESP32-S2/S3) -> LDR-Modul AO
11// LDR-Modul VCC -> 3V3, GND -> GND
12
13#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
14 const int LDR_PIN = 1; // ESP32-S2/S3: ADC1_CH0
15#else
16 // Klassischer ESP32 DevKit V1: ADC1_CH6, nur Eingang. GPIO 1 kollidiert hier mit Serial TX
17 const int LDR_PIN = 34;
18#endif
19
20// Kalibrierung: Miss in deinem eigenen Raum und trage die Werte hier ein. Beim LDR-Modul FÄLLT die
21// AO-Spannung (und der Rohwert), je heller das Licht wird.
22const int RAW_DARK = 4000; // Dunkel (Rohwert)
23const int RAW_LIGHT = 100; // Licht (Rohwert)
24
25void setup() {
26 Serial.begin(115200);
27 analogReadResolution(12); // 12 Bit erzwingen
28 Serial.println("LDR Okuma / LDR Reading");
29 Serial.println("-----------------------------");
30}
31
32void loop() {
33 int raw = analogRead(LDR_PIN);
34 // Auf den Kalibrierbereich begrenzen, dunkel = 0%
35 int clipped = constrain(raw, RAW_LIGHT, RAW_DARK);
36 int percent = map(clipped, RAW_DARK, RAW_LIGHT, 0, 100);
37
38 Serial.print("Raw: ");
39 Serial.print(raw);
40 Serial.print(" | Light: %");
41 Serial.println(percent);
42
43 delay(500);
44}
45FAQ
Welche Werte liefert der ADC des ESP32?▾
Der ADC des ESP32 ist ein 12-Bit-Wandler und liefert Werte im Bereich von 0 bis 4095. Da sich dieser Bereich vom Bereich des Arduino Uno (0–1023) unterscheidet, musst du die Schwellenwerte und Berechnungen entsprechend anpassen.
Die analogen Messwerte sind gestört, wenn das WLAN eingeschaltet ist – warum?▾
Der ADC2-Kanal (GPIO 0, 2, 4, 12–15, 25–27) des ESP32 kann nicht verwendet werden, wenn WLAN aktiviert ist. Das Anschließen von analogen Sensoren an die ADC1-Pins (GPIO 32–39) beugt diesem Problem vor.
Ist der angezeigte Wert der tatsächliche Lux-Wert?▾
Nein, dieser Code berechnet keine Lux-Werte; er zeigt den ADC-Rohwert und einen relativen Lichtwert in Prozent anhand der gewählten Dunkel- und Hellreferenzwerte an. Die Reaktion des LDR ist nicht linear und variiert von Modell zu Modell. Für eine präzise Lux-Messung wird ein kalibrierter Sensor wie der BH1750 verwendet.
Warum liefert der ADC des ESP32 an den Endwerten fehlerhafte Messwerte?▾
Der ADC des ESP32 ist in den Bereichen nahe 0 V und 3,3 V nicht linear. Die Funktion `analogReadMilliVolts()` liefert kalibrierte Werte; bei kritischen Messungen werden die genauesten Ergebnisse erzielt, wenn im Bereich von 0,1 bis 3,1 V gearbeitet wird.
