#include "WiFi.h"
#include "PubSubClient.h"
int pirPin = 26;
int relayPin = 32;
int swtPin = 27;
int x = LOW;
int y = LOW;
int swstate = LOW;
// WiFi
const char* ssid = "Wokwi-GUEST";
const char* pass = "";
// MQTT Broker
const char* brokerUser = "antariot";
const char* brokerPass = "admin@1234";
const char* broker = "192.168.68.105";
const char* clientid = "MQTT_client195da";
const int port = 1883;
const char* outTopic = "/light/out";
WiFiClient espClient;
PubSubClient client(espClient);
void motion();
void nomotion();
void manualMode();
void smartMode();
void setupWiFi() {
delay(100);
Serial.print("\nConnecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.print("\nConnected to ");
Serial.println(ssid);
}
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to ");
Serial.println(broker);
if (client.connect(clientid, brokerUser,brokerPass)) {
Serial.println("Connected to MQTT broker");
client.subscribe(outTopic);
} else {
Serial.print("Failed to connect. Retrying in 5 seconds...");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
setupWiFi();
client.setServer(broker, port);
pinMode(pirPin, INPUT);
pinMode(relayPin, OUTPUT);
pinMode(swtPin, INPUT);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
swstate = digitalRead(swtPin);
x = digitalRead(pirPin);
if (swstate == HIGH && y == LOW) {
y = HIGH;
client.publish(outTopic,"Switch ON (Manual Mode)");
//Serial.println("Switch ON (Manual Mode)");
manualMode();
}
else if (swstate == LOW && y == HIGH) {
y = LOW;
client.publish(outTopic,"Switch OFF (Manual Mode)");
//Serial.println("Switch OFF (Manual Mode)");
nomotion();
}
else {
if (x == HIGH) {
motion();
} else {
nomotion();
}
}
delay(500);
}
void motion() {
client.publish(outTopic,"Motion Detected");
Serial.println("Motion Detected");
digitalWrite(relayPin, HIGH);
}
void nomotion() {
client.publish(outTopic,"No Motion Detected");
//Serial.println("No Motion Detected");
digitalWrite(relayPin, LOW);
delay(1000);
}
void manualMode() {
digitalWrite(relayPin, HIGH);
delay(5000);
x = digitalRead(pirPin);
while (x == HIGH) {
motion();
x = digitalRead(pirPin);
}
nomotion();
smartMode();
}
void smartMode() {
Serial.println("Smart Mode");
delay(5000);
x = digitalRead(pirPin);
if (x == HIGH) {
motion();
} else {
nomotion();
}
}