Mise en sommeil profond et réveil ESP32

Bonsoir,
Je me remets dans mon projet de balance avec différents capteurs sous esp32 où les données sont récoltées par un esp32 relié au SIM900 afin de les recevoir par sms.

Maintenant que tout fonctionne normalement. Il faut que je m'occupe de l'économie d'énergie.
Je mets en sommeil profond l'ESP de la balance avec récepteur. Faut-il mettre un RTC DS3231, je crois que l'ESP en possède un, pas sûr que je puisse l'utiliser pour ça, j'ai vu qu'il y avait une minuterie sinon, mais si je mets un réveil pour certaines alertes, je risque d'avoir une reprise de la minuterie au dernier réveil soit la dernière alerte...,non?

Pour l'ESP récepteur des données et envois (relié au SIM900), je le mets en sommeil profond mais est ce qu'il peut être réveillé lorsque les autres ESP essaye de se connecter en wifi pour l'envoi de données?

je m'inspire de ce lien ici

Bonne soirée
merci de votre retour

Bonsoir @ducat42

Les ESP32 possèdent un Compteur/Timer actif (qui ne mérite pas le terme RTC au sens ou tout le monde l'utilise) pendant le deep-sleep et pouvant les réveiller 'au bout d'un certain temps'. Cela fonctionne très bien si on n'attend pas un précision horlogère pour les temps de sommeil. Disons qu'en programmant 1 de sommeil on pourrait avoir qq minutes de sommeil en plus ou en moins

Bien entendu s'il est impératif d'effectuer les envois à des instants (heures, munutes...) impératifs, l'ajout d'un circuit externe de RTC se justifie

L'ESP32 relié au SIM900 pourrait sortir du sommeil profond par changement de niveau sur un GPIO dédié , ce changement de niveau pouvant venir de la sortie TX du SIM900 (il faudrait alors accepter de sacrifier un premier envoi d'octet juste pour réveiller et les autres pour les données utiles )

le site Random Nerd Tutorials est une excellente source d'informations sur les ESP32 !

Merci pour ton retour.

Il est vrai que je ne veux pas forcément avoir les données à 5 min près. Mais après il risque d'avoir un décalage? Je voudrais avoir les infos tous les jours vers 10h.
Ou alors si je mets une minuterie de 23h55 maximum.
Non?

Pour le 2e ESP. Je ne comprends pas exactement les octets sacrifiés.
En fait sur quel point, octets sur le stockage ou sur autre chose ?

un envoi chaque jour 'vers 10h', pas besoin de RTC ajoutée , à l'usage tu verras quelle durée de 'deep-sleep' programmer

'octet sacrifié' ?
A réception d'un SMS le SIM900 sortirait sur TX un octet qui aura comme seul objet de réveiller l'ESP32 (cpar changement d'atat d'un GPIO) ensuite viendraient les octets utiles portant des données

#define uS_TO_S_FACTOR 1000000  // Facteur de conversion des microsecondes en secondes 
#define TIME_TO_SLEEP  60      // Temps pendant lequel l'ESP32 va se mettre en veille (en secondes) 86184sec pour 23h56min


void print_wakeup_reason(){
  esp_sleep_wakeup_cause_t wakeup_reason;

  wakeup_reason = esp_sleep_get_wakeup_cause();

  switch(wakeup_reason)
  {
    case ESP_SLEEP_WAKEUP_EXT0 : Serial.println("Réveil provoqué par un signal externe utilisant RTC_IO"); break;
    case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Réveil provoqué par un signal externe utilisant RTC_CNTL"); break;
    case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Réveil provoqué par une minuterie"); break;
    case ESP_SLEEP_WAKEUP_ULP : Serial.println("Réveil causé par le programme ULP"); break;
    default : Serial.printf("Le réveil n'a pas été causé par un sommeil profond : %d\n",,source_reveil); break;
  }
}

void setup()
{
  Serial.begin(115200);
  Serial.println();


   print_wakeup_reason();//Affiche la raison du réveil

   
   esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);//Configuration du timer
   Serial.println("ESP32 réveillé dans " + String(TIME_TO_SLEEP) + " seconds");

   
   Serial.println("Rentre en mode Deep Sleep"); //Rentre en mode Deep Sleep
   Serial.println("----------------------");
   delay(100);
   esp_deep_sleep_start();
   Serial.println("Ceci ne sera jamais affiché");
}

Voilà j'ai recopié le code pour mettre en veille profonde avec les raisons du réveil.

  1. Tous les 24h environs , à définir le temps nécessaire afin de ne pas trop avoir de décalage sur le long terme!
  2. J'ai des capteur de température et je voudrais lorsqu'une fourchette de température est atteinte qu'il y a un réveil afin d'avoir un envoi de message d'alerte
  3. J'ai un capteur de poids je voudrais un réveil lorsqu'il y a une perte brutale de poids.

Puis-je avoir plusieurs raisons de réveil? je pense que oui et comment faire un réveil avec une température atteinte ou une baisse de poids?

merci

Comment je le mets dans mon programme en début de setup mais il risque de se remettre tout de suite

-Si le réveil par timer est le seul réveil activé , à quoi sert l'affichage de la source du réveil ?

