#include <WiFi.h>
#include <PubSubClient.h>
#include <DHTesp.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
const int DHT_PIN = 14;
#define Buzzer 12
char tempAr[6];
char humiAr[6];
WiFiClient espClient;
PubSubClient mqttClient(espClient);
DHTesp dhtSensor;
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
bool isAlarm1 = false;
bool isAlarm2 = false;
bool isAlarm3 = false;
unsigned long alarm1OnTime;
unsigned long alarm2OnTime;
unsigned long alarm3OnTime;
void setup() {
Serial.begin(115200);
setupWifi();
setupMqtt();
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
timeClient.begin();
timeClient.setTimeOffset(5.5 * 3600);
pinMode(Buzzer, OUTPUT);
digitalWrite(Buzzer, LOW);
}
void loop() {
if (!mqttClient.connected()){
connectToBroker();
}
mqttClient.loop(); //Update mqttClient
updateTemperatureAndHuminidity();
Serial.println(tempAr);
Serial.println(humiAr);
checkShedule();
mqttClient.publish("210610H-Temp", tempAr); //Send data
mqttClient.publish("210610H-Humi", humiAr);
delay(1000);
}
unsigned long getTime(){
timeClient.update();
return timeClient.getEpochTime();
}
void setupWifi() {
Serial.println("Connecting to WIFI..");
WiFi.begin("Wokwi-GUEST", "");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WIFI connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void setupMqtt() {
mqttClient.setServer("test.mosquitto.org", 1883);
mqttClient.setCallback(receiveCallback);
}
void connectToBroker(){
while (!mqttClient.connected()){
Serial.println("Attempting MQTT connectionn...");
if (mqttClient.connect("ESP32-20020131")){
Serial.println("Connected to broker");
mqttClient.subscribe("Main-ON-OFF");
mqttClient.subscribe("ENTC-210610H-Alarm1");
//mqttClient.subscribe("ENTC-210610H-Alarm2");
//mqttClient.subscribe("ENTC-210610H-Alarm3");
}
else{
Serial.println("Failed (Connect to broker)");
Serial.println(mqttClient.state());
delay(5000);
}
}
}
void updateTemperatureAndHuminidity(){
TempAndHumidity data = dhtSensor.getTempAndHumidity();
String(data.temperature, 2).toCharArray(tempAr, 6);
String(data.humidity, 2).toCharArray(humiAr, 6);
}
void buzzerOn(bool on){
if (on){
tone(Buzzer, 262);
}
else{
noTone(Buzzer);
}
}
void receiveCallback(char* topic, byte* payload, unsigned int length){
Serial.print("Message arrived[");
Serial.print(topic);
Serial.println("]");
char payloadCharAr[length];
for(int i = 0; i<length; i++){
Serial.print((char)payload[i]);
payloadCharAr[i] = (char)payload[i];
}
if (strcmp(topic, "Main-ON-OFF") == 0){
buzzerOn(payloadCharAr[0] == 't');
}
else if (strcmp(topic, "ENTC-210610H-Alarm1") == 0){
if (payloadCharAr[0] == 'N'){
isAlarm1 = false;
}
else{
isAlarm1 = true;
alarm1OnTime = atol(payloadCharAr);
}
}
}
void checkShedule(){
unsigned long currentTime = getTime();
if(isAlarm1){
if (currentTime > alarm1OnTime){
buzzerOn(true);
isAlarm1 = false;
Serial.println("Alarm 1 ON");
}
}
/*if(isAlarm2){
if (currentTime > alarm2OnTime){
buzzerOn(true);
isAlarm2 = false;
Serial.println("Alarm 2 ON");
}
}
if(isAlarm3){
if (currentTime > alarm3OnTime){
buzzerOn(true);
isAlarm3 = false;
Serial.println("Alarm 3 ON");
}
}*/
}