#include <WiFi.h>
#include <HTTPClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// ===== WIFI =====
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ===== SERVER =====
// wokwi.gateway.local => tunnel => localhost:9013
const char* serverUrl = "https://agreeably-parasite-onset.ngrok-free.app/data";
// ===== SENSORS =====
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// ===== LED =====
#define LED_TEMP 26
#define LED_HUM 25
// ===== LCD =====
LiquidCrystal_I2C lcd(0x27, 16, 2);
// ===== TIMER =====
unsigned long lastSend = 0;
const long interval = 2000;
void setup() {
Serial.begin(115200);
// WiFi
WiFi.begin(ssid, password);
Serial.print("[WiFi] Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n[WiFi] Connected");
Serial.print("[WiFi] IP: ");
Serial.println(WiFi.localIP());
// Sensors
sensors.begin();
dht.begin();
// LED
pinMode(LED_TEMP, OUTPUT);
pinMode(LED_HUM, OUTPUT);
digitalWrite(LED_TEMP, LOW);
digitalWrite(LED_HUM, LOW);
// LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("System Ready");
delay(1500);
lcd.clear();
}
void loop() {
if (millis() - lastSend < interval) return;
lastSend = millis();
sensors.requestTemperatures();
float temp = sensors.getTempCByIndex(0);
float hum = dht.readHumidity();
if (isnan(hum) || temp == DEVICE_DISCONNECTED_C) {
Serial.println("[ERR] Sensor failed");
return;
}
// ===== STATES =====
String etatTemp = (temp < 18) ? "FROD" : (temp <= 30) ? "NORM" : "CHAL";
String etatHum = (hum < 40) ? "BASS" : (hum <= 70) ? "NORM" : "ELEV";
// ===== LED =====
digitalWrite(LED_TEMP, temp > 30);
digitalWrite(LED_HUM, hum > 70);
// ===== LCD =====
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T:"); lcd.print(temp, 1);
lcd.print(" H:"); lcd.print(hum, 1);
lcd.setCursor(0, 1);
lcd.print(etatTemp);
lcd.print("/");
lcd.print(etatHum);
// ===== JSON =====
String json = "{";
json += "\"temperature\":" + String(temp, 1) + ",";
json += "\"humidity\":" + String(hum, 1) + ",";
json += "\"etatTemp\":\"" + etatTemp + "\",";
json += "\"etatHum\":\"" + etatHum + "\"";
json += "}";
// ===== HTTP POST =====
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(serverUrl);
http.addHeader("Content-Type", "application/json");
int code = http.POST(json);
if (code > 0) {
Serial.printf("[TX] OK code=%d %s\n", code, json.c_str());
} else {
Serial.printf("[TX] FAIL error=%s\n", HTTPClient::errorToString(code).c_str());
}
http.end();
} else {
Serial.println("[WiFi] Not connected");
}
}