-Quand un ESP32 dort il ne peut surveiller lui même une température ou un poids
Ce type de surveillance est à confier à des composants externes susceptibles de réveiller l'ESP32 par EXT0 ou EXT1

de quoi s'agit-il ?

Je voudrais un réveil pour voir une lecture de toutes mes données et ensuite réveiller esp combiné au sim900 pour envoie sms

Un autre réveil si température atteint une certaine température
Et un autre si poids baisse d'un coup

Quel composant du coup ?

  1. Si tu as un RTC, il n'y aura pas de décalage, tu calcules les temps en fonction de l'heure de réveil souhaité.
  2. Tu peux réveiller un microcontrôleur sur des changements d'état, donc la température n'est pas un changement d'état en lui même de l'une des broches internes.
    C'est à ton microcontrôleur de se réveiller pour surveiller la valeur des capteurs.
    Dans ce cas pour une question d'économie d'energie, il ne faut pas forcément activer la sim900
  3. il y a peut être un possibilité de traduire électroniquement le changement de poids en un changement d'état d'une broche du microcontrôleur, pour qu'il puisse se réveiller.

Bonjour
Merci de ton retour, la sim900 est avec un autre esp qui sera réveillé si le 1er esp (qui récolte les infos, c'est a dire poids température) se réveille

Si c'est a mon microcontrôleur de se réveiller je ne peux pas le mettre en sommeil profond du coup ?

Du coup, je dois le réveiller toutes les heures afin qu'il fasse un relevé et voir si la température n'est pas dans la fourchette ou le poids n'est pas en baisse brutale et envoyer une alerte si besoins...

Ça va consommer beaucoup ?

Mon projet aura une batterie pour un maître avec sim900 et 5 esclaves qui relèvent les données. La communication se fera en wifi entre chaque. Je voudrais en filaire mais je ne voudrais pas avoir des câbles de partout entre chaque balance...

Soit il faut mettre une batterie pour le maître et une pour 2 esclave mais c'est plus cher....

Comme je te l'ai indiqué, il doit être peut être possible d'avoir un schéma électronique, mais sinon oui, si tu veux de l'intelligence, cela ne peut pas se faire si ton microcontrôleur n'est pas actif.
Tu peux prendre une analogie humaine, quand tu dors, tu ne peux pas faire les tâches qui t'incombe.

Je ne suis pas sûre de comprendre cette phrase, si le microcontrôleur se réveille, c'est bien qu'il s'était endormis, donc que tu as pu le mettre en sommeil.
Peut être que c'est la définition de sommeil profond que tu n'a pas appréhendé?

Beaucoup c'est très relatif et malheureusement ne veut pas dire grand chose.
Pour le savoir, il faut mesurer la consommation de ton circuit, pour faire une estimation.
Je crois que un ESP32, sans le wifi activer consomme de l'ordre de 60mA.
soit 12mAh par jour.

Il faudrait utiliser l'ULP Coprocessor il est actif pendant le deepsleep.
Il peut se réveiller périodiquement, faire tourner l'ADC, accéder à certains périphériques, réaliser des traitements basiques et se rendormir ou réveiller le reste de l'ESP.
Son fonctionnement est détaillé dans la datasheet de l'ESP32.
Je ne sais pas trop comment il est supporté par l'API ESP32 Arduino.

Bonjour @fdufnews

Dans le core ESP32 pour IDE Arduino , on commence a voir un premier exemple d'utilisation du processeur ULP (en assembleur :frowning_face:)

SmoothBlink_ULP_Code (groupe d'exemples deepsleep)

Jeu d'instructions du coprocesseur ULP

Jusqu'à présent j'avais rangé ça dans la catégorie : "ça existe mais c'est hors de portée" (du moins pour moi vue la courbe d'apprentissage soupçonnée) . J'imagine qu'Espressif a des ingénieurs d'application à la disposition des gros clients pour exploiter ça

EDIT : un moteur de recherche avec 'ESP32 ADC ULP' renvoie vers quelques échanges.... qui sont probablement repris par l'une ou l'autre des IA

Pour le mettre en sommeil, je pense y arriver mais il est préconisé avant la mise en sommeil, de mettre une raison du réveil.

D'où toutes mes interrogations...

Distinguer 2 choses :

l'une obligatoire avant la mise en sommeil : autoriser une méthode de réveil par exemple

`esp_sleep_enable_timer_wakeup(time_in_us)`

l'autre facultative , à faire seulement si indispensable : [u]afficher au démarrage la raison du réveil qui vient de se produire [u]

void print_wakeup_reason()

Je ne fais jamais la seconde action , inutile dans mes montages car seul la sortie de deepsleep par Timer y est validée
A quoi bon dans ce cas interroger l'ESP32 pour lui demander qui vient de le réveiller ?

Oui tu as raison, avant de le mettre en sommeil je voudrais trouver la façon pour le réveiller...

Oui tu dois choisir et définir dans le programme la méthode (ou les méthodes) autorisée(s) à sortir du deepsleep et ce, avant d'endormir l'ESP32

Si je ne suis pas obligé je ne le mettrai pas, je n'en voyais intérêt.

je pars la dessus https://github.com/espressif/esp-idf/blob/v5.4/examples/system/ulp/ulp_fsm/ulp/README.md?