#include <ESP32Servo.h>
// ===== PIN SETUP =====
#define LIGHT_PIN 5
#define TV_PIN 18
#define PIR_PIN 13
#define BUZZER_PIN 4
#define SERVO_PIN 14
#define BUTTON_PIN 15 // Push button for manual toggle
Servo gate;
// ===== STATES =====
bool lightState = false;
bool tvState = false;
bool gateOpen = false;
bool lastButtonState = HIGH;
void setup() {
Serial.begin(115200);
pinMode(LIGHT_PIN, OUTPUT);
pinMode(TV_PIN, OUTPUT);
pinMode(PIR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // Button uses internal pull-up
gate.attach(SERVO_PIN);
Serial.println("=== SMART HOME SYSTEM ===");
Serial.println("Commands:");
Serial.println("L = Light ON");
Serial.println("l = Light OFF");
Serial.println("T = TV ON");
Serial.println("t = TV OFF");
Serial.println("O = Gate OPEN");
Serial.println("C = Gate CLOSE");
}
void loop() {
// ===== MOTION DETECTION =====
int motion = digitalRead(PIR_PIN);
if (motion == HIGH) {
Serial.println("⚠ Motion Detected!");
digitalWrite(LIGHT_PIN, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
delay(2000); // prevents repeated detection messages
digitalWrite(BUZZER_PIN, LOW);
}
// ===== MANUAL PUSH BUTTON TOGGLE =====
bool buttonState = digitalRead(BUTTON_PIN);
if (buttonState == LOW && lastButtonState == HIGH) { // button pressed
lightState = !lightState;
tvState = !tvState;
gateOpen = !gateOpen;
digitalWrite(LIGHT_PIN, lightState ? HIGH : LOW);
digitalWrite(TV_PIN, tvState ? HIGH : LOW);
gate.write(gateOpen ? 90 : 0);
Serial.println("=== MANUAL TOGGLE ===");
Serial.print("Light: "); Serial.println(lightState ? "ON" : "OFF");
Serial.print("TV: "); Serial.println(tvState ? "ON" : "OFF");
Serial.print("Gate: "); Serial.println(gateOpen ? "OPEN" : "CLOSE");
}
lastButtonState = buttonState;
// ===== SERIAL CONTROL (REMOTE SIMULATION) =====
if (Serial.available()) {
char cmd = Serial.read();
switch (cmd) {
case 'L':
digitalWrite(LIGHT_PIN, HIGH);
lightState = true;
Serial.println("Light ON");
break;
case 'l':
digitalWrite(LIGHT_PIN, LOW);
lightState = false;
Serial.println("Light OFF");
break;
case 'T':
digitalWrite(TV_PIN, HIGH);
tvState = true;
Serial.println("TV ON");
break;
case 't':
digitalWrite(TV_PIN, LOW);
tvState = false;
Serial.println("TV OFF");
break;
case 'O':
gate.write(90); // Open gate
gateOpen = true;
Serial.println("Gate OPEN");
break;
case 'C':
gate.write(0); // Close gate
gateOpen = false;
Serial.println("Gate CLOSE");
break;
default:
Serial.println("Invalid Command");
break;
}
}
}