LDR auf dem Cheap Yellow Display auslesen â Schritt fĂŒr Schritt erklĂ€rt
Das Cheap Yellow Display (ESP32-2432S028) besitzt auf der Vorderseite ein kleines, oft ĂŒbersehenes Bauteil: einen Fotowiderstand â kurz LDR (Light Dependent Resistor).
Ein LDR verĂ€ndert seinen Widerstand abhĂ€ngig von der Umgebungshelligkeit. Je heller es ist, desto geringer wird sein Widerstand â in dunkler Umgebung steigt er entsprechend an. Ăber einen analogen Eingang des ESP32 lĂ€sst sich diese Ănderung als Messwert erfassen.
https://youtu.be/8sCQkLe3JlM
In der Praxis kann man dieses Feature sinnvoll nutzen, um das Display automatisch an die Umgebungshelligkeit anzupassen. So bleibt der Bildschirminhalt bei direkter Sonneneinstrahlung gut ablesbar, wĂ€hrend das Display in dunkler Umgebung gedimmt werden kann â ideal fĂŒr Dashboard- oder Smart-Home-Projekte.
In diesem Beitrag zeige ich dir Schritt fĂŒr Schritt, wie du den LDR auf dem Cheap Yellow Display ausliest und in deinem Projekt verwendest.
Cheap Yellow Display - ESP32-2432S028 - Vorderseite
LDR am Cheap Yellow Display - ESP32-2432S028
Hinweis: Der LDR ist fest mit GPIO34 verbunden. GPIO34 und GPIO35 gehören beim ESP32 zu den reinen ADC-EingĂ€ngen und unterstĂŒtzen keine OUTPUT-FunktionalitĂ€t.
Was ist ein LDR ĂŒberhaupt?
Ein LDR (Light Dependent Resistor) ist ein lichtabhÀngiger Widerstand. Er verÀndert seinen elektrischen Widerstand abhÀngig von der Helligkeit der Umgebung.
Das Prinzip ist einfach:
- Viel Licht â niedriger Widerstand - Wenig Licht â hoher Widerstand
Der LDR selbst erzeugt kein Signal. Er ist lediglich ein variabler Widerstand. Damit der ESP32 diesen Helligkeitswert erfassen kann, wird der LDR auf dem Board in einer Spannungsteiler-Schaltung betrieben.
Beim Cheap Yellow Display ist der LDR bereits fest mit GPIO34 (ADC1) verbunden. Eine zusÀtzliche Verdrahtung ist also nicht notwendig.
LDR am Cheap Yellow Display - ESP32-2432S028
LDR am Cheap Yellow Display auslesen
Der LDR auf dem Cheap Yellow Display (ESP32-2432S028) ist fest mit GPIO34 (ADC1) verbunden. Wir lesen den Helligkeitswert ĂŒber den integrierten Analog-Digital-Wandler des ESP32 aus.
Der folgende Sketch gibt den Messwert nur dann aus, wenn sich dieser merklich Àndert. Dadurch vermeiden wir unnötige serielle Ausgaben.
#define ldrPin 34 // LDR am GPIO34 // letzter gelesener Wert vom LDR int lastLDRValue = 0; // Zeitpunkt (in ms) des letzten Lesevorgangs unsigned long lastRead = 0; // Pause zwischen zwei Lesezyklen (in Millisekunden) const int PAUSE = 50; void setup() { // Start der seriellen Kommunikation mit 9600 Baud Serial.begin(9600); // ADC-DĂ€mpfung setzen // siehe: https://docs.espressif.com/projects/arduino-esp32/en/latest/api/adc.html#analogsetattenuation analogSetAttenuation(ADC_0db); } void loop() { // aktuelle Millisekunden seit Start/Reset des Mikrocontrollers ermitteln unsigned long currentMillis = millis(); // prĂŒfen, ob die definierte Pause abgelaufen ist if (currentMillis > (lastRead + PAUSE)) { // Zeitpunkt des letzten Lesevorgangs aktualisieren lastRead = currentMillis; // analogen Wert vom LDR (GPIO34) einlesen int currentLDRValue = analogRead(ldrPin); // nur reagieren, wenn sich der Wert deutlich verĂ€ndert hat (>= 5) if (abs(currentLDRValue - lastLDRValue) >= 5) { // Ausgabe des Messwertes ĂŒber die serielle Schnittstelle // kann z.B. im seriellen Plotter als Liniendiagramm dargestellt werden Serial.println(currentLDRValue); // neuen Wert als Referenz speichern lastLDRValue = currentLDRValue; } } }
Die gelesenen Werte können wir nun im seriellen Monitor der Arduino IDE auslesen oder auch im seriellen Plotter in einem Liniendiagram visualisieren lassen.
Ausgabe der Daten vom LDR im seriellen Monitor der Arduino IDE
visualisieren der Daten vom LDR im seriellen Plotter der Arduino IDE
Anzeigen des Wertes vom LDR auf dem Display des ESP32-2432S028 (CYD)
Nachdem wir den LDR ĂŒber analogRead() auslesen können, soll der Messwert nun direkt auf dem Display des Cheap Yellow Display angezeigt werden.
CYD - Anzeige des Wertes vom LDR auf dem Display
CYD - Anzeige des Wertes vom LDR auf dem Display - Sensor abgedunkelt
HierfĂŒr verwende ich LVGL in Kombination mit der TFT_eSPI-Bibliothek. Der aktuelle Helligkeitswert wird dabei:
- als numerischer Wert angezeigt - zusĂ€tzlich visuell ĂŒber einen Kreis dargestellt, dessen Helligkeit sich abhĂ€ngig vom LDR-Wert verĂ€ndert #include #include #define TFT_HOR_RES 240 #define TFT_VER_RES 320 #define TFT_ROTATION LV_DISPLAY_ROTATION_270 #define DRAW_BUF_SIZE (TFT_HOR_RES * TFT_VER_RES / 10 * (LV_COLOR_DEPTH / 8)) uint32_t draw_buf; #define COLOR_BG lv_color_hex(0x000000) // Hintergrund: Schwarz #define COLOR_WHITE lv_color_hex(0xFFFFFF) // WeiĂ #define COLOR_YELLOW lv_color_hex(0xFDD835) // Gelb #define ldrPin 34 lv_obj_t *ldrValueLabel; int lastLDRValue = 0; unsigned long lastRead = 0; const int PAUSE = 250; lv_obj_t *ldrCircle; void setup() { Serial.begin(9600); analogSetAttenuation(ADC_0db); lv_init(); lv_display_t *disp = lv_tft_espi_create( TFT_HOR_RES, TFT_VER_RES, draw_buf, sizeof(draw_buf)); lv_display_set_rotation(disp, TFT_ROTATION); lv_obj_t *scr = lv_screen_active(); lv_obj_set_style_bg_color(scr, COLOR_BG, 0); lv_obj_set_style_bg_opa(scr, LV_OPA_COVER, 0); lv_obj_set_style_pad_all(scr, 12, 0); lv_obj_set_scrollbar_mode(scr, LV_SCROLLBAR_MODE_OFF); lv_obj_t *ldrDescLabel = lv_label_create(scr); lv_label_set_text(ldrDescLabel, "LDR"); lv_obj_set_style_text_color(ldrDescLabel, COLOR_YELLOW, 0); lv_obj_set_style_text_font(ldrDescLabel, &lv_font_montserrat_28, 0); lv_obj_align(ldrDescLabel, LV_ALIGN_TOP_MID, 0, 0); ldrValueLabel = lv_label_create(scr); lv_label_set_text(ldrValueLabel, "0"); lv_obj_set_style_text_color(ldrValueLabel, COLOR_WHITE, 0); lv_obj_set_style_text_font(ldrValueLabel, &lv_font_montserrat_28, 0); lv_obj_align(ldrValueLabel, LV_ALIGN_TOP_MID, 0, 50); ldrCircle = lv_obj_create(scr); lv_obj_set_size(ldrCircle, 80, 80); lv_obj_set_style_radius(ldrCircle, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_bg_color(ldrCircle, COLOR_YELLOW, 0); lv_obj_set_style_border_width(ldrCircle, 0, 0); lv_obj_set_style_bg_opa(ldrCircle, LV_OPA_0, 0); lv_obj_align(ldrCircle, LV_ALIGN_CENTER, 0, 40); setOpacity(0); } void setOpacity(int currentLDRValue) { int opa = map(currentLDRValue, 0, 1023, 255, 0); opa = constrain(opa, 0, 255); lv_obj_set_style_bg_opa(ldrCircle, (lv_opa_t)opa, 0); } void loop() { lv_tick_inc(5); lv_timer_handler(); unsigned long currentMillis = millis(); if (currentMillis > (lastRead + PAUSE)) { lastRead = currentMillis; int currentLDRValue = analogRead(ldrPin); if (abs(currentLDRValue - lastLDRValue) >= 5) { lastLDRValue = currentLDRValue; Serial.println(currentLDRValue); String s = String(currentLDRValue, DEC); lv_label_set_text(ldrValueLabel, s.c_str()); setOpacity(currentLDRValue); } } delay(5); } Hinweis zur Programmierung mit LVGL
Die grundlegende Einrichtung des Cheap Yellow Display (ESP32-2432S028) in Kombination mit der LVGL-Bibliothek habe ich bereits ausfĂŒhrlich anhand eines kleinen Dashboards erklĂ€rt.
Dort zeige ich unter anderem:
- Einrichtung von LVGL - Einbindung der TFT_eSPI-Bibliothek - Display-Rotation und Buffer-Konfiguration - Erstellen von Labels und grafischen Elementen - Grundlegende Struktur mit lv_timer_handler() und lv_tick_inc()
Falls du neu mit LVGL auf dem CYD arbeitest, empfehle ich dir zunÀchst einen Blick in meine YouTube-Playlist zu diesem Thema: ESP32 CYD Display mit LVGL programmieren - Komplettkurs
In diesem Beitrag konzentrieren wir uns ausschlieĂlich auf das Auslesen und Visualisieren des LDR-Wertes.
Dashboard-Helligkeit automatisch mit dem LDR regulieren
Nachdem wir den LDR-Wert auslesen und visualisieren können, lÀsst sich dieser nun verwenden, um die Helligkeit eines Dashboards automatisch anzupassen.
Dashboard am CYD mit normaler Helligkeit
Dashboard am CYD mit abgedunkelten LDR
In diesem Beispiel simulieren wir ein kleines Dashboard mit:
- Temperaturwert - Statusanzeige - HintergrundflÀche
Je nach Umgebungshelligkeit wird dabei die gesamte Display-Helligkeit bzw. die Hintergrund-Deckkraft angepasst.
#include #include #define TFT_HOR_RES 240 #define TFT_VER_RES 320 #define TFT_ROTATION LV_DISPLAY_ROTATION_270 #define DRAW_BUF_SIZE (TFT_HOR_RES * TFT_VER_RES / 10 * (LV_COLOR_DEPTH / 8)) uint32_t draw_buf; #define COLOR_BG lv_color_hex(0x000000) #define COLOR_WHITE lv_color_hex(0xFFFFFF) #define COLOR_GREEN lv_color_hex(0x4CAF50) #define COLOR_RED lv_color_hex(0xE53935) // 3 Helligkeitsstufen enum BrightnessLevel { BRIGHT, MEDIUM, DARK }; // Farben-Array: lv_color_t colorSet = { // BRIGHT { lv_color_hex(0xFFFFFF), // WeiĂ lv_color_hex(0xFF0000), // Rot lv_color_hex(0x00FF00) // GrĂŒn }, // MEDIUM { lv_color_hex(0xAAAAAA), // Grau lv_color_hex(0xCC4444), // Mittel-Rot lv_color_hex(0x44CC44) // Mittel-GrĂŒn }, // DARK { lv_color_hex(0x555555), // Dunkelgrau lv_color_hex(0x662222), // Dunkelrot lv_color_hex(0x226622) // DunkelgrĂŒn } }; #define ldrPin 34 lv_obj_t *titleLabel; lv_obj_t *tempLabel; lv_obj_t *statusLabel; unsigned long lastUpdate = 0; const int UPDATE_INTERVAL = 1000; BrightnessLevel getBrightnessLevel(int ldrValue) { if (ldrValue < 10) { return BRIGHT; } else if (ldrValue UPDATE_INTERVAL) { lastUpdate = millis(); int ldrValue = analogRead(ldrPin); int temperature = random(20, 35); bool warn = temperature > 30; String tempText = String(temperature) + " °C"; lv_label_set_text(tempLabel, tempText.c_str()); lv_label_set_text(statusLabel, warn ? "WARN" : "OK"); applyColorTheme(ldrValue, warn); } delay(5); }
Fazit
Das Auslesen eines LDR â oder generell anderer analoger Sensoren, die ĂŒber einen Spannungsteiler betrieben werden (z. B. ein NTC-Widerstand) â ist mit dem ESP32 denkbar einfach. Im Grunde benötigt es nur wenige Zeilen Code, um einen stabilen Messwert ĂŒber den ADC einzulesen und weiterzuverarbeiten.
Der integrierte LDR auf dem Cheap Yellow Display ist daher ein kleines, aber praktisches Feature, das sich ohne zusĂ€tzliche Hardware direkt nutzen lĂ€sst. Besonders fĂŒr Projekte mit automatischer Helligkeitsanpassung oder einfachen Umgebungslicht-Erkennungen bietet sich dieser Sensor an.
Deutlich umfangreicher wird der Code erst dann, wenn der Messwert grafisch auf dem Display visualisiert wird. Durch den Einsatz von LVGL wĂ€chst das Projekt spĂŒrbar an â was jedoch der FlexibilitĂ€t und den Gestaltungsmöglichkeiten geschuldet ist. Mit einem einfachen OLED-Display ĂŒber I2C lieĂe sich die reine Anzeige des Messwertes deutlich schlanker umsetzen.
Das Cheap Yellow Display bietet hier jedoch den Vorteil, dass sich Sensorwerte nicht nur anzeigen, sondern auch ansprechend visualisieren lassen â etwa durch grafische Elemente wie Balken, Kreise oder dynamische OberflĂ€chen.

















