LocalSave + clearOldData + SendLocalData

This commit is contained in:
Nicolas Schmauch 2024-06-25 13:54:06 +02:00
parent 97346c1b06
commit 37ef459625
2 changed files with 137 additions and 28 deletions

View file

@ -48,6 +48,7 @@ void reconnect(void);
void initSensors(DHT *sensors, int number); void initSensors(DHT *sensors, int number);
void readSensors(DHT sensors[], float temp[], float hum[], int number); void readSensors(DHT sensors[], float temp[], float hum[], int number);
void sleep(); void sleep();
void clearOldData(int index);
void LocalSave(); void LocalSave();
void SendLocalData(); void SendLocalData();
std::tuple<int, int, int> getDate(); std::tuple<int, int, int> getDate();

View file

@ -407,6 +407,7 @@ bool TestBoot(bool resOrRfsh)
nvs_close(my_handle); nvs_close(my_handle);
return false; return false;
} }
//-------------------- Initialisation --------------------// //-------------------- Initialisation --------------------//
/** /**
@ -458,57 +459,160 @@ void setup()
// Serial.println('\n'); // Serial.println('\n');
} }
// Définir la capacité maximale de stockage
const int maxDataSets = 11;
// Fonction pour sauvegarder les données localement // Fonction pour sauvegarder les données localement
void LocalSave() 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); preferences.begin("capteurs", false);
time_t rawtime;
rawtime = preferences.getInt("time", 1); // Lit l'indice de la prochaine sauvegarde, ou initialise à 0 s'il n'existe pas
rawtime = TimeClient.getEpochTime(); 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"); 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 tempKey[16];
char Humi[5]; char humiKey[16];
float newTemp = preferences.getFloat(Temp, temp[i]);
float newHum = preferences.getFloat(Humi, hum[i]);
preferences.putFloat("temp", newTemp); // Génère des clés uniques pour chaque valeur de température et d'humidité
preferences.putFloat("hum", newHum); 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. // Sauvegarde les valeurs de température et d'humidité dans les préférences
Serial.printf("hum: %0.2f\n", newHum); 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("time: %d \n", rawtime);
Serial.printf("chargelvl: %d\n", chargelvl); // print pour vérifier si les valeurs enregistrées sont les bonnes. Serial.printf("chargelvl: %d\n", chargelvl);
preferences.putInt("time", rawtime);
preferences.putInt("chargelvl", 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(); 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 // Fonction pour envoyer les données locales
void SendLocalData() void SendLocalData()
{ {
// Ouvre les préférences sous le nom "capteurs" en mode lecture seule
preferences.begin("capteurs", true); preferences.begin("capteurs", true);
time_t rawtime = preferences.getInt("time", 0);
int chargelvl = preferences.getInt("chargelvl", 0);
temp[4] = preferences.getFloat("temp", 0); // Lit le compteur de sauvegardes, ou initialise à 0 s'il n'existe pas
hum[4] = preferences.getFloat("hum", 0); int saveCounter = preferences.getInt("saveCounter", 0);
char msgsld[150]; // Boucle pour envoyer les données sauvegardées
for (int counter = 0; counter < saveCounter; counter++)
{
char timeKey[16];
char chargeKey[16];
// 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);
// 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); 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); MqttClient.publish(TOPIC, msgsld);
Serial.println("msgsld : ");
Serial.println(msgsld); Serial.println(msgsld);
preferences.clear(); // 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(); preferences.end();
} }
@ -561,10 +665,14 @@ void loop()
// Serial.println(msg); //debug print // Serial.println(msg); //debug print
// Serial.println("date : "); //debug print // Serial.println("date : "); //debug print
// Serial.println(date); //debug print // Serial.println(date); //debug print
Serial.println("\n");
Serial.println("-----------------Local---------------------");
SendLocalData(); SendLocalData();
MqttClient.publish(TOPIC, date); MqttClient.publish(TOPIC, date);
Serial.println("-----------------Brut---------------------");
Serial.println(date);
Serial.println("-----------------DeepSleep---------------------");
Serial.println("----------------- DeepSleep ---------------------");
delay(2000); delay(2000);
sleep(); sleep();