diff --git a/src/def.h b/src/def.h index d47a3df..e1a006a 100644 --- a/src/def.h +++ b/src/def.h @@ -2,21 +2,18 @@ #include #include -//structure pour garder l'état passé des lampes struct LampStates { bool oldLamp1State = false; bool oldLamp2State = false; }; -//strucuture pour représenter le flag de sauvegarde de l'état de chaque lampe struct SaveStateActivity { bool checkLampe1 = false; bool ckeckLampe2 = false; }; -//Strucuture pour les infos du wifi struct hostPointConfig { String ssid ; @@ -24,7 +21,6 @@ struct hostPointConfig bool isvalide = false; }; -//structure date struct date { int annee; @@ -32,7 +28,6 @@ struct date int jour; }; -//structure pour représenter le temps struct Time { long heure; @@ -88,7 +83,6 @@ struct Time } ; -//structure pour représenter une configuration de tâche donnée (allumage , extinction) struct TimeConfig { Time onTime ; @@ -96,7 +90,6 @@ struct TimeConfig bool isvalide = false; }; -//structure pour représenter quatre tâche (c'est pour faciliter le stockage dans la mémoire eeprom) struct FourConfig { TimeConfig tache_1_lamp_1; @@ -106,7 +99,6 @@ struct FourConfig bool isvalide = false; }; -// Fonction qui convertit une chaîne JSON en structure TimeConfig TimeConfig convertToTimeConfig(const String &str) { StaticJsonDocument<200> doc; DeserializationError error = deserializeJson(doc, str); @@ -120,12 +112,10 @@ TimeConfig convertToTimeConfig(const String &str) { return cfg; } - //alummage config cfg.onTime.heure = doc["allumage"]["heure"] | 0; cfg.onTime.minute = doc["allumage"]["minute"] | 0; cfg.onTime.seconde = doc["allumage"]["seconde"] | 0; - //extinction config cfg.ofTime.heure = doc["extinction"]["heure"] | 0; cfg.ofTime.minute = doc["extinction"]["minute"] | 0; cfg.ofTime.seconde = doc["extinction"]["seconde"] | 0; diff --git a/src/gsm_manager.h b/src/gsm_manager.h index acc671e..3b676d4 100644 --- a/src/gsm_manager.h +++ b/src/gsm_manager.h @@ -1,102 +1,19 @@ #pragma once -//définition de l'entête indiquand le type de module gsm qui serait utilisé -//ici le SIM800L #include #include #include #include #include "def.h" -#define RX 14 // GPIO14 = D5 -#define TX 12 // GPIO12 = D6 - -/* const char apn[] = "internet.mtn.bj"; -const String url ="/v2.1/get-time-zone?key="+API_KEY+"&format=json&by=zone&zone=Africa/Porto-Novo"; */ +#define RX 14 +#define TX 12 namespace gsm { - -/* Time getNowTime() - { - //Ce bloc permet d'initialiser le module gsm - //D'initialiser un client en se basant sur ce module - // Et de faire les configurations nécessaires pour faire la requête vers l'api de récup de l'heure - Time now = {0,0,0,false}; - SoftwareSerial gsm_module(RX, TX); - TinyGsm modem(gsm_module); - TinyGsmClient client(modem); - HttpClient http(client, "api.timezonedb.com", 80); - gsm_module.begin(9600); - Serial.println("Initialisation du modem..."); - modem.restart(); - delay(3000); - Serial.println("Connexion au réseau..."); - //3 essai de connexion max , après 3 essai on continue - for(byte i = 0; i < 3; i++) - { - if(!modem.gprsConnect(apn, "", "")) - { - Serial.println("Échec GPRS"); - now.valide = false; - modem.restart(); - delay(3000); - Serial.println("Connexion au réseau..."); - } - else - return Time{0,0,0,false}; - } - //lancement de la requête verss l'api - Serial.println("Requête HTTP..."); - http.get(url); - - int statusCode = http.responseStatusCode(); - String response = http.responseBody(); - -/* Serial.print("Code HTTP: "); - Serial.println(statusCode); - Serial.println("Réponse JSON:"); - Serial.println(response); */ - - //jsonification de la réponse envoyé par l'api - /* modem.gprsDisconnect(); - DynamicJsonDocument doc(1024); - DeserializationError error = deserializeJson(doc,response); - if(error) - { - now.valide = false; - return now; - } - - //Ce bloc sert à extraire l'heure de la chaine de caractère envoyé par l'api. - String data = doc["formatted"]; - String date = data.substring(0,10); - data = data.substring(11,19); - String para; - String dataLists[3]; - byte pos = 0; - for(byte i = 0; i < data.length() ; i++) - { - if(data[i] == ':' || (i+1 == data.length())) - { - para += (i+1 == data.length()) ? data[i] : ' '; - //Serial.println(para); - dataLists[pos] = para; - pos ++; - para = ""; - } - else - para += data[i]; - } - - now = Time{dataLists[0].toInt(),dataLists[1].toInt(),dataLists[2].toInt(),true}; - Serial.println(date.substring(8,9)); - return now; - } */ -//fonction2 Time getNetworkTime(SoftwareSerial &sim800,date &date) { - Time currentTime = {-1, -1, -1}; // Valeurs par défaut si erreur + Time currentTime = {-1, -1, -1}; date = {0,0,0}; sim800.println("AT+CCLK?"); @@ -106,18 +23,15 @@ Time getNetworkTime(SoftwareSerial &sim800,date &date) { while (sim800.available()) { char c = sim800.read(); response += c; - //Serial.println(c); } - // Exemple de réponse attendue : +CCLK: "25/08/06,08:45:30+04" int index = response.indexOf("\""); if (index != -1) { String dateTimeStr = response.substring(index + 1, response.indexOf("\"", index + 1)); - // On sépare la partie temps int timeSepIndex = dateTimeStr.indexOf(","); if (timeSepIndex != -1) { - String timePart = dateTimeStr.substring(timeSepIndex + 1); // "08:45:30+04" + String timePart = dateTimeStr.substring(timeSepIndex + 1); int h = timePart.substring(0, 2).toInt(); int m = timePart.substring(3, 5).toInt(); int s = timePart.substring(6, 8).toInt(); @@ -126,7 +40,7 @@ Time getNetworkTime(SoftwareSerial &sim800,date &date) { currentTime.minute = m; currentTime.seconde = s; - String datePart = dateTimeStr.substring(0, timeSepIndex); // "25/08/06" + String datePart = dateTimeStr.substring(0, timeSepIndex); int yy = datePart.substring(0, 2).toInt(); int mm = datePart.substring(3, 5).toInt(); int dd = datePart.substring(6, 8).toInt(); @@ -138,4 +52,4 @@ Time getNetworkTime(SoftwareSerial &sim800,date &date) { return currentTime; } -}//end gsm \ No newline at end of file +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 811bef7..554640d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,14 +12,11 @@ #define DEBUG_MODE #define INTERVALLE 1000 -#define LAMP1_PIN 16 //d7 //gpio0 -#define LAMP2_PIN 13//d8 - -//SCL D1 -//sda d2 +#define LAMP1_PIN 16 +#define LAMP2_PIN 13 date actuelDate = {2025,8,12}; -SoftwareSerial sim800(14, 12); // RX, TX (à adapter selon ton montage) +SoftwareSerial sim800(14, 12); Time originTime; RTC_DS3231 rtc; unsigned long now = 0; @@ -54,8 +51,6 @@ void configSetup(AsyncWebServerRequest *request, uint8_t *data, size_t len, size for (size_t i = 0; i < len; i++) { configJson += (char)data[i]; } - //attendre que la lecture complète du json soit faite , parceque le buffer du EspAsycServer post est limité - //donc il envoie des morcaux, mais nous fournit aussi l'index du morceau actuelle dans le json complet if(index + len == total) { TimeConfig cfg = convertToTimeConfig(configJson); @@ -90,8 +85,7 @@ void configSetup(AsyncWebServerRequest *request, uint8_t *data, size_t len, size Serial.println(configJson); Serial.println("======================="); PrintFourConfig(fourconfig); - configJson.clear();//efface le configJson pour pouvoir l'utiliser pour d'autre config - //originTime = t; //réinitialiser l'origine des temps + configJson.clear(); } } @@ -126,7 +120,6 @@ void commandLamp1(AsyncWebServerRequest *request, uint8_t *data, size_t len, siz Serial.println("{\"data\" : {\"state\" : "+String(Lamp1State)+"}}"); manuelCommandState1 = !manuelCommandState1; digitalWrite(LAMP1_PIN,manuelCommandState1); - //Mise à jour du stockage des états des lampes dans l'eeprom si le stockage est activé LampStates lmpstate; lmpstate.oldLamp1State = (save_activity.checkLampe1) ? digitalRead(LAMP1_PIN) : false; lmpstate.oldLamp2State = (save_activity.ckeckLampe2) ? digitalRead(LAMP2_PIN) : false; @@ -228,8 +221,6 @@ void saveOldState(AsyncWebServerRequest *request, uint8_t *data, size_t len, siz serializeJson(doc,retour); request->send(200,"text/json","{\"data\" : "+retour+"}"); saveCheckActivitytoEEPROM(save_activity); - //Serial.println("Lampe 1 State : "); - //Serial.println(save_activity.checkLampe1); } void setupHostPoint(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) @@ -353,54 +344,36 @@ void setup() delay(1000); - // Active l’heure réseau sim800.println("AT+CLTS=1"); - //Serial.println("Active l’heure"); delay(1000); - // Redémarre le module pour appliquer sim800.println("AT+CFUN=1,1"); - // Serial.println("Redémarrage"); - delay(10000); // Attendre que le module se reconnecte au réseau + delay(10000); - //INIT du module horloge if(!rtc.begin()) { Serial.println("Impossible de trouver le module RTC"); - //while (1); } delay(3000); - //charger les checks (sauvegarder état des lampes) + save_activity = loadCheckActivitytoEEPROM(); - //Serial.print("Save activity : led 1 : "); -/* Serial.print(save_activity.checkLampe1); - Serial.print(" , led 2 : "); - Serial.print(save_activity.ckeckLampe2); */ - //init de la lampe pinMode(LAMP1_PIN,OUTPUT); pinMode(LAMP2_PIN,OUTPUT); bool state1 = loadOldLampesStatetoEEPROM().oldLamp1State; bool state2 = loadOldLampesStatetoEEPROM().oldLamp2State; - //charger l'état de chaque lampes depuis la mémoire eeprom digitalWrite(LAMP1_PIN,state1); digitalWrite(LAMP2_PIN,state2); - - //init du port série - //Serial.println("\n\nStarting setup..."); - - // Désactiver temporairement le WiFi WiFi.mode(WIFI_OFF); delay(1000); - //Chargement de la configuration si elle est dans l'eeprom FourConfig fcfg = loadTimeConfigsToEEPROM(); if(fcfg.isvalide) { fourconfig = fcfg; } - else //sinon config par défaut + else { Serial.println("passé dans le else"); FourConfig default_config; @@ -411,28 +384,18 @@ void setup() fourconfig = default_config; } - //affiché la configuration stocké PrintFourConfig(fourconfig); - // Récupération du temps réel actuel en ligne grâce au gsm t = gsm::getNetworkTime(sim800,actuelDate); if (t.heure == -1) Serial.println("Erreur réseau lors de la recup de l'heure"); t.valide = true; - - //printTime(fourconfig.tache_1_lamp_1.onTime); - //printTime(fourconfig.tache_1_lamp_1.ofTime); - - - //Initialisation de l'origine des temps originTime = t; - //Réglage manuelle de l'heure du module rtc grâce à l'heure que le module gsm à récupéré en ligne setupTimeToRTC(t,rtc,actuelDate); printTime(t); - //charger la configuration du point d'accès depuis la mémoire EEPROM hostPointConfig hostcfg = loadHostPointConfigtoEEPROM(); if(hostcfg.isvalide) { @@ -440,66 +403,56 @@ void setup() } else { - //config par défaut host_point_config.ssid = "youpilight_esp"; host_point_config.password = "123456789A"; - //Serial.print("default config"); } - // Réactiver le WiFi - //Serial.println("Starting WiFi AP..."); WiFi.mode(WIFI_AP); WiFi.softAP(host_point_config.ssid, host_point_config.password,1,false); - //Serial.println(host_point_config.ssid); IPAddress ip = WiFi.softAPIP(); - //Serial.print("AP IP: "); - //Serial.println(ip); - //Initialisation de Little FS if(!LittleFS.begin()) { Serial.println("Erreur d'initialisation de little fs"); return; } - //configuration des routes du serveur et initialisation du serveur server.on("/",HTTP_GET, [](AsyncWebServerRequest *request){ Serial.println("Passer dans le get"); request->send(LittleFS, "/index.html", "text/html"); }); - //Servir les fichiesrs static server.serveStatic("/css", LittleFS, "/css"); server.serveStatic("/js", LittleFS, "/js"); server.serveStatic("/html", LittleFS, "/html"); - server.on("/getSaveState/sortie-1",HTTP_GET,[](AsyncWebServerRequest *request){getSaveState(request,1);});// - server.on("/getSaveState/sortie-2",HTTP_GET,[](AsyncWebServerRequest *request){getSaveState(request,2);});// - server.on("/getTime", HTTP_GET, getTime);// - server.on("/getDate", HTTP_GET, getDate);// - server.on("/getCalendarConfigs", HTTP_GET, getCalendarConfigs);// - server.on("/sortie-1/getState",HTTP_GET,getLampe1State);// - server.on("/sortie-2/getState",HTTP_GET,getLampe2State);// - server.on("/sortie-1/setState", HTTP_POST,[](AsyncWebServerRequest *request){}, NULL, commandLamp1);// - server.on("/sortie-2/setState", HTTP_POST,[](AsyncWebServerRequest *request){}, NULL, commandLamp2);// + server.on("/getSaveState/sortie-1",HTTP_GET,[](AsyncWebServerRequest *request){getSaveState(request,1);}); + server.on("/getSaveState/sortie-2",HTTP_GET,[](AsyncWebServerRequest *request){getSaveState(request,2);}); + server.on("/getTime", HTTP_GET, getTime); + server.on("/getDate", HTTP_GET, getDate); + server.on("/getCalendarConfigs", HTTP_GET, getCalendarConfigs); + server.on("/sortie-1/getState",HTTP_GET,getLampe1State); + server.on("/sortie-2/getState",HTTP_GET,getLampe2State); + server.on("/sortie-1/setState", HTTP_POST,[](AsyncWebServerRequest *request){}, NULL, commandLamp1); + server.on("/sortie-2/setState", HTTP_POST,[](AsyncWebServerRequest *request){}, NULL, commandLamp2); server.on("/sortie-1/tache-1", HTTP_POST, [](AsyncWebServerRequest *request){}, NULL, - [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){configSetup(request,data,len,index,total,'a');});// + [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){configSetup(request,data,len,index,total,'a');}); server.on("/sortie-1/tache-2", HTTP_POST, [](AsyncWebServerRequest *request){}, NULL, - [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){configSetup(request,data,len,index,total,'b');});// + [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){configSetup(request,data,len,index,total,'b');}); server.on("/sortie-2/tache-1", HTTP_POST, [](AsyncWebServerRequest *request){}, NULL, - [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){configSetup(request,data,len,index,total,'c');});// + [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){configSetup(request,data,len,index,total,'c');}); server.on("/sortie-2/tache-2", HTTP_POST, [](AsyncWebServerRequest *request){}, NULL, - [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){configSetup(request,data,len,index,total,'d');});// - server.on("/setTime",HTTP_POST,[](AsyncWebServerRequest *request){}, NULL, setupManuallyTime);// + [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){configSetup(request,data,len,index,total,'d');}); + server.on("/setTime",HTTP_POST,[](AsyncWebServerRequest *request){}, NULL, setupManuallyTime); server.on("/save/sortie-1",HTTP_POST,[](AsyncWebServerRequest *request){}, NULL, - [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){saveOldState(request,data,len,index,total,1);});// + [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){saveOldState(request,data,len,index,total,1);}); server.on("/save/sortie-2",HTTP_POST,[](AsyncWebServerRequest *request){}, NULL, - [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){saveOldState(request,data,len,index,total,2);});// - server.on("/setInfos-wifi",HTTP_POST,[](AsyncWebServerRequest *request){},NULL,setupHostPoint);// + [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){saveOldState(request,data,len,index,total,2);}); + server.on("/setInfos-wifi",HTTP_POST,[](AsyncWebServerRequest *request){},NULL,setupHostPoint); server.begin(); @@ -520,8 +473,4 @@ void loop() Lamp1State = digitalRead(LAMP1_PIN); Lamp2State = digitalRead(LAMP2_PIN); -} - - -//cette fonction doit retourner un pointeur null , jusqu'à ce que qu'elle reçoivent la chaine complète -//password : 9012345678 \ No newline at end of file +} \ No newline at end of file diff --git a/src/rtc_horloge_manager.h b/src/rtc_horloge_manager.h index 111152f..0dcc055 100644 --- a/src/rtc_horloge_manager.h +++ b/src/rtc_horloge_manager.h @@ -5,7 +5,6 @@ void setupTimeToRTC(const Time &reelTime,RTC_DS3231 &rtc,const date &date_actuelle) { - // Extraire les heures, minutes et secondes int heure = reelTime.heure; int minute = reelTime.minute; int seconde = reelTime.seconde; @@ -13,7 +12,6 @@ void setupTimeToRTC(const Time &reelTime,RTC_DS3231 &rtc,const date &date_actuel int mois = date_actuelle.mois; int jour = date_actuelle.jour; rtc.adjust(DateTime(annee, mois, jour, heure, minute, seconde)); - // Date fixe (exemple : 2025-07-27) } diff --git a/src/test.h b/src/test.h index 40dc2cb..ad1982c 100644 --- a/src/test.h +++ b/src/test.h @@ -1,22 +1,20 @@ #include -#include // Bibliothèque pour la communication I2C -#include // Bibliothèque pour le module RTC DS3231 +#include +#include -// Structure Time struct Time { - long heure; // Heure - long minute; // Minute - long seconde; // Seconde - bool valide; // Indicateur de validité + long heure; + long minute; + long seconde; + bool valide; }; class RTCTrigger { private: - RTC_DS3231 rtc; // Module RTC - Time heureCible; // Heure cible pour déclenchement - bool declenche; // Anti-rebond + RTC_DS3231 rtc; + Time heureCible; + bool declenche; - // Vérifie si l'heure actuelle correspond à la cible bool verifierDeclenchement(Time actuelle, Time cible) { return (actuelle.valide && cible.valide && actuelle.heure == cible.heure && @@ -25,13 +23,11 @@ class RTCTrigger { } public: - // Constructeur RTCTrigger() : declenche(false) { - Wire.begin(); // Initialisation I2C - rtc.begin(); // Initialisation RTC + Wire.begin(); + rtc.begin(); } - // Définit l'heure cible void setHeureCible(long h, long m, long s, bool valide = true) { heureCible.heure = h; heureCible.minute = m; @@ -40,7 +36,6 @@ class RTCTrigger { declenche = false; } - // Obtient l'heure actuelle depuis le RTC Time getHeureActuelle() { DateTime now = rtc.now(); Time actuelle; @@ -51,7 +46,6 @@ class RTCTrigger { return actuelle; } - // Vérifie et déclenche le callback si nécessaire void verifierEtDeclencher(void (*callback)()) { Time actuelle = getHeureActuelle(); @@ -63,7 +57,6 @@ class RTCTrigger { } } - // Affichage debug void afficherHeure(Time t) { Serial.print("Heure actuelle : "); Serial.print(t.heure); @@ -74,20 +67,18 @@ class RTCTrigger { } }; -// Instance globale RTCTrigger rtcTrigger; -// Callback exemple void monAction() { Serial.println("Déclenchement à l'heure cible !"); } void setup() { Serial.begin(115200); - rtcTrigger.setHeureCible(18, 0, 0); // Définir l'heure cible + rtcTrigger.setHeureCible(18, 0, 0); } void loop() { rtcTrigger.verifierEtDeclencher(monAction); - delay(1000); // Vérification toutes les secondes + delay(1000); } \ No newline at end of file diff --git a/src/timeManager.h b/src/timeManager.h index 365cca3..6d4ef9b 100644 --- a/src/timeManager.h +++ b/src/timeManager.h @@ -7,47 +7,8 @@ extern SaveStateActivity save_activity; extern SoftwareSerial sim800; -//cette fonction permet de changer l'état de la lampe en fonction de l'heure d'allumage et de l'heure d'extinction -/* void updateStateFlexible(const TimeConfig& config, bool& state, const Time& currentTime) -{ -/* if (!config.isvalide || !currentTime.valide) - return; */ - - -/* // Vérifie si on a atteint ou dépassé l'heure d'allumage mais pas encore atteint l'heure d'extinction - if (config.onTime < config.ofTime) - { - // Cas normal : allumage et extinction le même jour - if ((currentTime > config.onTime || currentTime == config.onTime) && currentTime < config.ofTime) - { - state = true; - } - else - { - state = false; - } - } - else - { - // Cas spécial : allumage le soir et extinction le matin suivant (ex: 19h -> 7h) - if ((currentTime > config.onTime || currentTime == config.onTime) || currentTime < config.ofTime) - { - state = true; - } - else - { - state = false; - } - } -} */ - void updateState(const TimeConfig& config, const Time& currentTime,uint8_t pinToDeclenche) { - // Vérifie la validité des temps -/* if (!config.isvalide || !currentTime.valide) - return; */ - - // Allumer à la date/heure exacte if (currentTime == config.onTime) { digitalWrite(pinToDeclenche,true); LampStates lmpstate; @@ -58,7 +19,6 @@ void updateState(const TimeConfig& config, const Time& currentTime,uint8_t pinTo return; } - // Éteindre à la date/heure exacte if (currentTime == config.ofTime) { digitalWrite(pinToDeclenche,false); LampStates lmpstate; @@ -68,15 +28,4 @@ void updateState(const TimeConfig& config, const Time& currentTime,uint8_t pinTo saveOldLampStateToEEPROM(lmpstate); return; } -} - -/* void updateTimeallTwelve(RTC_DS3231 &rtc, const Time &nowTime,Time &originTime) -{ - date dt; - if(nowTime - originTime == Time{12,0,0,true}) - { - setupTimeToRTC(gsm::getNetworkTime(sim800,dt),rtc,dt); - //remettre l'origine des temps à jour - originTime = nowTime; - } -} */ \ No newline at end of file +} \ No newline at end of file