Go Down

Topic: Esp32 : deep sleep et SPIFFS  (Read 1 time) previous topic - next topic

J-M-L

Quote
J-M-L, le réveil  partir d'un deepsleep(ESP8266 ou ESP32) est un redémarrage  avec exécution du setup() !
Ce que je voulais dire (à vérifier) c'est qu'au reboot les variables globales sont bien mises à zéro et la config des pins connue etc alors que je ne suis pas sûr que le démarrage post deep sleep soit similaire - mais je me trompe peut être, je n'ai pas exploré en détail cette partie 'je préfère tout éteindre)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

al1fch

#16
Nov 18, 2018, 02:06 pm Last Edit: Nov 18, 2018, 02:11 pm by al1fch
J'ai moi même été surpris  de la profondeur du sommeil, je ne m'attendais pas à celà !!
Plus qu'un réveil c'est une re-naissance !
Le deep-sleep eteint lui même tout à la seule exception de la partie nommée RTC.
Tout redémarre au reveil comme pour une mise sous tension ...... c'est ailleurs effectivement une mise sous tension de la quasi totalité du SOC

J-M-L

#17
Nov 18, 2018, 02:08 pm Last Edit: Nov 18, 2018, 02:11 pm by J-M-L
Oui

==>

(source ESP32 Deep Sleep Tutorial)

Mais ça n'éteint pas les systèmes connexes - d'où le petit switch pilotable
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

al1fch

#18
Nov 18, 2018, 02:17 pm Last Edit: Nov 18, 2018, 02:30 pm by al1fch
Quote
Mais ça n'éteint pas les systèmes connexes - d'où le petit switch pilotable
Effectivement , l'ESP32 dort profondément quand les autres restent eveillés !!

Pour faire une gestion globale j'aime bien le TPL5110 (timer + commande du PMOS externe)

Un 'breakout' d'Adafruit rassemble le tout
(Je ne connaissais pas les modules Power Switch  de Pololu)

lesept

Mais ça n'éteint pas les systèmes connexes - d'où le petit switch pilotable
Je suppose que c'est ce qui permet de le réveiller via une interruption envoyée par un capteur, dans mon cas l'accéléromètre ?
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

J-M-L

Je suppose que c'est ce qui permet de le réveiller via une interruption envoyée par un capteur, dans mon cas l'accéléromètre ?
Oui j'alimente tout le système par le switch - donc quand j'éteins le switch (on peut le faire par programme) - ça coupe tout et quand il se rallume, ben ça rallume tout comme si vous aviez appuyé sur le bouton.
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

destroyedlolo

Salut,

Heu, je suis un peu surpris par le contenu de ce sujet ... Je n'ai pas encore utilisé l'ESP32 mais je connais bien l'ESP8266, j'imagine que c'est plus ou moins la même chose :)

En résumé, oui, quand tu te reveille d'un DeepSleep, c'est pareil qu'un boot, donc TOUTES TA MEMOIRE a disparu hormis le contenu de la RTC.
Je pense qu'il y a une grosse confusion à ce niveau : il faut considérer cette mémoire comme un stockage externe à l'instar d'un fichier stocké sur la SPIFF.

Voici comment je procède :

J'ai créé une librairie qui me facilite la gestion de la RTC : KeepInRTC.
Les informations que je souhaites conserver sont stockées dans des variables "normale". Une instance de KeepInRtc::KeepMe gère le fait qu'on souhaite le sauvegarder.
J'ai les fonctions suivantes :
  • le constructeur de ma classe KeepMe par laquelle, je reserve chacune des variables : je passe un pointeur sur celle-ci et sa taille . Si ma RTC contient des données valables (que j'identifie par une "valeur magique" comme l'expliquait J-M-L), je restore la valeur de ma variables ... ce qui me permet de la conserver d'un redemarrage a un autre
  • save() que j'appele à chaque fois que je souhaites sauvegarder le nouveau contenu de ma variable


Il y a des exemples dans le répertoire du même nom.

Pour un exemple plus complet avec tout pleins de variables sauvegardés de manière parfaitement anarchiques (== n'importe quand), y'a mon projet pour mon poulailler. Il fonctionne très bien mais je n'irai pas au bout, car j'ai eu des problèmes avec le poulailler lui-même donc je suis parti sur autre chose. Mais j'utilise ma librairie pour d'autres projets :)

