#include <PubSubClient.h>
#include <WiFi.h>
#include "DHTesp.h"
#include <NTPClient.h>
#include <WiFiUdp.h>
#define LED_PIN 13
#define BUZZER 12
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
WiFiClient espClient;
PubSubClient mqttClient(espClient);
bool isScheduledON = false;
unsigned long scheduledOnTime;
const int DHT_PIN = 15;
char tempAr[6];
DHTesp dhtSensor;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32!");
setupWifi();
setupMqtt();
dhtSensor.setup(DHT_PIN,DHTesp::DHT22);
timeClient.begin();
timeClient.setTimeOffset(5.5*3600);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
pinMode(BUZZER, OUTPUT);
digitalWrite(BUZZER, LOW);
}
void loop() {
if(!mqttClient.connected()){
connectToBroker();
}
mqttClient.loop();
checkSchedule();
updateTemperature();
Serial.println(tempAr);
mqttClient.publish("ENTC-TEMP",tempAr);
delay(500);
// put your main code here, to run repeatedly:
// this speeds up the simulation
}
void setupWifi(){
WiFi.begin("Wokwi-GUEST", "");
while(WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.print("Wifi is Connected");
}
void setupMqtt(){
mqttClient.setServer("test.mosquitto.org",1883);
mqttClient.setCallback(receiveCallBack);
}
void connectToBroker(){
while(!mqttClient.connected()){
Serial.println("Attempting to MQTT connection...");
if(mqttClient.connect("ESP32-465456465645")){
Serial.println("Connected");
mqttClient.subscribe("ENTC-ON-OFF");
mqttClient.subscribe("ENTC-ADMIN-SCH-ON");
}
else{
Serial.println("Failed");
Serial.println(mqttClient.state());
delay(5000);
}
}
}
void buzzerOn(bool on){
if(on){
tone(BUZZER,256);
}
else{
noTone(BUZZER);
}
}
unsigned long getTime(){
timeClient.update();
return timeClient.getEpochTime();
}
void checkSchedule(){
if(isScheduledON){
unsigned long currentTime = getTime();
if(currentTime > scheduledOnTime){
buzzerOn(true);
isScheduledON = false;
mqttClient.publish("ENTC-ADMIN-MAIN-ON-OFF-ESP","1");
Serial.println("scheduled ON");
}
}
}
void updateTemperature(){
TempAndHumidity data = dhtSensor.getTempAndHumidity();
String(data.temperature,2).toCharArray(tempAr,6);
}
void receiveCallBack(char* topic,byte* payload, unsigned int length){
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("]");
char payloadCharAr[length];
for(int i = 0;i<length;i++){
Serial.print((char)payload[i]);
payloadCharAr[i] = (char)payload[i];
}
Serial.print("..");
if(strcmp(topic,"ENTC-ON-OFF")==0){
buzzerOn(payloadCharAr[0] == '1');
if(payloadCharAr[0] == '1'){
digitalWrite(LED_PIN, HIGH);
}
else{
digitalWrite(LED_PIN, LOW);
}
}
else if(strcmp(topic,"ENTC-ADMIN-SCH-ON")==0){
if(payloadCharAr[0] == 'N'){
isScheduledON = false;
}
else{
isScheduledON = true;
scheduledOnTime = atol(payloadCharAr);
}
}
}