#include <WiFi.h>
#include <PubSubClient.h>
#include <WiFiClientSecure.h>
#include <ESP32Servo.h>
#include <ArduinoJson.h>
#include "DHT.h"
#define dhttype DHT11
#define dhtpin 14
DHT dht(dhtpin, dhttype);
const int connectwifi = 12 ;
const int led = 25 ;
const int led2 = 26 ;
const int Fan = 13 ;
#define gas 36
#define Buzzer 33
#define Anhsang 32
#define wea 34
const int serPin = 27;
Servo servo;
int ros = 0,g;
boolean rainState=LOW, rainState1=LOW, automan=1,w;
//char ssid[]="Redmi Note 11 Pro";
//char pass[]="Azz7799@7";
//char ssid[]="Wokwi-GUEST";
//char pass[]="";
//char ssid[]="Tenda_582570";
//char pass[]="";
char ssid[]="Van Thuan";
char pass[]="Azz7799@07";
const char* mqtt_server = "e874cc695195418bb08c975c51cbf50a.s1.eu.hivemq.cloud";
const int mqtt_port = 8883;
const char* mqtt_username = "phamde";
const char* mqtt_password ="Phamde111";
WiFiClientSecure espClient;
PubSubClient client(espClient);
void initWiFi() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
Serial.print("Connecting to WiFi ");
Serial.print(ssid);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
randomSeed(micros());
Serial.println(" Connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
digitalWrite(connectwifi, LOW);
String clientID = "ESP32Client-";
clientID += String(random(0xffff),HEX);
if (client.connect(clientID.c_str(), mqtt_username, mqtt_password)) {
digitalWrite(connectwifi, HIGH);
Serial.println("connected");
client.subscribe("esp32/client");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
//-----Call back Method for Receiving MQTT massage---------
void callback(char* topic, byte* payload, unsigned int length) {
String CommingMessage = "";
for(int i=0; i<length;i++) CommingMessage += (char)payload[i];
Serial.println("Massage arived ["+String(topic)+"]"+CommingMessage);
DynamicJsonDocument doc(100);
DeserializationError error = deserializeJson(doc, CommingMessage);
if (error) {
Serial.print("deserializeJson() failed: ");
Serial.println(error.c_str());
return;
}
if(doc.containsKey("weather")){
boolean x = doc["weather"];
if(x==LOW){
for (ros = 0; ros <= 180; ros += 1) {
servo.write(ros);
delay(5);
}}if(x==HIGH){
for (ros = 180; ros >= 0; ros -= 1) {
servo.write(ros);
delay(5);
} }
}
if(doc.containsKey("auto/man")){
automan = doc["auto/man"];
}}
//-----Method for Publishing MQTT Messages---------
void publishMessage(const char* topic, String payload, boolean retained){
if(client.publish(topic,payload.c_str(),retained))
Serial.println("Message published ["+String(topic)+"]: "+payload);}
void warning()
{ g = analogRead(gas);
if( g >=700)
{
digitalWrite(Buzzer,HIGH);
digitalWrite(Fan,HIGH);
}
if(g <700)
{
digitalWrite(Buzzer,LOW);
digitalWrite(Fan,LOW);
}}
boolean damua=0, damua1=0;
void weather(){
w=digitalRead(wea);
if(automan==1){
if(damua==1){
if(w ==0){
rainState=HIGH;
for (ros = 180; ros >= 0; ros -= 1) {
servo.write(ros);
delay(5);
damua=0;
}}}
if(damua==0){
if(w ==1){
rainState=HIGH;
for (ros = 0; ros <= 180; ros += 1) {
servo.write(ros);
delay(5);
damua=1;
}}}
}
if(automan==0){
if(damua1==1)
if(w==0){
rainState1=HIGH;
damua1=0;}}
if(damua1==0){
if(w==1){
rainState1=HIGH;
damua1=1;}}
}
void asang()
{
if(digitalRead(Anhsang)==1) {digitalWrite(led,HIGH);digitalWrite(led2,HIGH);}
else {digitalWrite(led,LOW);digitalWrite(led2,LOW);}}
void setup() {
Serial.begin(115200);
initWiFi();
dht.begin();
espClient.setInsecure();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
servo.attach(serPin);
pinMode(connectwifi, OUTPUT);
pinMode(wea, INPUT);
pinMode(gas,INPUT);
pinMode(Buzzer,OUTPUT);
pinMode(Fan,OUTPUT);
pinMode(led,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(Anhsang,INPUT);
}
unsigned long timeUpdata=millis();
void loop() {
if (!client.connected()) {
reconnect();
}
warning();
weather();
asang();
client.loop();
if(rainState==HIGH){
DynamicJsonDocument doc(1024);
doc["weather"]=digitalRead(wea);
char mqtt_message[128];
serializeJson(doc,mqtt_message);
publishMessage("esp/weather", mqtt_message, false);
rainState=0;
}
if(rainState1==HIGH){
DynamicJsonDocument doc(1024);
doc["weather1"]=digitalRead(wea);
char mqtt_message[128];
serializeJson(doc,mqtt_message);
publishMessage("esp/weather", mqtt_message, false);
rainState1=0;
}
//read DHT11
if(millis()-timeUpdata>4000){
timeUpdata=millis();
float h = dht.readHumidity();
float t = dht.readTemperature();
DynamicJsonDocument doc(1024);
doc["humidity"]=h;
doc["temperature"]=t;
doc["gas"]=g;
char mqtt_message[128];
serializeJson(doc,mqtt_message);
publishMessage("esp/sensor*", mqtt_message, false);
}
}