//*Circuit Diagram #1 - Double PIR Motion Sensors*//
//**" The coding and solfware process of PIR Motion Sensors in smart home automation system "**//
//Smart Home Automation -> " SHA " (variable)
#include <PubSubClient.h> //Library Contact MQTT
#include <WiFi.h> //Library Contact WiFi
#define PIR_Pin001 23 //GPIO-23 to 1st-PIR
#define PIR_Pin002 22 //GPIO-22 to 2nd-PIR
#define Relay_LED001 13 //GPIO-13 to 1st-LEDin
#define Relay_LED002 12 //GPIO-13 to 2nd-LEDin
#define TOPIC_SUBSCRIBE_LEDin_001 "SHA_on_off_LEDin001"
#define TOPIC_SUBSCRIBE_LEDin_002 "SHA_on_off_LEDin002"
#define TOPIC_PUBLISH_PIR_001 "SHA/PIR001"
#define TOPIC_PUBLISH_PIR_002 "SHA/PIR002"
#define PUBLISH_DELAY 2000 // Delay time for publish data to MQTT Broker
// millis() -> loop 2 second
#define ID_MQTT "ESP32_Double_PIR" // Device ID for connect to MQTT Broker
const char SSID[] = "Wokwi-GUEST"; //Enter WiFi SSID
const char PASSWORD[] = ""; //Enter WiFi Password
//URL for MQTT broker
const char *BROKER_MQTT = "broker.hivemq.com";
int BROKER_PORT = 1883; //Port of Broker MQTT
unsigned long Publish_Update;
static char strMotion001[10] = {0};
static char strMotion002[10] = {0};
WiFiClient espClient;
PubSubClient MQTT(espClient);
void Initial_WiFi(void);
void Initial_MQTT(void);
void Callback_MQTT(char *topic, byte *payload, unsigned int length);
void Reconnect_MQTT(void);
void Reconnect_WiFi(void);
void Check_WiFiAndMQTT(void);
/*Start Beginning of WiFi*/
void Initial_WiFi(void)
{
delay(10);
Serial.println("------Connect to WI-FI------");
Serial.print("Connecting to : ");
Serial.println(SSID);
Reconnect_WiFi();
}
/*Start Beginning of MQTT*/
void Initial_MQTT(void)
{
MQTT.setServer(BROKER_MQTT, BROKER_PORT);
MQTT.setCallback(Callback_MQTT);
}
// Function Callback: Receive Message from another MQTT Client publish message pass through the MQTT Broker
void Callback_MQTT(char *topic, byte *payload, unsigned int length)
{
String msg;
//Obtem a string do payload recebido
for (int i = 0; i < length; i++) {
char c = (char)payload[i];
msg += c;
}
Serial.printf("Receive string via MQTT : %s on topic : %s\n", msg, topic);
if(String(topic) == TOPIC_SUBSCRIBE_LEDin_001) {
if (msg.equals("1")) {
digitalWrite(Relay_LED001, HIGH);
Serial.println("LEDin 1st status : 'ON'");
}
if (msg.equals("0")) {
digitalWrite(Relay_LED001, LOW);
Serial.println("LEDin 1st status : 'OFF'");
}
}
if(String(topic) == TOPIC_SUBSCRIBE_LEDin_002) {
if (msg.equals("1")) {
digitalWrite(Relay_LED002, HIGH);
Serial.println("LEDin 2nd status : 'ON'");
}
if (msg.equals("0")) {
digitalWrite(Relay_LED002, LOW);
Serial.println("LEDin 2nd status : 'OFF'");
}
}
}
//Function Reconnect MQTT Broker
void Reconnect_MQTT(void)
{
while (!MQTT.connected()) {
Serial.print("Connecting MQTT Broker : ");
Serial.println(BROKER_MQTT);
if (MQTT.connect(ID_MQTT)) {
Serial.println("Connecting the MQTT Broker success!\n");
MQTT.subscribe(TOPIC_SUBSCRIBE_LEDin_001);
MQTT.subscribe(TOPIC_SUBSCRIBE_LEDin_002);
}
else {
Serial.println("Fail! to connect then reconnect MQTT Broker again in 2 seconds.\n");
delay(2000);
}
}
}
//Function Reconnect WiFi Router
void Reconnect_WiFi(void)
{
if (WiFi.status() == WL_CONNECTED)
return;
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print("#.....#\n");
}
Serial.print("Connected WiFi success!\n");
Serial.print(SSID);
Serial.println("IP Address : ");
Serial.println(WiFi.localIP());
}
// Function checking connected to WiFi Router and MQTT Broker */
void Check_WiFiAndMQTT(void)
{
if (!MQTT.connected())
Reconnect_MQTT();
Reconnect_WiFi();
}
//-------------------------------------------------------------------------------------//
int PIR_Sensor_1st = 23;
int PIR_Sensor_2nd = 22;
int LEDin_1st = 13;
int LEDin_2nd = 12;
int PIR_1st_State_Current = LOW; //Current state of PIR 1st pin
int PIR_1st_State_Previous = LOW; //Previous state of PIR 1st pin
int PIR_2nd_State_Current = LOW; //Current state of PIR 2nd pin
int PIR_2nd_State_Previous = LOW; //Previous state of PIR 2nd pin
const unsigned long Period_LEDin_1st = 30000; //Loop State turn on light of LED 1st
const unsigned long Period_LEDin_2nd = 30000; //Loop State turn on light of LED 2nd
boolean Delay_Enabled_1st = false;
boolean Delay_Enabled_2nd = false;
unsigned long Delay_Step_Time_1st = 0;
unsigned long Delay_Step_Time_2nd = 0;
unsigned long BeginLoop_Delay = 0;
unsigned long PIR1st_Loop_Delay = 0;
unsigned long PIR2nd_Loop_Delay = 0;
//-------------------------------------------------------------------------------------//
void setup()
{
Serial.begin(115200); //Initialize Serial Moniter
Serial.println("Get Started!!!");
pinMode(PIR_Sensor_1st, INPUT);
pinMode(PIR_Sensor_2nd, INPUT);
pinMode(LEDin_1st, OUTPUT);
pinMode(LEDin_2nd, OUTPUT);
Initial_WiFi();
Initial_MQTT();
}
void loop()
{
//-----------------------------------------------------//
Serial.print("******************************\n");
Serial.print("Check PIR 1st Status : ");
Serial.println(digitalRead(PIR_Sensor_1st));
Serial.print("Check PIR 2nd Status : ");
Serial.println(digitalRead(PIR_Sensor_2nd));
Serial.print("******************************\n");
//-----------------------------------------------------//
BeginLoop_Delay = millis();
if ((BeginLoop_Delay - Publish_Update) >= PUBLISH_DELAY) {
Publish_Update = millis();
//Verify the operation of the WiFi connection and go to the MQTT broker
Check_WiFiAndMQTT();
Detect_Motion_PIR_1st();
Detect_Motion_PIR_2nd();
//Change format of the Data as String for send it via MQTT protocol
sprintf(strMotion001, "%d",digitalRead(PIR_Sensor_1st));
sprintf(strMotion002, "%d",digitalRead(PIR_Sensor_2nd));
delay(1000);
//Send data string to MQTT Broker
MQTT.publish(TOPIC_PUBLISH_PIR_001, strMotion001);
MQTT.publish(TOPIC_PUBLISH_PIR_002, strMotion002);
// Keep-alive for connected MQTT broker
MQTT.loop();
}
}
// "PIR Motion Sensor Function-1st" //
void Detect_Motion_PIR_1st()
{
PIR_1st_State_Previous = PIR_1st_State_Current; //Store OLD State
PIR_1st_State_Current = digitalRead(PIR_Sensor_1st); //Read NEW State
PIR1st_Loop_Delay = millis();
if(PIR_1st_State_Current == HIGH && PIR_1st_State_Previous == LOW) {
String text_1 = "Motion in PIR 1st Detected!!!\n" ;
Serial.println(text_1);
digitalWrite(LEDin_1st, HIGH);
Delay_Enabled_1st = true; //Enable Loop-Delay
Delay_Step_Time_1st = millis(); //Set Start Time
}
else if (PIR_1st_State_Current == LOW && PIR_1st_State_Previous == HIGH) {
String text_2 = "Motion in PIR 1st Stopped!!!\n" ;
Serial.println(text_2);
digitalWrite(LEDin_1st, LOW);
Delay_Enabled_1st = false; //Disable Loop-Delay
}
if(Delay_Enabled_1st == true && (PIR1st_Loop_Delay - Delay_Step_Time_1st) >= Period_LEDin_1st) {
digitalWrite(LEDin_1st, LOW);
Delay_Enabled_1st = false; //Set New Loop-Delay
Delay_Step_Time_1st = 0; //Set New Step Time
PIR1st_Loop_Delay = 0;
}
}
// "PIR Motion Sensor Function-2nd" //
void Detect_Motion_PIR_2nd()
{
PIR_2nd_State_Previous = PIR_2nd_State_Current; //Store OLD State
PIR_2nd_State_Current = digitalRead(PIR_Sensor_2nd); //Read NEW State
PIR2nd_Loop_Delay = millis();
if(PIR_2nd_State_Current == HIGH && PIR_2nd_State_Previous == LOW) {
String text_3 = "Motion in PIR 2nd Detected!!!\n" ;
Serial.println(text_3);
digitalWrite(LEDin_2nd, HIGH);
Delay_Enabled_2nd = true; //Enable Loop-Delay
Delay_Step_Time_2nd = millis(); //Set Start Time
}
else if (PIR_2nd_State_Current == LOW && PIR_2nd_State_Previous == HIGH) {
String text_4 = "Motion in PIR 2nd Stopped!!!\n" ;
Serial.println(text_4);
digitalWrite(LEDin_2nd, LOW);
Delay_Enabled_2nd = false; //Disable Loop-Delay
}
if(Delay_Enabled_2nd == true && (PIR2nd_Loop_Delay - Delay_Step_Time_2nd) >= Period_LEDin_2nd) {
digitalWrite(LEDin_2nd, LOW);
Delay_Enabled_2nd = false; //Set New Loop-Delay
Delay_Step_Time_2nd = 0; //Set New Step Time
PIR2nd_Loop_Delay = 0;
}
}