int led1 = 3;
int led2 = 5;
int led3 = 6;
int led4 = 9;
int led5 = 10;
int motionLed = 11;
int ldr = 8;
int t = 4;
int echo = 7;
unsigned long motionTime = 0;
bool motionDetected = false;
int ledBrightness[5] = {255, 255, 255, 255, 255};
unsigned long motionLedDuration = 5000;
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(motionLed, OUTPUT);
pinMode(ldr, INPUT);
pinMode(t, OUTPUT);
pinMode(echo, INPUT);
Serial.begin(9600);
}
void loop() {
int light = digitalRead(ldr);
// --- Trigger Ultrasonic Pulse ---
digitalWrite(t, LOW);
delayMicroseconds(2);
digitalWrite(t, HIGH);
delayMicroseconds(10);
digitalWrite(t, LOW);
// --- Read Echo ---
long duration = pulseIn(echo, HIGH, 20000); // Timeout after 20ms
float distance = duration * 0.034 / 2;
// --- LDR Controlled LEDs ---
if (light == HIGH) {
analogWrite(led1, ledBrightness[0]);
analogWrite(led2, ledBrightness[1]);
analogWrite(led3, ledBrightness[2]);
analogWrite(led4, ledBrightness[3]);
analogWrite(led5, ledBrightness[4]);
} else {
analogWrite(led1, 0);
analogWrite(led2, 0);
analogWrite(led3, 0);
analogWrite(led4, 0);
analogWrite(led5, 0);
}
// --- Motion Detection ---
if (distance > 0 && distance < 20) {
motionDetected = true;
motionTime = millis();
}
if (motionDetected && millis() - motionTime < motionLedDuration) {
analogWrite(motionLed, 255);
} else {
analogWrite(motionLed, 0);
motionDetected = false;
}
// --- Serial Commands ---
if (Serial.available()) {
char command = Serial.read();
if (command == 'O') {
int ledNumber = Serial.parseInt();
forceLedOn(ledNumber);
} else if (command == 'F') {
int ledNumber = Serial.parseInt();
forceLedOff(ledNumber);
} else if (command == 'B') {
int ledNumber = Serial.parseInt();
int brightness = Serial.parseInt();
changeLedBrightness(ledNumber, brightness);
} else if (command == 'R') {
readSensorStatuses();
} else if (command == 'T') {
motionLedDuration = Serial.parseInt() * 1000;
if (motionLedDuration < 1000) {
motionLedDuration = 1000;
}
Serial.print("Motion LED duration set to: ");
Serial.println(motionLedDuration / 1000);
}
}
delay(100);
}
void forceLedOn(int ledNumber) {
if (ledNumber == 1) digitalWrite(led1, HIGH);
else if (ledNumber == 2) digitalWrite(led2, HIGH);
else if (ledNumber == 3) digitalWrite(led3, HIGH);
else if (ledNumber == 4) digitalWrite(led4, HIGH);
else if (ledNumber == 5) digitalWrite(led5, HIGH);
else if (ledNumber == 6) digitalWrite(motionLed, HIGH);
}
void forceLedOff(int ledNumber) {
if (ledNumber == 1) digitalWrite(led1, LOW);
else if (ledNumber == 2) digitalWrite(led2, LOW);
else if (ledNumber == 3) digitalWrite(led3, LOW);
else if (ledNumber == 4) digitalWrite(led4, LOW);
else if (ledNumber == 5) digitalWrite(led5, LOW);
else if (ledNumber == 6) digitalWrite(motionLed, LOW);
}
void changeLedBrightness(int ledNumber, int brightness) {
if (brightness >= 0 && brightness <= 255) {
if (ledNumber == 1) ledBrightness[0] = brightness;
else if (ledNumber == 2) ledBrightness[1] = brightness;
else if (ledNumber == 3) ledBrightness[2] = brightness;
else if (ledNumber == 4) ledBrightness[3] = brightness;
else if (ledNumber == 5) ledBrightness[4] = brightness;
}
}
void readSensorStatuses() {
int light = digitalRead(ldr);
// Send ultrasonic pulse again for accuracy
digitalWrite(t, LOW);
delayMicroseconds(2);
digitalWrite(t, HIGH);
delayMicroseconds(10);
digitalWrite(t, LOW);
long duration = pulseIn(echo, HIGH, 20000);
float distance = duration * 0.034 / 2;
Serial.print("LDR: ");
Serial.print(light == HIGH ? "HIGH" : "LOW");
Serial.print(", Motion: ");
if (distance > 0 && distance < 20) {
Serial.println("Motion Detected");
} else {
Serial.println("No Motion");
}
}