//inclure les bibliothèques nécéssaire
#include <WiFi.h>
#include "DHTesp.h"
#include "FirebaseESP32.h"
#include <time.h>
#include <TimeLib.h>
//parametre heure
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 3600;
const int daylightOffset_sec = 0;
//les paramètre wifi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// les paramètre de notre firebase
const char* host = "smartirrigation-6e85e-default-rtdb.europe-west1.firebasedatabase.app";
const char* api_key = "G4yCMiqkYtjttZ4Mn3CnLuWCVUrUaSEJbNxw8gG3";
const int DHT_PIN = 15;
//const int WATERPUMP_PIN_COIL1 =;
const int LED_PIN = 23;
DHTesp dhtSensor;
FirebaseData firebaseData;
// Déclaration de la variable pour le contrôle de la pompe
bool pump = false;
String heureDebut;
String heureFin;
void setup() {
Serial.begin(115200);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
// pinMode(WATERPUMP_PIN_COIL1, OUTPUT);
pinMode(LED_PIN, OUTPUT);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
Firebase.begin(host, api_key);
// Configuration de l'horloge
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
// Attente de la synchronisation de l'horloge
while (!time(nullptr)) {
delay(1000);
Serial.println("Synchronisation avec le serveur NTP...");
}
Firebase.beginStream(firebaseData, "/PUMP");
Firebase.beginStream(firebaseData, "/planification/TimeOn/heurePlanification");
Firebase.beginStream(firebaseData, "/planification/TimeOff/heurePlanification");
}
void loop() {
//lecture données des capteurs
TempAndHumidity data = dhtSensor.getTempAndHumidity();
// Lecture de la valeur de la variable PUMP dans Firebase
Firebase.getBool(firebaseData,"/PUMP", &pump);
// Lecture de la date et de l'heure actuelles
time_t now = time(nullptr);
int weekday(time_t t);
// Récupération de l'heure de début et de fin de la planification
Firebase.getString(firebaseData,"/planification/TimeOn/heurePlanification", &heureDebut);
Firebase.getString(firebaseData,"/planification/TimeOff/heurePlanification", &heureFin);
// Lecture des jours de planification
String joursSelectionnes;
Firebase.getString(firebaseData, "/planification/TimeOn/joursSelectionnes", &joursSelectionnes);
bool joursSelectionnesBool[7] = {false}; // Initialisation à false pour tous les jours de la semaine
// Analyse de la chaîne de caractères joursSelectionnes
for (int i = 0; i < joursSelectionnes.length(); i++) {
char jour = joursSelectionnes.charAt(i);
switch (jour) {
case 'L':
joursSelectionnesBool[0] = true;
break;
case 'M':
joursSelectionnesBool[1] = true;
break;
case 'm':
joursSelectionnesBool[2] = true;
break;
case 'J':
joursSelectionnesBool[3] = true;
break;
case 'V':
joursSelectionnesBool[4] = true;
break;
case 'S':
joursSelectionnesBool[5] = true;
break;
case 'D':
joursSelectionnesBool[6] = true;
break;
}
}
//envoie des données dans firebase
Firebase.setFloat(firebaseData, "/temperature", data.temperature);
Firebase.setFloat(firebaseData, "/humidite", data.humidity);
//affichage des données capteur ,etat pompe ,heuredebut ,heurefin , jourselectionnées
Serial.println("------------Affichage données capteur---------------");
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
Serial.println("------------Affichage des heures---------------");
Serial.print("heureDebut: ");
Serial.print(heureDebut);
Serial.println("");
Serial.print("heureFin: ");
Serial.print(heureFin);
Serial.println("");
Serial.println("------------Affichage des jours selectionnées---------------");
// Affichage des jours sélectionnés
Serial.println("Jours sélectionnés : ");
if (joursSelectionnesBool[0]) {
Serial.print("Lundi ");
}
if (joursSelectionnesBool[1]) {
Serial.print("Mardi ");
}
if (joursSelectionnesBool[2]) {
Serial.print("Mercredi ");
}
if (joursSelectionnesBool[3]) {
Serial.print("Jeudi ");
}
if (joursSelectionnesBool[4]) {
Serial.print("Vendredi ");
}
if (joursSelectionnesBool[5]) {
Serial.print("Samedi ");
}
if (joursSelectionnesBool[6]) {
Serial.print("Dimanche ");
}
Serial.println("");
Serial.println("------------Affichage heure actuelle ---------------");
Serial.print("Heure actuelle : ");
Serial.println(ctime(&now));
//**************************************************************Activation de la pompe avec planification*************************************************************/
// Conversion des chaînes de caractères en temps
tm heureDebutTime = {};
heureDebutTime.tm_year = 2023 - 1900;
heureDebutTime.tm_mon = 4;
heureDebutTime.tm_mday=11;
strptime(heureDebut.c_str(), "%H:%M:%S", &heureDebutTime);
tm heureFinTime = {};
strptime(heureFin.c_str(), "%H:%M:%S", &heureFinTime);
heureFinTime.tm_year = 2023 - 1900;
heureFinTime.tm_mon = 4;
heureFinTime.tm_mday=11;
// Conversion du jour actuel en un entier correspondant à l'indice dans le tableau joursSelectionnesBool
int jourActuel = weekday(now);
// Vérification que la pompe doit être activée en fonction de la planification
if (/*pump && */joursSelectionnesBool[jourActuel-2] ) {
time_t heureDebutTimestamp = mktime(&heureDebutTime);
time_t heureFinTimestamp = mktime(&heureFinTime);
time_t heureActuelleTimestamp = now;
time_t heureFinPlusUneMinute = heureFinTimestamp ;
if (heureActuelleTimestamp >= heureDebutTimestamp && heureActuelleTimestamp < heureFinPlusUneMinute) {
// La pompe doit être activée
Serial.println("Activation de la pompe (planification)");
// digitalWrite(PIN_POMPE, HIGH);
digitalWrite(LED_PIN, HIGH);
pump = true;
Firebase.setBool(firebaseData, "/PUMP", true);
}
else {
// La pompe doit être désactivée
Serial.println("Désactivation de la pompe (planification)");
digitalWrite(LED_PIN, LOW);
// digitalWrite(PIN_POMPE, LOW);
pump = false;
Firebase.setBool(firebaseData, "/PUMP", false);
}
}
else{
Serial.println("pas de planification Aujourd'hui ");
}
//**************************************************************Activation de la pompe sans planification*************************************************************//
if (pump) {
Serial.println("activation de la pompe manuel");
// digitalWrite(WATERPUMP_PIN_COIL1, HIGH); // activer la pompe
digitalWrite(LED_PIN, HIGH);
} else {
Serial.println("desactivation de la pompe manuel ");
//digitalWrite(WATERPUMP_PIN_COIL1, LOW); // désactiver la pompe
digitalWrite(LED_PIN, LOW);
}
if (Firebase.readStream(firebaseData)) {
// La variable PUMP a été modifiée
pump = firebaseData.boolData();
}
if (Firebase.readStream(firebaseData)) {
// La variable heuredebut a été modifiée
heureDebut = firebaseData.stringData();
}
if (Firebase.readStream(firebaseData)) {
// La variable heurefin a été modifiée
heureFin = firebaseData.stringData();
}
Serial.println("**************************************Affichage nouvelle données ************************************");
// delay( 100);
}