#define name value
#include "DHTesp.h"
#include <WiFi.h>
#include <ESP32Servo.h>
#include <PubSubClient.h>
#include <ThingSpeak.h>
#include <string.h>
Servo myservo; //create servo object to control servo
//***Set server***
const char* mqttServer = "broker.mqtt-dashboard.com";
int port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
//***************8
int pos = 0; //variable to store server position
static const int servoPin = 18;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* myWriteAPIKey = "AYD6TXU2E0GV3FAR";
const char* myReadAPIKey = "WGD26OGCR6PEKALY";
const unsigned long myChannelId = 1992616;
int curStatusInt = 1;
int LED_red_device = 13; //for on-off signal only
int LED_green_device = 12; //for on-off signal only
int LED_red = 21;
int LED_yellow = 32;
int LED_green = 33;
int LED_white = 27;
int buzzer=14;
int button = 4;
int DHT = 15;
int door_lock = 18;
int pirSensor=34;
int pirState=LOW;
int value=0;
int chk;
float H;
float T;
DHTesp dht;
String Theft_detector="theft_on";
String Device_status = "device_on";
String THNotification = "";
String THStatus[3] = {"Normal", "Suspicious", "Alert"};
String curStatus = "";
String motion_alert = "";
String theft_alert = "";
int motion_time = 0;
int theft_time = 0;
int motion = 0;
String Theft_Notification ="";
int lastState = LOW;
int lastMillis = 0;
String door = "Close";
String command;
void wifiConnect() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Connected!");
}
void mqttReconnect() {
while(!client.connected()) {
Serial.println("Attemping MQTT connection...");
if(client.connect("SH")) {
Serial.println("connected");
client.subscribe("SH/Command");
}
else {
Serial.println("try again in 5 seconds");
delay(5000);
}
}
}
void callback(char* topic, byte* message, unsigned int length) {
String strMsg;
for(int i=0; i<length; i++) {
strMsg += (char)message[i];
}
command = strMsg;
Serial.println(strMsg);
}
void setup(){
Serial.begin(9600);
dht.setup(15, DHTesp::DHT22);
pinMode(buzzer, OUTPUT);
pinMode(buzzer,OUTPUT);
pinMode(pirSensor,INPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(21, OUTPUT);
pinMode(33, OUTPUT);
pinMode(32, OUTPUT);
wifiConnect();
client.setServer(mqttServer, port);
client.setCallback(callback);
ThingSpeak.begin(espClient);
WiFi.mode(WIFI_STA);
//allow allocation of all timers
ESP32PWM::allocateTimer(0);
ESP32PWM::allocateTimer(1);
ESP32PWM::allocateTimer(2);
ESP32PWM::allocateTimer(3);
myservo.setPeriodHertz(50); //standard 50hz servo
myservo.attach(servoPin, 10, 2800); // attaches the servo on pin 18 to the servo object
}
void loop(){
if(!client.connected()) {
mqttReconnect();
}
client.loop();
if(!strcmp(command.c_str(), "theft_on") || !strcmp(command.c_str(), "theft_off"))
{
Theft_detector = command;
}
if(!strcmp(command.c_str(), "device_on") || !strcmp(command.c_str(), "device_off"))
{
Device_status = command;
}
//Duc anh
if(!strcmp(Device_status.c_str(),"device_on")) {
TempAndHumidity data = dht.getTempAndHumidity();
T = data.temperature;
H = data.humidity;
client.publish("SH/Temp", String(T,2).c_str());
client.publish("SH/Humidity", String(H,2).c_str());
client.publish("SH/THStatus", curStatus.c_str());
client.publish("SH/Theft_detector", Theft_detector.c_str());
client.publish("SH/Door_status", door.c_str());
motion_alert = String(motion_time) + " seconds ago";
theft_alert = String(theft_time) + " seconds ago";
Serial.println("Motion: " + String(motion));
Serial.println("Theft detector: " + String(Theft_detector));
Serial.println("Motion time: " + String(motion_time));
Serial.println("Theft time: " + String(theft_time));
if(motion == 0)
{
client.publish("SH/Motion_alert", "No");
client.publish("SH/Theft_alert", "No");
}
if(motion == 2)
{
client.publish("SH/Motion_alert", motion_alert.c_str());
if(!strcmp(Theft_detector.c_str(), "theft_on")) {
client.publish("SH/Theft_alert", theft_alert.c_str());
if(!strcmp(Theft_Notification.c_str(), "Motion captured! Becareful of a thief in your house!"))
{
client.publish("SH/Theft_Notificiation", Theft_Notification.c_str());
Theft_Notification = "Nothing";
}
}
else{
String tp = "No alert";
client.publish("SH/Theft_alert", tp.c_str());
}
}
if(H >= 75.00 && T >= 35.00){
digitalWrite(21, HIGH);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(buzzer, 1); tone(buzzer, 900, 100);
delay(400);
digitalWrite(buzzer, 0); tone(buzzer, 900, 100);
delay(400);
digitalWrite(buzzer, 1); tone(buzzer, 900, 100);
delay(400);
digitalWrite(buzzer, 0); tone(buzzer, 900, 100);
delay(400);
motion_time+=2;
theft_time+=2;
curStatus = THStatus[2];
curStatusInt = 3;
THNotification = "Your house can be on fire right now! Temperature and humidity is too high!";
client.publish("SH/TH_Notification", THNotification.c_str());
}else{
digitalWrite(21, LOW);
digitalWrite(32, LOW);
digitalWrite(33, HIGH);
digitalWrite(buzzer, 0);
curStatusInt = 1;
curStatus = THStatus[0];
}
if(H < 75.00 && T >= 35.00){
digitalWrite(21, LOW);
digitalWrite(32, HIGH);
digitalWrite(33, LOW);
digitalWrite(buzzer, 1); tone(buzzer, 400, 400);
delay(400);
digitalWrite(buzzer, 0); tone(buzzer, 400, 400);
delay(400);
motion_time++;
theft_time++;
curStatusInt = 2;
curStatus = THStatus[1];
THNotification = "Look's like your house is a too hot! Beware of a fire!";
client.publish("SH/TH_Notification", THNotification.c_str());
}
if(H >= 75.00 && T < 35.00){
digitalWrite(21, LOW);
digitalWrite(32, HIGH);
digitalWrite(33, LOW);
digitalWrite(buzzer, 1); tone(buzzer, 400, 400);
delay(400);
digitalWrite(buzzer, 0); tone(buzzer, 400, 400);
delay(400);
curStatus = THStatus[1];
curStatusInt = 2;
motion_time++;
theft_time++;
THNotification = "Humidity is too high! Becareful";
client.publish("SH/TH_Notification", THNotification.c_str());
}
//********************
//Hoan
value=digitalRead(pirSensor);
if(value==HIGH){
if(pirState==LOW){
if(!strcmp(Theft_detector.c_str(),"theft_on")){
digitalWrite(buzzer, 1); tone(buzzer, 900, 100);
delay(400);
digitalWrite(buzzer, 0); tone(buzzer, 900, 100);
delay(400);
digitalWrite(buzzer, 1); tone(buzzer, 900, 100);
delay(400);
digitalWrite(buzzer, 0); tone(buzzer, 900, 100);
delay(400);
theft_time = 0;
theft_time+=2;
ThingSpeak.writeField(myChannelId, 6, 1, myWriteAPIKey);
theft_alert = "Motion captured";
Theft_Notification = "Motion captured! Becareful of a thief in your house!";
}
ThingSpeak.writeField(myChannelId, 7,1, myWriteAPIKey);
motion_alert = "Motion captured";
Serial.println(motion_alert);
motion_time = 0;
if(!strcmp(Theft_detector.c_str(),"theft_on"))
{
motion_time+=2;
}
motion = 1;
pirState=HIGH;
}
}
else{
digitalWrite(LED_white, LOW);
digitalWrite(buzzer,LOW);
if (pirState == HIGH) {
if(!strcmp(Theft_detector.c_str(),"theft_on"))
{
}
Serial.println("Motion stopped");
ThingSpeak.writeField(myChannelId, 7,0, myWriteAPIKey);
digitalWrite(LED_white,LOW);
motion = 2;
pirState = LOW;
}
}
//***********
//Quoc Trung
int device = random(0, 2);
char device_buffer[50];
sprintf(device_buffer, "%d", device);
client.publish("SH/Device_status", device_buffer);
if (!strcmp(command.c_str(),"open_door")){
door = "Open";
myservo.write(180);
digitalWrite(LED_white,HIGH);
}
if (!strcmp(command.c_str(),"close_door")){
door = "Close";
myservo.write(50);
digitalWrite(LED_white,LOW);
}
}
else{
String offline = "OFFLINE";
client.publish("SH/Temp", offline.c_str());
client.publish("SH/Humidity", offline.c_str());
client.publish("SH/THStatus", offline.c_str());
client.publish("SH/Theft_detector", offline.c_str());
client.publish("SH/Door_status", offline.c_str());
client.publish("SH/Motion_alert", offline.c_str());
client.publish("SH/Theft_alert", offline.c_str());
}
int buttonState = digitalRead(button);
if(buttonState != lastState){
lastMillis = millis();
lastState = buttonState;
}
if(!strcmp(Device_status.c_str(), "device_off")){
digitalWrite(LED_red_device, HIGH);
digitalWrite(LED_green_device, LOW);
}
else if(!strcmp(Device_status.c_str(), "device_on")){
digitalWrite(LED_red_device, LOW);
digitalWrite(LED_green_device, HIGH);
}
client.publish("SH/Device_status", Device_status.c_str());
motion_time++;
theft_time++;
delay(1000);
}