diff --git a/include/main.h b/include/main.h index 952ad3b..69572e5 100644 --- a/include/main.h +++ b/include/main.h @@ -48,6 +48,7 @@ void reconnect(void); void initSensors(DHT *sensors, int number); void readSensors(DHT sensors[], float temp[], float hum[], int number); void sleep(); +void clearOldData(int index); void LocalSave(); void SendLocalData(); std::tuple getDate(); diff --git a/src/main.cpp b/src/main.cpp index 7c80df9..29def3d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -407,6 +407,7 @@ bool TestBoot(bool resOrRfsh) nvs_close(my_handle); return false; } + //-------------------- Initialisation --------------------// /** @@ -458,57 +459,160 @@ void setup() // Serial.println('\n'); } +// Définir la capacité maximale de stockage +const int maxDataSets = 11; + // Fonction pour sauvegarder les données localement void LocalSave() { - int chargelvl = getAverageChargeLevel(); // get de la batterie. - + // Ouvre les préférences sous le nom "capteurs" en mode lecture/écriture preferences.begin("capteurs", false); - time_t rawtime; - rawtime = preferences.getInt("time", 1); - rawtime = TimeClient.getEpochTime(); + + // Lit l'indice de la prochaine sauvegarde, ou initialise à 0 s'il n'existe pas + int saveCounter = preferences.getInt("saveCounter", 0); + + // Efface les anciennes données si nécessaire + if (saveCounter >= maxDataSets) + { + saveCounter = 0; // Réinitialise le compteur si la limite est atteinte + } + + // Appelle la fonction pour effacer les données anciennes à l'index actuel + clearOldData(saveCounter); + + // Calcule l'heure actuelle en secondes depuis l'époque Unix + int chargelvl = getAverageChargeLevel(); // Obtient le niveau moyen de la batterie + time_t rawtime = TimeClient.getEpochTime(); // Obtient l'heure actuelle Serial.print("\n-----------------Save---------------------\n"); - for (int i = 0; i < 5; i++) // Debut de la boucle pour récuperer les valeurs de la température et de l'humidité dans le tableau puis les enregistrer. + // Boucle pour sauvegarder les données de température et d'humidité + for (int i = 0; i < 5; i++) { - char Temp[5]; - char Humi[5]; - float newTemp = preferences.getFloat(Temp, temp[i]); - float newHum = preferences.getFloat(Humi, hum[i]); + char tempKey[16]; + char humiKey[16]; - preferences.putFloat("temp", newTemp); - preferences.putFloat("hum", newHum); + // Génère des clés uniques pour chaque valeur de température et d'humidité + snprintf(tempKey, sizeof(tempKey), "temp%d_%d", saveCounter, i); + snprintf(humiKey, sizeof(humiKey), "hum%d_%d", saveCounter, i); - Serial.printf("temp: %0.2f\n", newTemp); // print pour vérifier si les valeurs enregistrées sont les bonnes. - Serial.printf("hum: %0.2f\n", newHum); + // Sauvegarde les valeurs de température et d'humidité dans les préférences + preferences.putFloat(tempKey, temp[i]); + preferences.putFloat(humiKey, hum[i]); + + // Affiche les valeurs de température et d'humidité pour vérification + Serial.printf("temp[%d]: %0.2f\n", i, temp[i]); + Serial.printf("hum[%d]: %0.2f\n", i, hum[i]); } + // Sauvegarde le temps et le niveau de charge + char timeKey[16]; + char chargeKey[16]; + snprintf(timeKey, sizeof(timeKey), "time%d", saveCounter); + snprintf(chargeKey, sizeof(chargeKey), "chargelvl%d", saveCounter); + + // Sauvegarde les valeurs de temps et de niveau de charge dans les préférences + preferences.putInt(timeKey, rawtime); + preferences.putInt(chargeKey, chargelvl); + + // Affiche les valeurs de temps et de niveau de charge pour vérification Serial.printf("time: %d \n", rawtime); - Serial.printf("chargelvl: %d\n", chargelvl); // print pour vérifier si les valeurs enregistrées sont les bonnes. - preferences.putInt("time", rawtime); - preferences.putInt("chargelvl", chargelvl); + Serial.printf("chargelvl: %d\n", chargelvl); + + // Incrémente le compteur de sauvegardes et le sauvegarde + saveCounter++; + preferences.putInt("saveCounter", saveCounter); + + // Termine l'accès aux préférences preferences.end(); } +// Fonction pour effacer les anciennes données si l'espace est insuffisant +void clearOldData(int index) +{ + // Variables pour stocker les noms de clé formatés + char timeKey[16]; + char chargeKey[16]; + + // Formate les noms de clé pour le temps et le niveau de charge en fonction de l'index donné + snprintf(timeKey, sizeof(timeKey), "time%d", index); + snprintf(chargeKey, sizeof(chargeKey), "chargelvl%d", index); + + // Supprime les entrées correspondantes au temps et au niveau de charge + preferences.remove(timeKey); + preferences.remove(chargeKey); + + // Boucle pour supprimer les entrées de température et d'humidité associées + for (int i = 0; i < 5; i++) + { + // Variables pour stocker les noms de clé formatés pour la température et l'humidité + char tempKey[16]; + char humiKey[16]; + + // Formate les noms de clé pour la température et l'humidité en fonction de l'index et du sous-index + snprintf(tempKey, sizeof(tempKey), "temp%d_%d", index, i); + snprintf(humiKey, sizeof(humiKey), "hum%d_%d", index, i); + + // Supprime les entrées correspondantes à la température et à l'humidité + preferences.remove(tempKey); + preferences.remove(humiKey); + } +} + // Fonction pour envoyer les données locales void SendLocalData() { + // Ouvre les préférences sous le nom "capteurs" en mode lecture seule preferences.begin("capteurs", true); - time_t rawtime = preferences.getInt("time", 0); - int chargelvl = preferences.getInt("chargelvl", 0); - temp[4] = preferences.getFloat("temp", 0); - hum[4] = preferences.getFloat("hum", 0); + // Lit le compteur de sauvegardes, ou initialise à 0 s'il n'existe pas + int saveCounter = preferences.getInt("saveCounter", 0); - char msgsld[150]; - sprintf(msgsld, "%lu|%s|%0.2f %0.2f %0.2f %0.2f %0.2f|%0.2f %0.2f %0.2f %0.2f %0.2f|%d", rawtime, CLUSTER, temp[0], temp[1], temp[2], temp[3], temp[4], hum[0], hum[1], hum[2], hum[3], hum[4], chargelvl); + // Boucle pour envoyer les données sauvegardées + for (int counter = 0; counter < saveCounter; counter++) + { + char timeKey[16]; + char chargeKey[16]; - MqttClient.publish(TOPIC, msgsld); - Serial.println("msgsld : "); - Serial.println(msgsld); + // Génère des clés uniques pour le temps et le niveau de charge + snprintf(timeKey, sizeof(timeKey), "time%d", counter); + snprintf(chargeKey, sizeof(chargeKey), "chargelvl%d", counter); - preferences.clear(); + // Lit les valeurs de temps et de niveau de charge depuis les préférences + time_t rawtime = preferences.getInt(timeKey, 0); + int chargelvl = preferences.getInt(chargeKey, 0); + + // Boucle pour lire les données de température et d'humidité + for (int i = 0; i < 5; i++) + { + char tempKey[16]; + char humiKey[16]; + + // Génère des clés uniques pour chaque valeur de température et d'humidité + snprintf(tempKey, sizeof(tempKey), "temp%d_%d", counter, i); + snprintf(humiKey, sizeof(humiKey), "hum%d_%d", counter, i); + + // Lit les valeurs de température et d'humidité depuis les préférences + temp[i] = preferences.getFloat(tempKey, 0); + hum[i] = preferences.getFloat(humiKey, 0); + } + + // Prépare le message à envoyer + char msgsld[200]; + sprintf(msgsld, "%lu|%s|%0.2f %0.2f %0.2f %0.2f %0.2f|%0.2f %0.2f %0.2f %0.2f %0.2f|%d", rawtime, CLUSTER, temp[0], temp[1], temp[2], temp[3], temp[4], hum[0], hum[1], hum[2], hum[3], hum[4], chargelvl); + + // Envoie le message via MQTT + MqttClient.publish(TOPIC, msgsld); + Serial.println(msgsld); + + // Supprime les clés après envoi + clearOldData(counter); + } + + // Réinitialise le compteur de sauvegardes + preferences.putInt("saveCounter", 0); + + // Termine l'accès aux préférences preferences.end(); } @@ -561,10 +665,14 @@ void loop() // Serial.println(msg); //debug print // Serial.println("date : "); //debug print // Serial.println(date); //debug print + Serial.println("\n"); + Serial.println("-----------------Local---------------------"); SendLocalData(); MqttClient.publish(TOPIC, date); + Serial.println("-----------------Brut---------------------"); + Serial.println(date); + Serial.println("-----------------DeepSleep---------------------"); - Serial.println("----------------- DeepSleep ---------------------"); delay(2000); sleep();