#include <WiFi.h>
#include <PubSubClient.h>
#include <LiquidCrystal_I2C.h>
#include <AccelStepper.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";
WiFiClient espClient;
PubSubClient client(espClient);
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define PIR_PIN 4
#define LDR_PIN 36
#define TRIG_PIN 18
#define ECHO_PIN 19
#define RELAY_PIN 23
#define LED_RED 32
#define LED_GREEN 33
#define LED_BLUE 14
#define BUZZER_PIN 13
AccelStepper stepper(AccelStepper::FULL4WIRE, 27, 26, 25, 12);
unsigned long lastMsg = 0;
unsigned long lastBlink = 0;
bool blueLedState = LOW;
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
}
void callback(char* topic, byte* payload, unsigned int length) {}
void reconnect() {
while (!client.connected()) {
if (!client.connect("ESP32Client")) delay(5000);
}
}
float readDistance() {
digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
float duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2;
}
void setup() {
pinMode(PIR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
lcd.init();
lcd.backlight();
lcd.print("Smart Home Sys");
stepper.setMaxSpeed(1000);
stepper.setAcceleration(500);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
unsigned long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
int pirState = digitalRead(PIR_PIN);
int ldrValue = analogRead(LDR_PIN);
float distance = readDistance();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dist:");
lcd.print(distance);
lcd.print("cm");
lcd.setCursor(0, 1);
lcd.print("Light:");
lcd.print(ldrValue);
if (distance < 20 || pirState || ldrValue < 500) {
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
digitalWrite(BUZZER_PIN, HIGH);
stepper.moveTo(200);
client.publish("home/status", "ACTIVE");
} else {
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(BUZZER_PIN, LOW);
stepper.moveTo(0);
client.publish("home/status", "IDLE");
}
client.publish("home/distance", String(distance).c_str());
client.publish("home/light", String(ldrValue).c_str());
client.publish("home/motion", pirState ? "DETECTED" : "NONE");
}
if (digitalRead(PIR_PIN)) {
if (now - lastBlink >= 500) {
lastBlink = now;
blueLedState = !blueLedState;
digitalWrite(LED_BLUE, blueLedState);
}
} else {
digitalWrite(LED_BLUE, LOW);
}
stepper.run();
}