/* ESP32 HTTP IoT Server Example for Wokwi.com
https://wokwi.com/projects/320964045035274834
To test, you need the Wokwi IoT Gateway, as explained here:
https://docs.wokwi.com/guides/esp32-wifi#the-private-gateway
Then start the simulation, and open http://localhost:9080
in another browser tab.
Note that the IoT Gateway requires a Wokwi Club subscription.
To purchase a Wokwi Club subscription, go to https://wokwi.com/club
*/
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <uri/UriBraces.h>
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define WIFI_CHANNEL 6
#define WIFI_TIMEOUT 10000 // 10 secondes
WebServer server(80);
// Broches des capteurs et LEDs
const int pressurePin = 34; // Capteur de pression
const int flowPin = 35; // Capteur de débit
const int tempPin = 32; // Capteur de température
const int ledPressure = 26; // LED pour alerte de pression
const int ledTemp = 27; // LED pour alerte de température
// Seuils d'alerte
const float pressureThreshold = 100.0; // Seuil de pression
const float tempThreshold = 60.0; // Seuil de température
bool ledPressureState = false;
bool ledTempState = false;
void connectToWiFi() {
Serial.print("Connecting to WiFi ");
Serial.print(WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD, WIFI_CHANNEL);
unsigned long startTime = millis();
while (WiFi.status() != WL_CONNECTED && millis() - startTime < WIFI_TIMEOUT) {
delay(100);
Serial.print(".");
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println(" Connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
} else {
Serial.println(" Failed to connect!");
}
}
void sendHtml() {
// Lire les valeurs des capteurs
float pressure = analogRead(pressurePin) * (5.0 / 1023.0); // Convertir en valeur réelle
float flow = analogRead(flowPin) * (5.0 / 1023.0); // Convertir en valeur réelle
float temp = analogRead(tempPin) * (5.0 / 1023.0); // Convertir en valeur réelle
// Générer la page web
String response = R"(
<!DOCTYPE html><html>
<head>
<title>Surveillance des pipelines</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
html { font-family: sans-serif; text-align: center; }
body { display: inline-flex; flex-direction: column; }
h1 { margin-bottom: 1.2em; }
h2 { margin: 0; }
div { display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: auto auto; grid-auto-flow: column; grid-gap: 1em; }
.btn { background-color: #5B5; border: none; color: #fff; padding: 0.5em 1em;
font-size: 2em; text-decoration: none }
.btn.OFF { background-color: #333; }
.alert { color: red; font-weight: bold; }
</style>
</head>
<body>
<h1>Surveillance des pipelines</h1>
<div>
<h2>Pression</h2>
<p>Valeur: )" + String(pressure) + R"(</p>
<p class="LED_PRESSURE_ALERT">LED_PRESSURE_ALERT</p>
<h2>Débit</h2>
<p>Valeur: )" + String(flow) + R"(</p>
<h2>Température</h2>
<p>Valeur: )" + String(temp) + R"(</p>
<p class="LED_TEMP_ALERT">LED_TEMP_ALERT</p>
</div>
</body>
</html>
)";
// Gérer les alertes
if (pressure > pressureThreshold) {
ledPressureState = true;
response.replace("LED_PRESSURE_ALERT", "<span class='alert'>ALERTE : Pression critique !</span>");
} else {
ledPressureState = false;
response.replace("LED_PRESSURE_ALERT", "");
}
if (temp > tempThreshold) {
ledTempState = true;
response.replace("LED_TEMP_ALERT", "<span class='alert'>ALERTE : Température critique !</span>");
} else {
ledTempState = false;
response.replace("LED_TEMP_ALERT", "");
}
// Contrôler les LEDs
digitalWrite(ledPressure, ledPressureState);
digitalWrite(ledTemp, ledTempState);
// Envoyer la réponse
server.send(200, "text/html", response);
}
void setup() {
Serial.begin(115200);
// Configurer les broches
pinMode(ledPressure, OUTPUT);
pinMode(ledTemp, OUTPUT);
digitalWrite(ledPressure, LOW);
digitalWrite(ledTemp, LOW);
// Connexion Wi-Fi
connectToWiFi();
// Configurer le serveur web
server.on("/", sendHtml);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
delay(2);
}