#define BLYNK_TEMPLATE_ID "TMPL2Pzn7HDMH"
#define BLYNK_TEMPLATE_NAME "Pompage solaire"
#define BLYNK_AUTH_TOKEN "Mah8quMjJbcjqhjbDNNTW2ZuBIHVslg1"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <LiquidCrystal_I2C.h>
#include "DHTesp.h"
// --- Configuration des Pins ---
const int DHT_PIN = 15;
const int POMPE_PIN = 2; // Relais + LED Pompe
const int VANNE_PIN = 4; // LED Électrovanne
// --- Configuration LCD 20x4 ---
LiquidCrystal_I2C lcd(0x27, 20, 4);
Adafruit_BMP085 bmp;
DHTesp dhtSensor;
BlynkTimer timer;
bool modeAuto = true;
bool alerteEnvoyee = false;
float pressionAtmoBase = 0; // Stocke la pression de l'air au démarrage
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// --- Commandes Blynk ---
BLYNK_WRITE(V5) { modeAuto = param.asInt(); }
BLYNK_WRITE(V3) { if (!modeAuto) digitalWrite(POMPE_PIN, param.asInt()); }
BLYNK_WRITE(V4) { if (!modeAuto) digitalWrite(VANNE_PIN, param.asInt()); }
void gestionSysteme() {
// 1. Lecture Humidité
TempAndHumidity data = dhtSensor.getTempAndHumidity();
float humidite = data.humidity;
// 2. Lecture Pression et Calcul Niveau
long pressionActuelle = bmp.readPressure(); // Pression brute lue par le capteur
// Calcul de la différence : Pression Actuelle - Pression de l'Air au démarrage
float pressionHydro = (float)pressionActuelle - pressionAtmoBase;
// Conversion en cm avec ton équation N = P / 9810 (résultat * 100 pour cm)
float niveauCm = (pressionHydro / 9810.0) * 100.0;
// Sécurité : Si le résultat est négatif ou très petit, on force à 0.0
if (niveauCm < 0.1) niveauCm = 0.0;
// 3. Envoi vers Blynk
Blynk.virtualWrite(V0, humidite);
Blynk.virtualWrite(V2, niveauCm);
// 4. Affichage LCD 20x4
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Niveau d'eau: "); lcd.print(niveauCm, 1); lcd.print("cm");
lcd.setCursor(0, 1);
lcd.print("Humidite: "); lcd.print((int)humidite); lcd.print("%");
lcd.setCursor(0, 2);
lcd.print("Mode: "); lcd.print(modeAuto ? "AUTOMATIQUE" : "MANUEL");
// 5. LOGIQUE AUTOMATIQUE ET NOTIFICATION
if (niveauCm <= 5.0) {
// Alerte Notification Blynk
if (!alerteEnvoyee) {
Blynk.logEvent("niveau_bas", "Niveau bas ; possibilite de nettoyage de reservoir");
alerteEnvoyee = true;
}
if (modeAuto) {
digitalWrite(POMPE_PIN, HIGH); // Pompe ON si vide
digitalWrite(VANNE_PIN, LOW);
}
}
else {
alerteEnvoyee = false; // Réinitialise l'alerte dès que l'eau monte
if (modeAuto) {
if (humidite <= 20 && niveauCm >= 30.0) {
digitalWrite(VANNE_PIN, HIGH);
digitalWrite(POMPE_PIN, LOW);
}
else if (humidite >= 60) {
digitalWrite(POMPE_PIN, LOW);
digitalWrite(VANNE_PIN, LOW);
}
}
}
// Synchro boutons Blynk
if (modeAuto) {
Blynk.virtualWrite(V3, digitalRead(POMPE_PIN));
Blynk.virtualWrite(V4, digitalRead(VANNE_PIN));
}
}
void setup() {
Serial.begin(115200);
pinMode(POMPE_PIN, OUTPUT);
pinMode(VANNE_PIN, OUTPUT);
Wire.begin(21, 22);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Calibrage du zero...");
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
if (!bmp.begin()) {
lcd.clear(); lcd.print("Erreur BMP180");
while(1);
} else {
// ÉTAPE CRUCIALE : On attend que le capteur soit stable
delay(2500);
// On enregistre la pression actuelle comme étant le "ZÉRO" (Réservoir vide)
pressionAtmoBase = bmp.readPressure();
lcd.clear();
lcd.print("Systeme Pret !");
delay(1000);
}
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
timer.setInterval(2000L, gestionSysteme);
}
void loop() {
Blynk.run();
timer.run();
}Loading
esp32-devkit-c-v4
esp32-devkit-c-v4
Loading
bmp180
bmp180