#include "DHTesp.h"
#include <PubSubClient.h>
#include <WiFi.h>
const int DHT_PIN = 15;
static char strTemperature[10] = {0};
static char strHumidity[8];
DHTesp dhtSensor;
char clientId[50];
//1-declarer le topic
#define TOPIC_PUBLISH_TEMPERATURE "topic_sensor_temperature"
#define TOPIC_PUBLISH_TEMPERATURE_ALERT "topic_sensor_temperature_alert"
#define TOPIC_PUBLISH_HUMIDITY = "home/humidity";
//2-configuration du point d accés
const char* ssid = "Wokwi-GUEST";
const char* password = "";
//3-configuration du broker EMQX PORT 1883
const char* mqttServer = "broker.emqx.io";
int port = 1883;
//4-configuration d un clien mqtt (publisher)
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long publishUpdate;
#define PUBLISH_DELAY 2000 //envoi chaque 2s
void setup() {
Serial.begin(115200);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
// 5-initialisation du wifi
initWiFi();
// 6-initialisation du broker mqtt
initMQTT();
}
void initWiFi(void)
{
delay(10);
Serial.println("------cnx WI-FI------");
Serial.print("Cnx ready: ");
Serial.println(ssid);
Serial.println("ok");
//reconnection en cas de perte de connexion
reconnectWiFi();
}
void initMQTT(void)
{
client.setServer(mqttServer, port);
}
//en cas de probleme de connexion
void reconnectMQTT() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
long r = random(1000);
sprintf(clientId, "clientId-%ld", r);
if (client.connect(clientId)) {
Serial.print(clientId);
Serial.println(" connected");
//client.subscribe("topicName/led");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
//
void checkWiFIAndMQTT(void)
{
if (!client.connected())
reconnectMQTT();
reconnectWiFi();
}
void reconnectWiFi(void)
{
if (WiFi.status() == WL_CONNECTED)
return;
WiFi.begin(ssid, password); // Conecta na rede WI-FI
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println();
Serial.print("Cnx success ");
Serial.print(ssid);
Serial.println("IP adresse: ");
Serial.println(WiFi.localIP());
}
void loop() {
//lire les valeurs temp et hum
TempAndHumidity data = dhtSensor.getTempAndHumidity();
//si la valeur actuelle "millis" depasse un delay de 2s"publishUpdate" on fait un update
if ((millis() - publishUpdate) >= PUBLISH_DELAY) {
publishUpdate = millis();
//verifier la connexion avant l envoie
checkWiFIAndMQTT();
// envoie de la valeur vers le topic MQTT
client.publish(TOPIC_PUBLISH_TEMPERATURE, strTemperature);
sprintf(strHumidity, "%.2f", data.humidity);
client.publish("home/humidity", strHumidity);
// Vérifier si la température dépasse 30°C
if (data.temperature > 30) {
// Publier 1 si la température est supérieure à 30
client.publish(TOPIC_PUBLISH_TEMPERATURE_ALERT, "1");
// convertir la valeur de float en chaine
sprintf(strTemperature, "%.2f", data.temperature);
}
client.loop();
}
}