include <WiFi.h>
#include <ESP32Servo.h>
#include <PubSubClient.h>
#include <ThingSpeak.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 unsigned long myChannelId = 1992616;
const char* myWriteAPIKey = "AYD6TXU2E0GV3FAR";
const char* myReadAPIKey = "WGD26OGCR6PEKALY";
int LED_red_device = 13; //for on-off signal only
int LED_green_device = 12; //for on-off signal only
int LED_red = 35;
int LED_red = 34;
int LED_red = 33;
int LED_white = 27;
int buzzer=14;
int button = 4;
//**** phan duoi chua chinh port
int led=14;
int pirSensor=12;
int pirState=LOW;
int value=0;
int chk;
int buzzer = 4;
int curStatusInt = 1;
float H;
float T;
DHTesp dht;
String chongtrom="" ;
String THNotification = "";
String THStatus[3] = {"Normal", "Suspicious", "Alert"};
String curStatus = "";
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/Door_control");
client.subscribe("SH/Theft_detector");
}
else {
Serial.println("try again in 5 seconds");
delay(5000);
}
}
}
void setup(){
Serial.begin(9600);
dht.setup(15, DHTesp::DHT22);
pinMode(buzzer, OUTPUT);
pinMode(led,OUTPUT);
pinMode(buzzer,OUTPUT);
pinMode(pirSensor,INPUT);
pinMode(14, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, 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
pinMode(LED, OUTPUT);
Serial.println("Door is ");
}
void callback(char* topic, byte* message, unsigned int length) {
String strMsg;
for(int i=0; i<length; i++) {
strMsg += (char)message[i];
}
chongtrom = strMsg;
Serial.println(strMsg);
}
void loop(){
int door;
if(!client.connected()) {
mqttReconnect();
}
client.loop();
//Duc anh
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/TH_Notification", THNotification.c_str());
client.publish("SH/THStatus", curStatusInt);
if(H >= 75.00 && T >= 35.00){
digitalWrite(13, HIGH);
digitalWrite(12, LOW);
digitalWrite(14, 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);
curStatus = THStatus[2];
curStatusInt = 3;
THNotification = "Your house can be on fire right now! Temperature and humidity is too high!";
}else{
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(14, HIGH);
digitalWrite(buzzer, 0);
curStatusInt = 1;
curStatus = THStatus[0];
}
if(H < 75.00 && T >= 35.00){
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
digitalWrite(14, LOW);
digitalWrite(buzzer, 1); tone(buzzer, 400, 400);
delay(400);
digitalWrite(buzzer, 0); tone(buzzer, 400, 400);
delay(400);
curStatusInt = 2;
curStatus = THStatus[1];
THNotification = "Look's like your house is a too hot! Beware of a fire!";
}
if(H >= 75.00 && T < 35.00){
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
digitalWrite(14, LOW);
digitalWrite(buzzer, 1); tone(buzzer, 400, 400);
delay(400);
digitalWrite(buzzer, 0); tone(buzzer, 400, 400);
delay(400);
curStatus = THStatus[1];
curStatusInt = 2;
THNotification = "Humidity is too high! Becareful";
}
delay(500);
//********************
int device = random(0, 2);
char device_buffer[50];
sprintf(device_buffer, "%d", device);
client.publish("SH/Device_status", device_buffer);
delay(1000);
Serial.println(chongtrom);
value=digitalRead(pirSensor);
if(value==HIGH){
if(pirState==LOW){
if(chongtrom=="1"){
digitalWrite(led,HIGH);
tone(buzzer,1000);
delay(500);
noTone(buzzer);
digitalWrite(led,LOW);
ThingSpeak.writeField(myChannelId, 6, 1, myWriteAPIKey);
}
ThingSpeak.writeField(myChannelId, 5,1, myWriteAPIKey);
String a="motion ended";
char buffer[50];
strcpy(buffer, a.c_str());
client.publish("SH/Motion_alert", buffer);
pirState=HIGH;
}
}
else{
digitalWrite(led, LOW);
digitalWrite(buzzer,LOW);
if (pirState == HIGH) {
ThingSpeak.writeField(myChannelId, 5,0, myWriteAPIKey);
String a="motion ended";
char buffer[50];
strcpy(buffer, a.c_str());
client.publish("SH/Motion_alert", buffer);
pirState = LOW;
}
}
delay(500);
while (Serial.available() >0 ){
String command = Serial.readString();
if (command == "OPEN"){
Serial.println(command);
door = 1;
char door_buffer[50];
sprintf(door_buffer, "%d", door);
client.publish("SH/Door_status", door_buffer);
for (pos = 0; pos<=180; pos+=1){
myservo.write(pos);
digitalWrite(LED,HIGH);
delay(15);
}
}
if (command == "CLOSED"){
Serial.println(command);
door = 0;
char door_buffer[50];
sprintf(door_buffer, "%d", door);
client.publish("SH/Door_status", door_buffer);
for (pos = 180; pos>=0; pos-=1){
myservo.write(pos);
digitalWrite(LED,LOW);
delay(15);
}
}
}
/*
int buttonState = digitalRead(button);
if(buttonState != lastState){
lastMillis = millis();
lastState = buttonState;
}
if(buttonState == HIGH) {
if(millis() - lastMillis > 3000){
lastMillis = millis();
digitalWrite(red_led, HIGH);
delay(1000);
digitalWrite(red_led, LOW);
}
}
*/
}