Bref, ce code est pour ESP8266, je n'ai pas (encore :) ) utilisé l'ESP32, mais y'a peut-être de quoi s'en inspirer.

A+

al1fch

#22
Nov 19, 2018, 12:35 am Last Edit: Nov 19, 2018, 08:17 am by al1fch
Bonsoir detroyedlolo
Quote
Je pense qu'il y a une grosse confusion à ce niveau
peux tu préciser en quoi consisterait  cette 'grosse confusion' ?

Oui les ESP8266 et ESP32 sont voisins quand au deep sleep, mias pas  identiques, plus simple.

Nous sommes d'accord pour dire que tout le contenu de la SRAM interne à l'ESP32 (520k)  a disparu ...puisqu'elle a cessé d'être alimentée.. à l'exception des  2 RAM RTC (8k chacunes) qui, elles, ont continué à être alimentées.
Bien entendu la ROM interne à l'ESP32 (448k) est conservée  de même que le contenu de la mémoire SPI FLASH externe (souvent 4 MB) ...( plus toujours externe d'ailleurs puis qu'Expressif  vient de sortir deux variantes d'ESP32 avec une FLASH interne de 2 ou 4 MB... plus besoin dans ce cas du petit boitier Winbond 4MB ou 8MB , toujours  associé  jusqu'à présent aux  l'ESP32)

(J'utilise les termes 'interne et externe' au sens physique : ce qui est ou n'est pas dans le boitier de la puce)

Oui la RAM RTC(8k) disponible sur un ESP32 s'utilise  d'une manière très simple  : Il suffit  déclarer spécifiquement les variables que l'on veut y placer (autres plages d'adresses)  Bien déclarées on peut à tout moment y accéder en lecture ou écriture, sans mécanisme particulier contrairement à une EEPROM, une , une FLASH, sans appel d'une fonction particulière contrairment à  l'ESP8266.
Code: [Select]

RTC_DATA_ATTR int bootCount = 0;
.....
++bootCount;
Serial.println("Boot number: " + String(bootCount));

destroyedlolo

ben par rapport au
Quote
45 ko de variables globales
Est-il vraiment obligatoire d'y stocker TOUTES les variables globales ?
Normalement, seul les variables de contextes ont ce besoin :)

J-M-L

ben par rapport auEst-il vraiment obligatoire d'y stocker TOUTES les variables globales ?
Normalement, seul les variables de contextes ont ce besoin :)
c'est quoi une "variable de contexte" selon vous?...
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

lesept

Bonsoir
Merci de toutes vos réponses. J'ai en effet sauvegardé mes 'variables de contexte', c'est à dire celles que je dois pouvoir utiliser après un réveil, dans la RAM RTC comme l'indique Al1 dans la réponse 22.

Ça, ça marche.
J'ai ensuite testé la mise en sommeil et le réveil par timer et par les touches tactiles de l'ESP32.

Ça, ça marche aussi.
Maintenant, je me bats avec le réveil par une interruption externe : un bouton d'abord. Ça marche. C'est dommage que ce soit incompatible du réveil par les touches tactiles, j'aurais bien aimé avoir les deux...

Reste à implémenter le réveil par la détection d'un mouvement avec un accéléromètre MPU6050... Et là, ça marche pas, je rame... Rien de probant sur le net. Si vous avez des pistes, je suis preneur.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

al1fch

#26
Nov 20, 2018, 06:04 pm Last Edit: Nov 20, 2018, 07:41 pm by al1fch
Bonsoir lesept

Pas encore résolu la question du seuil de mouvement et de la durée de mouvement pour obtenir une interruption en sortie du MPU6050 ;) ?

Je ne connais pas  bien  la puce, sa datasheet et la ou les librairies mais une idée vient  :
l'interruption par 'détection du mouvement' est elle possible DMP désactivée ?

lesept

#27
Nov 20, 2018, 07:25 pm Last Edit: Nov 20, 2018, 07:26 pm by lesept
En effet, question pertinente. Je me suis posé la même, mais pas eu le temps de tester...

EDIT : ton lien est faux... Peux-tu vérifier ?
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

al1fch

lien corrigé, c'était encore la malédiction du http://http://http//.....""""""

lesept

Au fait, dois-je ou puis-je mettre la pin qui reçoit l'interruption en pullup ou pulldown ?
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up