#define RTCMEMORYSTART 65 // where the storage in rtc memory begins
peut être un problème d'alignement de la structure : adresse de début à positionner sur un multiple de 32 bits
Essayer 64
La valeur 64 est réservée par le système.. Mais j'ai essayé aussi.
Mais avec les instructions ESP.rtcUser sur lesquels je suis resté, j'ai l'impression que l'offset peut commencer à zéro.
J'ai lu que "Les données doivent être alignées sur 4 octets".
Comment m'y prendre ? Je pensais qu'en passant de INT à uint32_t, je n'aurais pas de souci..
J'ai fouillé tout le net sans trouver de solution...
Et la documentation.)
ESP.rtcUserMemoryWrite(offset, &data, sizeof(data)) and
ESP.rtcUserMemoryRead(offset, &data, sizeof(data)) allow data to be stored in and retrieved from the RTC user memory of the chip respectively. offset is measured in blocks of 4 bytes and can range from 0 to 127 blocks (total size of RTC memory is 512 bytes). data should be 4-byte aligned. The stored data can be retained between deep sleep cycles, but might be lost after power cycling the chip. Data stored in the first 32 blocks will be lost after performing an OTA update, because they are used by the Core internals.
Conclusion :
Normalement un ESP.rtcUserMemoryWrite(0, (uint32_t *)&rtcMem, sizeof(rtcMem));
et un ESP.rtcUserMemoryRead(0, (uint32_t *)&rtcMem, sizeof(rtcMem));
devraient fonctionner, en ayant au préalable vérifié que sizeof(rtcMem) est bien un multiple de 4.
Ton code "sent" la sonde en deepsleep qui se réveille à intervalles réguliers
A mon sens, il manque au moins une donnée conservée en rtcMemory, afin de savoir si l'ESP est réveillé après un deepsleep ou s'il a démarré à froid.
D'autant que si le montage est sur batterie, lorsque celle-ci devient faiblarde, j'ai constaté des sorties de deepsleep sans conservation de la rtcMemory.
Perso j'ai pris comme option d'ajouter dans les données conservées :
une constante sur 32 bits, peu importe la valeur mais différente d'un programme à l'autre.
un CRC32
Ainsi au démarrage, la vérification de la constante et du CRC32 permet de s'assurer de la consistance des données lues.
J'ai écrit le petit bout de code ci-dessous en respectant la même syntaxe que mon sketch, et là tout fonctionne normalement !
Reste maintenant à comprendre pourquoi ça ne fonctionne pas ...
Mais la lecture des données FLOAT est bonne.... seule la vaeur INT est erronnée !
bricoleau:
Nb :
Ton code "sent" la sonde en deepsleep qui se réveille à intervalles réguliers
A mon sens, il manque au moins une donnée conservée en rtcMemory, afin de savoir si l'ESP est réveillé après un deepsleep ou s'il a démarré à froid.
D'autant que si le montage est sur batterie, lorsque celle-ci devient faiblarde, j'ai constaté des sorties de deepsleep sans conservation de la rtcMemory.
Perso j'ai pris comme option d'ajouter dans les données conservées :
une constante sur 32 bits, peu importe la valeur mais différente d'un programme à l'autre.
un CRC32
Ainsi au démarrage, la vérification de la constante et du CRC32 permet de s'assurer de la consistance des données lues.