#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
#define ssid "Wokwi-GUEST";
#define password "";
// MQTT
const char* mqtt_server = "51.75.35.138";
const int mqtt_port = 1883;
const char* mqtt_user = "youpilab_iot";
const char* mqtt_pass = "rootAdmin";
const char* device_id = "BURB7D0C";
const char* topic_tx = "youpilab/devices/BURB7D0C/tx";
const char* topic_rx = "youpilab/devices/BURB7D0C/rx";
// PINS
#define DHTPIN 4
#define DHTTYPE DHT22
#define LED_PIN 2
#define BUTTON_PIN 13
DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
bool systemOn = false;
bool lastButtonState = HIGH;
// TIMERS
unsigned long previousMillis = 0;
const long interval = 3000;
// Anti-rebond bouton
unsigned long lastDebounceTime = 0;
const long debounceDelay = 200;
// Reconnexion MQTT
unsigned long lastReconnectAttempt = 0;
const long reconnectInterval = 3000;
// WIFI
void setup_wifi() {
WiFi.begin(ssid, password);
Serial.print("[WIFI] Connexion...");
}
// CALLBACK MQTT
void callback(char* topic, byte* payload, unsigned int length) {
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("[MQTT] Reçu: ");
Serial.println(message);
if (message == "ON") systemOn = true;
else if (message == "OFF") systemOn = false;
}
void handleMQTT() {
if (client.connected()) return;
unsigned long currentMillis = millis();
if (currentMillis - lastReconnectAttempt >= reconnectInterval) {
lastReconnectAttempt = currentMillis;
String clientId = "ESP32-" + String(device_id);
if (client.connect(clientId.c_str(), mqtt_user, mqtt_pass)) {
Serial.println("[MQTT] Connecté");
client.subscribe(topic_rx);
} else {
Serial.print("[MQTT] Erreur: ");
Serial.println(client.state());
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
dht.begin();
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
// WIFI STATUS
if (WiFi.status() != WL_CONNECTED) {
setup_wifi();
}
// MQTT
handleMQTT();
client.loop();
// BOUTON
bool currentButtonState = digitalRead(BUTTON_PIN);
if (lastButtonState == HIGH && currentButtonState == LOW) {
unsigned long currentMillis = millis();
if (currentMillis - lastDebounceTime > debounceDelay) {
systemOn = !systemOn;
Serial.println(systemOn ? "[SYSTEM] ON (bouton)" : "[SYSTEM] OFF (bouton)");
lastDebounceTime = currentMillis;
}
}
lastButtonState = currentButtonState;
//LED
digitalWrite(LED_PIN, systemOn ? HIGH : LOW);
// ENVOI DHT
if (systemOn && client.connected()) {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
float t = dht.readTemperature();
float h = dht.readHumidity();
if (!isnan(t) && !isnan(h)) {
String payload = "{";
payload += "\"temperature\":" + String(t) + ",";
payload += "\"humidite\":" + String(h);
payload += "}";
client.publish(topic_tx, payload.c_str());
Serial.println("[MQTT] Envoyé: " + payload);
}
}
}
}