Membaca Intensitas Cahaya dengan Modul LDR ESP32
Memantau secara real-time di Serial Monitor nilai ADC mentah modul LDR dan persentase cahaya relatif yang dihitung dari nilai acuan gelap dan terang. Persentase ini bukan pengukuran lux. Mengajarkan logika kalibrasi modul. Ideal dikerjakan sebelum Proyek 10, karena dipakai untuk menentukan nilai ambang.

Video
Skema rangkaian

Kode sumber
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Membaca Intensitas Cahaya dengan Modul LDR ESP32
4// ─────────────────────────────────────────
5// Membaca output analog (AO) modul LDR dengan ADC 12-bit dan mengubahnya
6// menjadi persentase cahaya 0-100 memakai nilai kalibrasi. Hasilnya
7// dikirim ke Serial Monitor (115200 baud) setiap 0.5 s.
8//
9// Pin:
10// GPIO 34 (ESP32 klasik) / GPIO 1 (ESP32-S2/S3) -> AO modul LDR
11// VCC modul LDR -> 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 // ESP32 DevKit V1 klasik: ADC1_CH6, hanya input. GPIO 1 bentrok dengan Serial TX di sini
17 const int LDR_PIN = 34;
18#endif
19
20// Kalibrasi: ukur di ruanganmu sendiri dan masukkan nilainya di sini. Di modul LDR tegangan AO (dan
21// nilai mentah) TURUN ketika cahaya makin terang.
22const int RAW_DARK = 4000; // Nilai mentah gelap
23const int RAW_LIGHT = 100; // Nilai mentah terang
24
25void setup() {
26 Serial.begin(115200);
27 analogReadResolution(12); // Paksa 12-bit
28 Serial.println("LDR Okuma / LDR Reading");
29 Serial.println("-----------------------------");
30}
31
32void loop() {
33 int raw = analogRead(LDR_PIN);
34 // Batasi ke rentang kalibrasi, gelap = 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
Nilai apa yang dikembalikan ADC ESP32?
ADC ESP32 adalah 12-bit dan mengembalikan nilai dari 0 sampai 4095. Karena berbeda dengan rentang 0–1023 di Arduino Uno, kamu perlu menyesuaikan ambang dan perhitunganmu.
Bacaan analog kacau ketika Wi-Fi menyala. Kenapa?
Di ESP32, kanal ADC2 (GPIO 0, 2, 4, 12–15, 25–27) tidak bisa dipakai ketika Wi-Fi aktif. Menyambungkan sensor analog ke pin ADC1 (GPIO 32–39) mencegah masalah ini.
Apakah bacaannya nilai lux sebenarnya?
Tidak, kode ini tidak menghitung lux; kode menampilkan nilai ADC mentah dan persentase cahaya relatif berdasarkan nilai acuan gelap dan terang yang dipilih. Respons LDR tidak linear dan berbeda dari model ke model. Untuk pengukuran lux yang presisi, dipakai sensor terkalibrasi seperti BH1750.
Kenapa ADC ESP32 memberi bacaan yang salah di ujung-ujungnya?
ADC ESP32 tidak linear di dekat 0 V dan 3,3 V. Fungsi `analogReadMilliVolts()` mengembalikan nilai yang terkalibrasi; untuk pengukuran penting, bekerja di rentang 0,1–3,1 V memberi hasil paling akurat.
