#include <WiFi.h>
#include "PubSubClient.h"
#include <LCD_I2C.h>
// Configuration de l'afficheur LCD
LCD_I2C lcd(0x27, 16, 2); // Adresse I2C (0x27), 16 colonnes, 2 lignes
// Configuration du point d'accès WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Configuration du broker MQTT
const char* mqttServer = "broker.emqx.io";
int port = 1883;
// Configuration des pins et seuils
const int seuiltemp = 30;
const int buzzerPin = 4;
// Variables pour le client MQTT
WiFiClient espClient;
PubSubClient client(espClient);
char clientId[50];
void setup() {
Serial.begin(115200);
// Initialisation du LCD
lcd.begin();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(F("Demarrage..."));
// Initialisation du buzzer
pinMode(buzzerPin, OUTPUT);
// Connexion au WiFi
Serial.println("Connexion au WiFi...");
lcd.setCursor(0, 1);
lcd.print(F("WiFi: En cours"));
wifiConnect();
Serial.println("WiFi connecte");
lcd.setCursor(0, 1);
lcd.print(F("WiFi: Connecte "));
// Configuration du client MQTT
client.setServer(mqttServer, port);
client.setCallback(callback);
}
void wifiConnect() {
WiFi.mode(WIFI_STA); // Mode station
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
lcd.setCursor(0, 1);
lcd.print(F("WiFi: En cours"));
}
lcd.setCursor(0, 1);
lcd.print(F("WiFi: OK "));
}
void mqttReconnect() {
while (!client.connected()) {
Serial.print("Connexion au MQTT...");
lcd.setCursor(0, 1);
lcd.print(F("MQTT: Conn."));
// Générer un ID client aléatoire
long r = random(1000);
sprintf(clientId, "clientId-%ld", r);
if (client.connect(clientId)) {
Serial.println("MQTT connecte");
lcd.setCursor(0, 1);
lcd.print(F("MQTT: Connecte"));
// S'abonner au topic
client.subscribe("topic_temp");
} else {
Serial.print("Echec MQTT, rc=");
Serial.println(client.state());
lcd.setCursor(0, 1);
lcd.print(F("MQTT: Echec "));
delay(5000);
}
}
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message recu [");
Serial.print(topic);
Serial.print("]: ");
String stMessage = "";
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
stMessage += (char)message[i];
}
Serial.println();
if (String(topic) == "topic_temp") {
Serial.print("Analyse du message : ");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("Topic: Temp"));
if (stMessage.toInt() > seuiltemp) {
Serial.println("Seuil depasse!");
lcd.setCursor(0, 1);
lcd.print(F("ALERTE TEMP!"));
tone(buzzerPin, 700, 2000); // Activer le buzzer
} else {
Serial.println("Temp normale");
lcd.setCursor(0, 1);
lcd.print(F("Temp normale"));
noTone(buzzerPin); // Désactiver le buzzer
}
}
}
void loop() {
delay(10);
if (!client.connected()) {
mqttReconnect();
}
client.loop();
}