#include "DHT.h"
#include <WiFi.h>
extern "C"{
#include "freertos/FreeRTOS.h"
#include "freertos/timers.h"
}
#define ASYNC_TCP_SSL_ENABLED true
#include <AsyncMqtt_Generic.h>
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define MQTT_HOST IPAddress(192,168,1,1)
// #if ASYNC_TCP_SSL_ENABLED
// #define MQTT_SECURE true
// const uint8_t MQTT_SERVER_FINGERPRINT[] = {0x7e, 0x36, 0x22, 0x01, 0xf9, 0x7e, 0x99, 0x2f, 0xc5, 0xdb, 0x3d, 0xbe, 0xac, 0x48, 0x67, 0x5b, 0x5d, 0x47, 0x94, 0xd2};
// const char *PubTopic = "async-mqtt/ESP32_SSL_Pub"; // Topic to publish
// #define MQTT_PORT 1883
// #else
// const char *PubTopic = "async-mqtt/ESP32_Pub"; // Topic to publish
// #define MQTT_PORT 1883
// #endif
#define MQTT_PORT 1883
#define MQTT_PUB_TEMP "esp32/dht/temperature"
#define MQTT_PUB_HUM "esp32/dht/humidity"
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
float temp;
float hum;
AsyncMqttClient mqttClient;
TimerHandle_t mqttReconnectTimer;
TimerHandle_t wifiReconnectTimer;
unsigned long previousMillis = 0; // Stores last time temperature was published
const long interval = 10000;
void connectToWifi(){
Serial.println("Connecting to WiFi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD,6);
}
void connectToMqtt(){
Serial.println("Connecting to Mqtt...");
mqttClient.connect();
Serial.println("Connected");
// mqttClient.begin()
}
void WiFiEvent(WiFiEvent_t event){
Serial.printf("[WiFi-event] event: %d\n", event);
switch(event){
case SYSTEM_EVENT_STA_GOT_IP:
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
connectToMqtt();
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
Serial.println("WiFi lost connection");
xTimerStop(mqttReconnectTimer, 0); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi
xTimerStart(wifiReconnectTimer, 0);
break;
}
}
void onMqttConnect(bool sessionPresent){
Serial.println("Connect to MQTT");
Serial.println("Session present");
Serial.println(sessionPresent);
}
void onMqttDisconnect (AsyncMqttClientDisconnectReason reason){
Serial.println("Disconnect from Mqtt");
if(WiFi.isConnected()){
xTimerStart(mqttReconnectTimer, 0);
}
}
void onMqttPublish(uint16_t packetId) {
Serial.print("Publish acknowledged.");
Serial.print("packetId: ");
Serial.println(packetId);
}
void onMqttSubscribe(const uint16_t& packetId, const uint8_t& qos)
{
Serial.println("Subscribe acknowledged.");
Serial.print(" packetId: "); Serial.println(packetId);
Serial.print(" qos: "); Serial.println(qos);
}
void setup() {
Serial.begin(115200);
Serial.println();
dht.begin();
mqttReconnectTimer = xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToMqtt));
wifiReconnectTimer = xTimerCreate("wifiTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToWifi));
WiFi.onEvent(WiFiEvent);
mqttClient.onConnect(onMqttConnect);
mqttClient.onDisconnect(onMqttDisconnect);
mqttClient.onPublish(onMqttPublish);
mqttClient.setServer(MQTT_HOST, MQTT_PORT);
connectToWifi();
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
hum = dht.readHumidity();
temp = dht.readTemperature();
if(isnan(temp) || isnan(hum)){
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
uint16_t packetIdSub = mqttClient.subscribe(MQTT_PUB_TEMP, 2);
Serial.print("Subscribing at QoS 2, packetId: "); Serial.println(packetIdSub);
uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP,1,true,String(temp).c_str());
Serial.printf("Publishing on topic %s at QoS 1, packetId: %i", MQTT_PUB_TEMP, packetIdPub1);
Serial.printf("Message: %.2f \n", temp);
uint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM, 1, true, String(hum).c_str());
Serial.printf("Publishing on topic %s at QoS 1, packetId %i: ", MQTT_PUB_HUM, packetIdPub2);
Serial.printf("Message: %.2f \n", hum);
}
}