Main idea:
For this assignment, I tried to build an emergency light that automatically turns on whenever there is a power outage using both an analog sensor (LDR) and a digital sensor (switch).
Components:
x1 LDR
x1 Button push switch
x2 10K resistors
x1 350 resistor
x7 wires
Process:
When the photoresistor’s surface (LDR) receives enough luminosity (light), its resistance decreases and is read by the program. When the values go lower than 350, it means that there was a power outage, therefore, the program turns the LED on. If the values remain higher than 350, the LED stays off and no power outage is detected.
Global variables:
I am using four global variables (3 are of data type int for the pins, and one boolean variable to check the state of the LED).
int led = 3; // LED pin int ldr = A0; // LDR pin int button = 5; // Button pin bool on = false; // Boolean variable for the state of the LED
Setup():
In the setup function, I mainly set the components to the pins (LED to 3, switch to 5, and LDR to A0) and set Serial.begin() to 9600.
void setup() {
Serial.begin(9600);
pinMode(led, OUTPUT); // Set the LED pinmode
pinMode(ldr, INPUT); // Set the LDR pinmode
pinMode(button, INPUT); // Set the button pinmode
}
Loop():
To achieve the desired result, I am using analogRead() to get the luminosity’s value, then check if it is higher or lower than 350 using if/else conditions.
// read the brightness from the ldr
int brightness = analogRead(ldr);
// if its dark (power outage)
if (brightness < 350) {
digitalWrite(led, HIGH);
}
// if everything is normal (light)
else {
digitalWrite(led, LOW);
}
The switch here works as an ON/OFF button for the whole process. I am using a boolean variable as well as digitalRead() to check the state of the LED.
// check if switch is clicked
if (on == false && digitalRead(button)== HIGH){
on = true;
}
if (on == true && digitalRead(button) == HIGH){
on = false;
}
Challenges & thoughts:
To give it a realistic look, I wanted to add a delay() function after the click, and before the lights go on or off, but I wasn’t sure if it would affect the interactivity (mainly when the user clicks on the button). Therefore, I decided to avoid it.
Demo:
Code:
int led = 3; // LED pin
int ldr = A0; // LDR pin
int button = 5; // Button pin
bool on = false; // Boolean variable for the state of the LED
void setup() {
Serial.begin(9600);
pinMode(led, OUTPUT); // Set the LED pinmode
pinMode(ldr, INPUT); // Set the LDR pinmode
pinMode(button, INPUT); // Set the button pinmode
}
void loop() {
// read the brightness from the ldr
int brightness = analogRead(ldr);
// check if switch is clicked
if (on == false && digitalRead(button)== HIGH){
on = true;
}
if (on == true && digitalRead(button) == HIGH){
on = false;
}
// if switch is clicked, then proceed
if (on==true){
// if its dark (power outage)
if (brightness < 350) {
digitalWrite(led, HIGH);
}
// if everything is normal (light)
else {
digitalWrite(led, LOW);
}
}
else if (on==false) {digitalWrite(led, LOW);}
}
