5 Light Dependent Resistor Projects That Respond to Darkness and Light
Build light-reactive systems: street lamp controller, solar tracker, reading lamp, sunrise alarm, and chicken coop door
Project 1: Automatic Street Lamp
Goal: Turn lamp on at dusk, off at dawn
Hardware
GL5528 LDR, Arduino Nano, 5V relay, LED lamp
Code
#define LDR_PIN A0
#define RELAY_PIN 7
#define DARK_THRESHOLD 700
void setup() { pinMode(RELAY_PIN, OUTPUT); }
void loop() {
int light = analogRead(LDR_PIN);
if (light < DARK_THRESHOLD) {
digitalWrite(RELAY_PIN, HIGH); // Lamp ON
} else {
digitalWrite(RELAY_PIN, LOW); // Lamp OFF
}
delay(1000);
}
Project 2: Solar Panel Sun Tracker
Goal: Rotate panel to face brightest direction
Hardware
2x GL5528 LDR, Arduino Nano, 2x SG90 servos
Code
void loop() {
int left = analogRead(LDR_LEFT);
int right = analogRead(LDR_RIGHT);
int diff = left - right;
if (abs(diff) > 20) {
if (diff > 0) currentAngle += 2;
else currentAngle -= 2;
servo.write(currentAngle);
}
delay(100);
}
Project 3: Automatic Reading Lamp
Goal: Turn on desk lamp when room gets dark
Hardware
GL5528 LDR, Arduino Nano, 5V relay, Desk lamp
Code
void loop() {
int ambient = analogRead(LDR_PIN);
if (ambient < 300) {
digitalWrite(LAMP_RELAY, HIGH);
lcd.setCursor(0, 0); lcd.print("Light ON ");
} else {
digitalWrite(LAMP_RELAY, LOW);
lcd.setCursor(0, 0); lcd.print("Light OFF");
}
}
Project 4: Sunrise Simulation Alarm
Goal: Gradually brighten LED to simulate sunrise
Hardware
GL5528 LDR, Arduino Nano, 128x64 OLED, High-brightness LED
Code
void loop() {
DateTime now = rtc.now();
if (now.hour() == ALARM_HOUR && now.minute() == 0) {
for (int brightness = 0; brightness <= 255; brightness++) {
analogWrite(LED_PIN, brightness);
delay(60000 / 255); // 1 minute to full brightness
}
}
}
Project 5: Chicken Coop Auto Door
Goal: Open at sunrise, close at sunset
Hardware
GL5528 LDR, Arduino Nano, SG90 servo, DS3231 RTC
Code
void loop() {
int light = analogRead(LDR_PIN);
DateTime now = rtc.now();
if (light > SUNRISE_THRESHOLD && now.hour() >= 5 && doorState == CLOSED) {
servo.write(OPEN_ANGLE);
doorState = OPEN;
}
if (light < SUNSET_THRESHOLD && now.hour() >= 19 && doorState == OPEN) {
servo.write(CLOSE_ANGLE);
doorState = CLOSED;
}
}
How It Works
// WF1 Run #048 - Basic LDR
#define LDR_PIN A0
void setup() {
Serial.begin(115200);
pinMode(LDR_PIN, INPUT);
}
void loop() {
int light = analogRead(LDR_PIN);
Serial.print("Light: ");
Serial.println(light);
delay(500);
}
Troubleshooting
| Problem | Cause | Fix |
|---|---|---|
| LDR readings unstable | Voltage divider noise | Add 10uF capacitor across LDR leads |
| Lamp flickers at threshold | No hysteresis | Use separate ON and OFF thresholds at least 100 apart |
| Servo jitter on solar tracker | Deadband too small | Increase minimum differential to 20+ before moving |
Start Here
Affiliate disclosure: As an Amazon Associate, I earn from qualifying purchases.
GL5528 LDR Photoresistor —
Arduino Nano —
5V Relay Module —
SG90 Servo Motor —
Next Step: From Scene to Sensor, Without Writing Code
I offer a personalized interactive device design guide at Fiverr:
👉 https://www.fiverr.com/phd_hfchang/generate-an-arduino-interactive-prototypef
Tags: Arduino LDR Photoresistor Light Sensor Automation






Top comments (0)