IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Mode sommeil ESP32 WROOM-32


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut Mode sommeil ESP32 WROOM-32
    Bonjour ,

    j'utilise un montage actuellement avec 2 capteurs me permettant de visualiser la fermeture ou non de panneaux coulissants
    Ce montage est fonctionnel façon autonome ( voir fichier "principe") et j'ai voulu transmettre des informations via le wifi
    Or ces informations répétées toutes les 10mn via un TLP5110 sont très gourmandes

    C'est pourquoi, je souhaiterai revoir la méthode et il me semble qu'à l'usage il faudrait 2 types de mises en sommeil
    1) d'une durée longue lorsque les panneaux sont fermés
    2) et une durée plus courte lorsque les panneaux sont ouverts (détection alarme)

    si avec le TPL5110 cela me semble donc impossible , il reste
    qu'une option : le mode sommeil de l'ESP32

    il en existe, je crois, 4 distincts mais ma question est la suivante :

    si je désire avoir une périodicité 2 fois/jour lorsque les panneaux sont fermés
    et 10 mn lorsque les panneaux sont ouverts comment puis-je faire svp ?

    Comment programmer l'ESP32 pour obtenir des temps aussi long (12h) lorsque les panneaux sont fermés et
    surtout comment programmer le réveil de l'ESP32 sur ouverture des panneaux ?
    si tout cela est possible bien sûr ...

    merci de m'avoir lu

    pascal
    Images attachées Images attachées

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Plein d’infos ici
    https://lastminuteengineers.com/esp3...akeup-sources/

    Utilisez le timer pour le réveil de temps en temps et une pin pour le réveil sur détection du panneau (avec un limit switch par exemple)

  3. #3
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut
    Bonjour,

    merci pour la réponse Jay M

    je vais essayé ces tutos ,j'aurais juste une question pratique
    l'ensemble de ces tutos font état d'un temps d'env 5s
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define uS_TO_S_FACTOR 1000000  //Conversion factor for micro seconds to seconds
    #define TIME_TO_SLEEP  5        //Time ESP32 will go to sleep (in seconds)
    mais comment faire lorsque je souhaite par ex un timer de 12h
    passage de µs en Secondes puis de Secondes en Minutes etc ?

    pascal

  4. #4
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 539
    Par défaut
    Bonjour,

    tu peux incrémenter un compteur à chaque réveil pour obtenir des périodes plus longues. Il faudra placer ce compteur dans la RAM RTC qui n'est pas modifiée après un deep sleep.
    Pour placer une variable dans la RAM RTC, il suffit de faire précéder sa déclaration par "RTC_DATA_ATTR".
    Par exemple:
    RTC_DATA_ATTR unsigned int monCompteur = 0;

    A+

  5. #5
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut
    Bonjour jackk

    Merci d'avoir répondu
    mais j'avoue ne pas comprendre l'astuce pour le temps plus long
    dans l'exemple ci-dessous , le temps de sommeil est de 30s
    or je ne vois pas quel est l’intérêt de compter le nb de mise en sommeil de l'ESP32

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
     
    #define uS_TO_S_FACTOR 1000000  /* Conversion factor for micro seconds to seconds */
    #define TIME_TO_SLEEP  30        /* Time ESP32 will go to sleep (in seconds) */
     
    #define Orange_Led 33
     
    RTC_DATA_ATTR int bootCount = 0;
     
    void print_wakeup_reason(){
      esp_sleep_wakeup_cause_t wakeup_reason;
     
      wakeup_reason = esp_sleep_get_wakeup_cause();
     
      switch(wakeup_reason)
      {
        case 1  : Serial.println("Wakeup caused by external signal using RTC_IO"); break;
        case 2  : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;
        case 3  : Serial.println("Wakeup caused by timer"); break;
        case 4  : Serial.println("Wakeup caused by touchpad"); break;
        case 5  : Serial.println("Wakeup caused by ULP program"); break;
        default : Serial.println("Wakeup was not caused by deep sleep"); break;
      }
    }
     
    void setup()
    {
      Serial.begin(115200);
      delay(1000); //Take some time to open up the Serial Monitor
     
      pinMode(Orange_Led, OUTPUT);
     
      //Increment boot number and print it every reboot
      ++bootCount;
      Serial.println("Boot number: " + String(bootCount));
     
     
      print_wakeup_reason();
     
      esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
      Serial.println("Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) +
      " Seconds");
     
     
      Fast_Blink_LED();
     
      Serial.println("Going to sleep now");
      esp_deep_sleep_start();
      Serial.println("This will never be printed");
    }
     
    void loop()
    {
      //This is not going to be called
    }
     
     
    void Fast_Blink_LED(void)
    {
     digitalWrite(Orange_Led, HIGH);   
     delay(200);                       
     digitalWrite(Orange_Led, LOW);    
     delay(200);
     digitalWrite(Orange_Led, HIGH);   
     delay(200);                      
     digitalWrite(Orange_Led, LOW);    
     delay(200); 
    }
    et si je veux un temps de sommeil de 12h comment dois-je faire svp ?
    mettre par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define TIME_TO_SLEEP  43200

    pascal

  6. #6
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 539
    Par défaut
    Si le temps de sommeil est égal à 30s, le compteur atteindra 1440 au bout de 12 heures.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void loop()
    {
      if (bootCount == 1440) {
           Serial.println(" 12 heures se sont écoulées");
           bootCount = 0;
       }
    }

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    le timer pour le deep sleep est stocké sur 32 bits et exprimé en micro-secondes ce qui fait que le temps max est d'environ 71 minutes

    si vous voulez faire plus long, par exemple 12h, une des méthodes classiques c'est effectivement de se réveiller toutes les heures et de compter le nombre de réveils. si on n'en est pas à 12, alors on se rendort aussitôt sinon on fait ce qu'il faut faire

  8. #8
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut
    Ok,
    merci à tous les deux
    je n'avais pas pensé à çà
    je ne savais pas à quoi pouvait servir le compteur
    comme j'utilise actuellement un TPL5110 qui fait une mise en sommeil de 1s à plusieurs heures
    en suivant la même logique je ne comprenais pas comment dépasser 1h

    effectivement mettre une tempo de 1mn puis compter le nombre de réveil
    semble la voie à explorer

    merci bien

    pascal

  9. #9
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 539
    Par défaut
    Une autre solution consiste à utiliser une RTC externe possédant une alarme configurée à une date et une heure précise, qui serait réactualisée à chaque réveil pour préparer le suivant.
    La RTC DS1375 possède 2 alarmes programmables par exemple. La DS 3231 est encore plus précise.
    La sortie /INT de la RTC serait dans ce cas utilisée pour réveiller l'ESP

  10. #10
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Citation Envoyé par cobra38 Voir le message
    Ok,
    effectivement mettre une tempo de 1mn puis compter le nombre de réveil
    semble la voie à explorer
    si c'est vraiment 12h de sommeil que vous voulez prenez de pauses plus longues, pas la peine de consommer du courant et de sortir de veille pour rien. 1h ça semble adapté

  11. #11
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut
    En fait, mon souci premier c'est la consommation du projet
    donc lorsque les panneaux sont fermés, il ne peut pas y avoir d'alarme
    donc il est inutile de transférer les données IOT toutes les dix minutes mais seulement
    deux fois par jour soit toutes les 12h pour avoir entre autre le niveau batterie

    Par contre lorsque les panneaux sont ouverts, il faut transferer les données toutes les10 mn

    d'où le test panneaux ouverts ou fermés qui doit conditionner le temps de sommeil

    pascal

  12. #12
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut
    Bonjour,

    avant d'aller plus loin , j'essaie un premier croquis et souhaiterai avoir votre avis sur l'approche
    dans un premier temps

    test réveil par Timer toutes les 10 secondes
    puis au 5ième soit 50s => entrée dans loop()


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    #define uS_TO_S_FACTOR 1000000
    #define TIME_TO_SLEEP  10
     
    //#define pinP1                32                   //* Panneau 1 ouvert */
    //#define pinP2                33                   //* Panneau 2 ouvert /*
     
    RTC_DATA_ATTR int bootCount = 0;
     
    void setup(){
       Serial.begin(115200);
       // pinMode(pinP1, INPUT);                       // Entree Panneau 1 Ouvert
       // pinMode(pinP2, INPUT);                       // Entree Panneau 2 Ouvert
     
       ++bootCount;
        Serial.println("----------------------");
       Serial.println(String(bootCount)+ "eme Boot ");
     
       //Affiche la raison du réveil
       print_wakeup_reason();
       //Configuration du timer
       esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
       Serial.println("ESP32 réveillé dans " + String(TIME_TO_SLEEP) + " seconds");
     
       if (bootCount!=5) {
       //Rentre en mode Deep Sleep
       Serial.println("Rentre en mode Deep Sleep");
       Serial.println("----------------------");
       delay(100);
       esp_deep_sleep_start();
       Serial.println("Ceci ne sera jamais affiché");
       }
     
    }
     
    void loop(){
    Serial.println("Rentre en mode Normal");
    Serial.println("----------------------");
    bootCount=0  ;
    esp_deep_sleep_start();
    }
     
    void print_wakeup_reason(){
       esp_sleep_wakeup_cause_t source_reveil;
     
       source_reveil = esp_sleep_get_wakeup_cause();
     
       switch(source_reveil){
          case ESP_SLEEP_WAKEUP_EXT0 : Serial.println("Réveil causé par un signal externe avec RTC_IO"); break;
          case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Réveil causé par un signal externe avec RTC_CNTL"); break;
          case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Réveil causé par un timer"); break;
          case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Réveil causé par un touchpad"); break;
          default : Serial.printf("Réveil pas causé par le Deep Sleep: %d\n",source_reveil); break;
       }
    }
    merci

    pascal

  13. #13
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Oui il faut mettre une LiPo (1S)

  14. #14
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut
    J'ai lu çà sur le descriptif ?
    https://fr.aliexpress.com/item/32977...21ef5e5bBJN6Dg

    Nom : 2022-02-24_18-29-55.jpg
