Apa Itu Sensor Cahaya LDR? Mengukur Cahaya dengan Arduino dan Lampu Tidur Otomatis
Bagaimana cara kerja LDR (fotoresistor)? Pengkabelan pembagi tegangan, memilih resistor yang tepat, membaca cahaya dengan analogRead, lampu tidur dengan histeresis, modul LDR, pemakaian di ESP32 dan Pico, serta kesalahan umum.
LDR (Light Dependent Resistor), sesuai namanya, adalah resistor yang hambatannya berubah sesuai cahaya; komponen ini juga disebut fotoresistor atau fotosel. Di tempat gelap hambatannya sangat tinggi, dan makin terang cahayanya, makin turun hambatannya. Lampu jalan yang menyala ketika senja, lampu tidur otomatis, dan mainan yang aktif karena cahaya semuanya bekerja dengan komponen sederhana ini. Harganya murah, tidak punya polaritas, dan bisa dihubungkan ke Arduino dengan satu resistor, jadi sangat ideal sebagai awal proyek cahaya pertamamu.

Bagaimana cara kerja LDR?
Pola zig-zag di permukaan LDR adalah semikonduktor yang peka cahaya, yaitu kadmium sulfida (CdS). Ketika cahaya mengenainya, foton membebaskan elektron di dalam bahan itu, bahannya menghantar lebih baik, dan hambatannya turun. Perubahannya tidak linear dan relatif lambat (puluhan milidetik). Karena itu LDR ideal untuk keputusan seperti “gelap atau terang?” dan untuk tingkat cahaya kasar, bukan untuk mengukur cahaya secara presisi dalam lux.
| Kondisi | Perkiraan hambatan LDR (GL5528) |
|---|---|
| Gelap total | 1 MΩ atau lebih |
| Cahaya lampu tidur (~1 lux) | 50–100 kΩ |
| Ruangan redup (~10 lux) | 10–20 kΩ |
| Ruangan terang (~100 lux) | 3–5 kΩ |
| Di bawah lampu meja (~1000 lux) | Sekitar 1 kΩ |
| Cahaya siang | Beberapa ratus Ω |
Nilainya berbeda-beda tergantung model. Yang paling umum di kit adalah GL5528; saudaranya seperti GL5516, GL5537, dan GL5539 menunjukkan hambatan yang berbeda dalam cahaya yang sama. Kamu bisa dengan mudah mengetahui nilai LDR-mu sendiri dengan mengukurnya memakai multimeter di tempat gelap dan terang.
Menghubungkannya ke Arduino: pembagi tegangan
Arduino mengukur tegangan, bukan hambatan. Karena itu LDR dirangkai bersama resistor tetap untuk membentuk pembagi tegangan: 5V → LDR → A0 → 10 kΩ → GND. Makin terang cahayanya, hambatan LDR makin turun dan tegangan di A0 naik. Tegangan di A0 dihitung dengan V = 5 × Rfixed / (RLDR + Rfixed), dan analogRead() mengubahnya menjadi angka dari 0 sampai 1023. Untuk mencoba nilai resistor yang berbeda, pakai kalkulator Pembagi tegangan.
| Cahaya | Hambatan LDR | Tegangan di A0 | analogRead |
|---|---|---|---|
| Gelap total | 1 MΩ | 0,05 V | ~10 |
| Ruangan redup | 15 kΩ | 2,0 V | ~410 |
| Ruangan terang | 4 kΩ | 3,6 V | ~730 |
| Di bawah lampu meja | 1 kΩ | 4,5 V | ~930 |
Membaca tingkat cahaya dengan Arduino
1const int LDR_PIN = A0;
2
3void setup() {
4 Serial.begin(9600);
5}
6
7void loop() {
8 int raw = analogRead(LDR_PIN); // 0 (karanlık) – 1023 (aydınlık) / dark – bright
9 int percent = map(raw, 0, 1023, 0, 100); // yüzde / percent
10 Serial.print("Ham / raw: ");
11 Serial.print(raw);
12 Serial.print(" Işık / light: %");
13 Serial.println(percent);
14 delay(500);
15}Dengan Serial Plotter di Arduino IDE, kamu bisa melihat nilainya sebagai grafik langsung. Ketika kamu menutup LDR dengan tangan, grafiknya turun, dan ketika kamu menyorotkan senter ke arahnya, grafiknya naik. Ini cara termudah untuk menemukan ambang yang tepat bagi proyekmu, dengan sensor berada di tempat yang sebenarnya akan dipakai.
Lampu tidur otomatis: ambang dan histeresis
Lampu tidur paling sederhana berbunyi “kalau nilainya di bawah 300, nyalakan LED”. Tetapi ketika cahayanya berada tepat di sekitar ambang, lampunya terus menyala-mati, dan lebih parah lagi kalau cahaya lampu itu sendiri mengenai LDR. Solusinya adalah histeresis: memakai dua ambang yang berbeda. Kode di bawah menyalakan lampu ketika cahaya turun di bawah 300, tetapi baru mematikannya setelah cahaya naik di atas 400; selisih di antaranya menghilangkan kedipan sepenuhnya.
1const int LDR_PIN = A0;
2const int LED_PIN = 9;
3const int ON_LEVEL = 300; // bunun altında yak / turn on below this
4const int OFF_LEVEL = 400; // bunun üstünde söndür / turn off above this
5
6bool lampOn = false;
7
8void setup() {
9 pinMode(LED_PIN, OUTPUT);
10}
11
12void loop() {
13 int light = analogRead(LDR_PIN);
14 if (!lampOn && light < ON_LEVEL) lampOn = true;
15 if (lampOn && light > OFF_LEVEL) lampOn = false;
16 digitalWrite(LED_PIN, lampOn ? HIGH : LOW);
17 delay(200);
18}LED yang makin terang ketika gelap
Daripada menyala dan mati, kamu bisa membuat LED makin terang secara bertahap seiring cahaya meredup. Fungsi map() mengubah cahaya yang terukur menjadi nilai PWM yang berbanding terbalik: LED menyala makin terang ketika ruangan makin gelap dan meredup ketika ruangan makin terang. Ingat, hubungkan LED ke pin PWM yang bertanda ~ (misalnya 9).
1void loop() {
2 int light = analogRead(A0);
3 int brightness = map(light, 100, 900, 255, 0); // karanlık → parlak / dark → bright
4 analogWrite(9, constrain(brightness, 0, 255));
5 delay(50);
6}Modul LDR: output digital dan analog
Modul LDR siap pakai memuat LDR, resistor pembagi, trimpot biru untuk ambang, dan komparator LM393 dalam satu board. Pin AO memberi output analog dari pembagi, sedangkan pin DO hanya memberi HIGH atau LOW tergantung ambang yang diatur dengan trimpot. Di sebagian besar modul, DO menjadi LOW ketika lebih terang dari ambang dan HIGH ketika lebih gelap; pastikan perilaku modulmu dengan uji singkat.
| Pin | Fungsi |
|---|---|
| VCC | Daya (3,3–5 V) |
| GND | Ground |
| DO | Output digital: ambang diatur dengan trimpot |
| AO | Output analog: titik tengah pembagi tegangan |
LDR dengan ESP32 dan Raspberry Pi Pico
ESP32 dan Pico bekerja di 3,3 V, jadi beri daya pembagi tegangan dari pin 3V3. ADC ESP32 adalah 12-bit dan mengembalikan nilai dari 0 sampai 4095. Pin ADC2 tidak berfungsi ketika Wi-Fi aktif, jadi hubungkan LDR ke salah satu pin ADC1 (GPIO 32–39). Di Pico, input analognya adalah GP26, GP27, dan GP28; read_u16() di MicroPython mengembalikan nilai dari 0 sampai 65535:
1from machine import ADC, Pin
2import time
3
4ldr = ADC(26) # GP26 (ADC0); bölücü 3V3'ten / divider fed from 3V3
5led = Pin(15, Pin.OUT)
6
7while True:
8 light = ldr.read_u16() # 0 (karanlık) – 65535 (aydınlık) / dark – bright
9 led.value(light < 20000) # karanlıkta yak / on when dark
10 print(light)
11 time.sleep(0.5)LDR atau sensor cahaya digital?
| Fitur | LDR | BH1750 (digital) |
|---|---|---|
| Output | Analog (perubahan hambatan) | Digital (I2C), langsung dalam lux |
| Akurasi | Kasar; dipengaruhi suhu dan model | Presisi dan terkalibrasi |
| Kecepatan respons | Lambat (puluhan milidetik) | Cepat |
| Harga | Sangat murah | Sedikit lebih mahal |
| Paling cocok untuk | Keputusan gelap/terang, lampu tidur | Pengukuran cahaya, lampu tanaman, kecerahan layar |
Ide proyek dengan LDR
- Lampu tidur otomatis: lampu yang menyala ketika gelap dan tidak berkedip-kedip berkat histeresis.
- Lampu lorong pintar: gabungkan LDR dengan Sensor Gerak PIR supaya lampu hanya menyala ketika gelap dan ada orang lewat.
- Panel pelacak matahari: putar servo berdasarkan selisih dua LDR untuk mengarahkan panel ke arah yang paling terang.
- Sistem keamanan laser: arahkan sinar laser ke LDR; ketika sinarnya terputus, bunyikan alarm.
- Lampu suasana berwarna: geser warna LED RGB ke warna hangat ketika hari mulai gelap.
- Alarm matahari terbit: bunyikan buzzer dengan cahaya pertama di pagi hari.
Kesalahan umum dan cara mengatasinya
- Nilainya selalu 0 atau selalu 1023: resistor tetapnya tidak ada, atau LDR dipasang langsung di antara 5V dan A0; buat pembagi tegangan.
- Nilainya terbalik: LDR dan resistor tetap bertukar tempat; kalau nilainya naik ketika gelap, tukar posisinya atau balik perbandingan di kodemu.
- Lampunya berkedip-kedip: cahaya lampu mengenai LDR, atau hanya dipakai satu ambang; tambahkan histeresis.
- Ada jeda ketika mulai gelap: LDR kembali dari terang ke gelap lebih lambat daripada dari gelap ke terang; jeda beberapa detik itu normal.
- Mencoba mengukur lux: LDR bukan sensor yang terkalibrasi; pakai BH1750 untuk nilai lux yang sebenarnya.
- Pembacaan kacau ketika Wi-Fi ESP32 menyala: LDR terpasang di pin ADC2; pindahkan ke salah satu pin ADC1 antara GPIO 32 dan 39.
LDR adalah cara termudah untuk belajar pembacaan analog dan konsep pembagi tegangan, dan apa yang kamu pelajari di sini akan membantu dengan banyak sensor analog seperti sensor kelembapan, gas, dan suhu. Kalau kamu penasaran bagaimana resistor pembagi bekerja, lihat Apa Itu Resistor?; di aplikasi BlueGrays kamu akan menemukan proyek lampu tidur LDR, tingkat cahaya, dan keamanan laser langkah demi langkah.
Pertanyaan umum
Resistor berapa yang sebaiknya dipakai dengan LDR?
Pilihan paling umum adalah 10 kΩ, yang cocok untuk sebagian besar proyek di dalam ruangan. Untuk kepekaan lebih tinggi di cahaya redup, pilih 47 kΩ, dan untuk kondisi yang sangat terang, 1 kΩ. Sebagai aturan, pilih resistor tetap yang nilainya mendekati hambatan LDR pada tingkat cahaya yang kamu pedulikan.
Apakah LDR punya kaki positif dan negatif?
Tidak. LDR tidak punya polaritas, sama seperti resistor biasa; kamu bisa memasangnya dengan arah mana saja. Yang penting adalah membuat pembagi tegangan yang benar dengan resistor tetap.
Bisakah LDR mengukur lux?
Kamu bisa memperkirakannya, tetapi hasilnya tidak akurat; respons LDR tidak linear dan berbeda antarmodel, bahkan berubah dengan suhu. Kalau kamu butuh nilai lux yang sebenarnya, pakai sensor cahaya digital seperti BH1750 atau TSL2561.
Apa perbedaan pin DO dan AO di modul LDR?
AO memberi tegangan analog yang berubah sesuai intensitas cahaya dan dibaca dengan analogRead(). DO hanya memberi HIGH atau LOW tergantung ambang yang diatur dengan trimpot modul dan dibaca dengan digitalRead(); cocok untuk tugas nyala-mati.
Kenapa LDR-ku bereaksi lambat di tempat gelap?
Setelah cahaya hilang, bahan CdS butuh beberapa detik untuk mencapai hambatan gelapnya, sedangkan perubahan ke terang jauh lebih cepat. Ini sifat alami LDR. Untuk tugas yang butuh respons cepat, dipakai fotodioda atau fototransistor.
Kenapa nilai LDR-ku di ESP32 selalu 4095 atau tidak berubah sama sekali?
Kalau pembaginya diberi daya dari 5V, tegangannya melebihi batas ADC dan nilainya tertahan di 4095; beri daya pembagi dari 3V3. Kalau tidak berubah sama sekali, mungkin LDR terpasang di pin ADC2; ADC2 tidak berfungsi ketika Wi-Fi aktif, jadi pakai pin ADC1 antara GPIO 32 dan 39.
Proyek untuk dibuat setelah membaca ini
Lihat semua proyek
Mengukur Intensitas Cahaya dengan LDR
Ingin melihat seberapa terang kamarmu dalam bentuk angka? LDR, komponen kecil yang bereaksi terhadap cahaya, mengukur cahaya di sekitarnya, dan Arduino menulis nilainya ke layar komputermu setiap sete

Lampu Tidur dengan LDR
Lampu tidur kecil yang menyala sendiri ketika gelap dan mati ketika pagi tiba. Sensor cahaya mengukur seberapa terang ruangan, dan Arduino menyalakan LED ketika cukup gelap lalu mematikannya lagi keti

Sistem Peringatan Laser
Kamu memasang pagar sinar tak terlihat, persis seperti di film. Laser menyorot sensor cahaya di sisi seberang; begitu ada orang lewat dan memutus sinarnya, LED menyala dan buzzer berbunyi, dan ketika

Sistem Keamanan Laser
Persis seperti adegan perampokan dengan laser di film: sinar laser menyorot sensor cahaya, dan begitu ada orang masuk dan memutus sinarnya, LED merah menyala dan buzzer mulai berbunyi. Alarmnya tidak

Lampu Tidur dengan LDR ESP32
Lampu tidur yang LED-nya otomatis menyala ketika gelap dan mati ketika terang. Yang dipakai adalah pin D0 (digital out) Modul Sensor LDR; ambang gelap diatur dengan potensiometer kecil di modul, dan modul sendiri yang menghasilkan output HIGH/LOW. ESP32 hanya membaca sinyal ini dengan digitalRead(), jadi kodenya sangat sederhana.

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.

Lampu Pintar ESP32 (PIR + LDR + Relay + OLED)
Ubah lorong, kamar mandi, atau gudangmu menjadi lampu pintar dengan ESP32! Dengan sensor gerak PIR, sensor cahaya LDR, dan modul relay, kita membuat skenario klasik "lampu menyala ketika ada gerakan dalam gelap"; jika sudah terang, gerakan TIDAK menyalakan lampu, jadi energi hemat di siang hari. Lampu menyala 30 detik; jika gerakan berlanjut, timer diulang. OLED SSD1306 menampilkan status dengan font besar (NYALA / SIANG / MENUNGGU) dan hitung mundur.

Lampu Otomatis dengan Sensor Gerak PIR ESP32
Di proyek ini, sensor gerak PIR HC-SR501 mendeteksi ketika seseorang masuk ke ruangan dan otomatis menyalakan LED. Lama LED menyala dilacak dengan millis(); setiap bacaan HIGH memperbarui waktu gerakan terakhir, dan LED mati minimal 10 detik setelah bacaan HIGH terakhir. Kode yang sekarang juga menunggu 50 ms di setiap loop dengan delay(50), jadi loopnya belum sepenuhnya non-blocking. Proyek ini bisa dipakai untuk lampu tangga.
Artikel lainnya
Aplikasi BlueGrays
Rakit rangkaian ini langkah demi langkah di ponselmu
Skema pengkabelan, kode, dan daftar komponen dalam satu layar. 200+ proyek Arduino, ESP32, dan Pico siap dibuat.
Pindai dengan ponselmu
Arahkan kamera ke kode ini dan toko aplikasi di ponselmu akan terbuka.
atau buka toko aplikasi

