#113Anfänger

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.

4.6(36)
55 abgeschlossen
Messung der Lichtintensität mit dem ESP32-LDR-Modul
Ein einfacher Lichtmesser, der dir in Prozent zeigt, wie hell es in deinem Zimmer ist. Der Lichtsensor misst die Umgebung, und der ESP32 rechnet das so um, dass Dunkelheit null und volle Helligkeit hundert ergibt, und schreibt es jede halbe Sekunde auf deinen Computerbildschirm. Bevor du ein Nachtlicht baust, findest du so heraus, bei welcher Helligkeit die Lampe angehen soll.

Video

Schaltplan

Messung der Lichtintensität mit dem ESP32-LDR-Modul - Circuit

Quellcode

Arduino (C++)
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}
45

FAQ

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.

Messung der Lichtintensität mit dem ESP32-LDR-Modul | BlueGrays