Affichages : 188
Taille : 70,8 Ko

    voici le lien

  15. #15
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    sans pour autant atteindre la consommation d'un module nu, si vous voulez un module qui ne consomme pas trop (il faut faire sauter une LED pour minimiser la consommation) regardez du côté du "LILYGO TTGO T7 V1.5 Mini32 ESP32" => http://www.lilygo.cn/prod_view.aspx?TypeId=50033&Id=978

    ils sont pratiques car port USB intégré et aussi un port pour alimentation avec une batterie (LiPo 1S) et vous devez être aux environ de 100µA en deep sleep

    Nom : Ha204b20d14d243faa0c1a8760de1b187r.jpg
Affichages : 221
Taille : 137,2 Ko

  16. #16
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut
    Merci Jay M

    c'est en commande, je vais voir il me semble que le module accepte des batteries 3.7v

    pascal

  17. #17
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    ça parait pas mal. vous avez essayé ?

  18. #18
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut
    Oui
    çà a l'air de fonctionner



    Au début , bêtement j'ai orienté le test "bootCount" sur le "réveil"
    mais sans succès , çà ne fonctionnait pas et je n'ai pas trouvé pourquoi
    ensuite j'ai mis le test sur "bootCount" sur le "sommeil" et là çà a fonctionné

    maintenant il me reste à l'intégrer à mon projet
    mais une petite question :
    pourquoi en mode deep-sleep la led rouge de l'ESP32 reste allumée ?

    pascal

  19. #19
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 539
    Par défaut
    Citation Envoyé par cobra38 Voir le message
    pourquoi en mode deep-sleep la led rouge de l'ESP32 reste allumée ?
    Parce que tu dois sûrement travailler avec un "DEV-KIT" ESP32 incorporant l'interface usb/uart et un régulateur qui alimente l'ESP à partir du 5V de l'USB. La LED étant connectée sur le 3,3 V en sortie du régulateur, c'est normal qu'elle reste allumée.

  20. #20
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut
    ok
    effectivement je suis raccordé via l'USB
    c'était une question idiote mille pardons
    j'aurai du m'en douter


    merci bien
    pascal

Discussions similaires

  1. esp32 wroom date ets Jun 8 2016 ?
    Par J4e8a16n dans le forum Arduino
    Réponses: 0
    Dernier message: 22/12/2019, 17h25
  2. [Électronique] Mode sleep in esp32
    Par sharkly dans le forum Embarqué
    Réponses: 10
    Dernier message: 29/05/2019, 15h30
  3. Le grand mode d'emploi du forum, à lire si vous souhaitez tout savoir !
    Par Anomaly dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 03/06/2013, 17h36
  4. Réponses: 17
    Dernier message: 17/10/2002, 20h06
  5. Passer en mode 800*600
    Par flavien tetart dans le forum Assembleur
    Réponses: 8
    Dernier message: 30/05/2002, 23h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo