#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include "DHTesp.h"
// Wi-Fi
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
// Serveur
const char* SERVER_BASE_URL = "https://afraid-rocks-sink.loca.lt";
const char* UPLOAD_ENDPOINT = "/upload";
const char* LED_ENDPOINT = "/led";
// Matériel
const uint8_t DHT_PIN = 15;
const uint8_t LED_PIN = 2;
// Intervalles
const unsigned long SENSOR_SEND_INTERVAL = 2000;
const unsigned long LED_SYNC_INTERVAL = 5000;
const unsigned long WIFI_RETRY_INTERVAL = 3000;
DHTesp dhtSensor;
unsigned long lastSensorSend = 0;
unsigned long lastLedSync = 0;
unsigned long lastWiFiRetry = 0;
String buildUrl(const char* endpoint) {
return String(SERVER_BASE_URL) + endpoint;
}
void connectWiFi() {
if (WiFi.status() == WL_CONNECTED) return;
Serial.println();
Serial.print("Connexion au WiFi : ");
Serial.println(WIFI_SSID);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
unsigned long startAttemptTime = millis();
const unsigned long wifiTimeout = 10000;
while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < wifiTimeout) {
delay(500);
Serial.print(".");
}
Serial.println();
if (WiFi.status() == WL_CONNECTED) {
Serial.println("WiFi connecté.");
Serial.print("Adresse IP : ");
Serial.println(WiFi.localIP());
} else {
Serial.println("Échec connexion WiFi.");
}
}
void ensureWiFiConnection() {
if (WiFi.status() == WL_CONNECTED) return;
if (millis() - lastWiFiRetry >= WIFI_RETRY_INTERVAL) {
lastWiFiRetry = millis();
Serial.println("WiFi perdu. Reconnexion...");
connectWiFi();
}
}
bool readSensorData(float &temperature, float &humidity) {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
if (isnan(data.temperature) || isnan(data.humidity)) {
Serial.println("Lecture DHT invalide.");
return false;
}
temperature = data.temperature;
humidity = data.humidity;
return true;
}
bool sendSensorData(float temperature, float humidity) {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi non connecté. Envoi annulé.");
return false;
}
WiFiClientSecure client;
client.setInsecure();
HTTPClient http;
String url = buildUrl(UPLOAD_ENDPOINT);
if (!http.begin(client, url)) {
Serial.println("Impossible d'ouvrir /upload");
return false;
}
http.setTimeout(2000);
http.addHeader("Content-Type", "application/json");
StaticJsonDocument<256> doc;
doc["temperature"] = temperature;
doc["humidity"] = humidity;
String payload;
serializeJson(doc, payload);
Serial.println("Envoi capteur...");
Serial.print("POST ");
Serial.println(url);
Serial.print("Payload : ");
Serial.println(payload);
int httpResponseCode = http.POST(payload);
if (httpResponseCode > 0) {
Serial.print("Code HTTP : ");
Serial.println(httpResponseCode);
String response = http.getString();
Serial.print("Réponse : ");
Serial.println(response);
http.end();
return true;
} else {
Serial.print("Erreur HTTP : ");
Serial.println(http.errorToString(httpResponseCode));
http.end();
return false;
}
}
bool syncLedState() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi non connecté. Sync LED annulée.");
return false;
}
WiFiClientSecure client;
client.setInsecure();
HTTPClient http;
String url = buildUrl(LED_ENDPOINT);
if (!http.begin(client, url)) {
Serial.println("Impossible d'ouvrir /led");
return false;
}
http.setTimeout(2000);
Serial.print("GET ");
Serial.println(url);
int httpResponseCode = http.GET();
if (httpResponseCode <= 0) {
Serial.print("Erreur HTTP sync LED : ");
Serial.println(http.errorToString(httpResponseCode));
http.end();
return false;
}
String response = http.getString();
http.end();
Serial.print("Réponse LED : ");
Serial.println(response);
StaticJsonDocument<256> doc;
DeserializationError error = deserializeJson(doc, response);
if (error) {
Serial.print("Erreur JSON LED : ");
Serial.println(error.c_str());
return false;
}
bool ledEnabled = doc["enabled"] | false;
digitalWrite(LED_PIN, ledEnabled ? HIGH : LOW);
Serial.print("LED synchronisée : ");
Serial.println(ledEnabled ? "ON" : "OFF");
return true;
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("Démarrage ESP32...");
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
connectWiFi();
}
void loop() {
ensureWiFiConnection();
unsigned long currentMillis = millis();
if (currentMillis - lastSensorSend >= SENSOR_SEND_INTERVAL) {
lastSensorSend = currentMillis;
float temperature = 0.0;
float humidity = 0.0;
if (readSensorData(temperature, humidity)) {
Serial.print("Température : ");
Serial.print(temperature);
Serial.print(" °C | Humidité : ");
Serial.print(humidity);
Serial.println(" %");
sendSensorData(temperature, humidity);
}
}
if (currentMillis - lastLedSync >= LED_SYNC_INTERVAL) {
lastLedSync = currentMillis;
syncLedState();
}
}Loading
esp32-devkit-c-v4
esp32-devkit-c-v4