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 :

Consommation : comment améliorer l'autonomie ?


Sujet :

Arduino

  1. #21
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    Bonjour à tous

    merci encore pour votre aide

    En 1er lieu , j'ai rechargé le prg de Jay M (l'alimentation 18650 se fait directement par le connecteur sur la carte) càd :

    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
     
    const uint64_t  uS_TO_S_FACTOR = 1000000ull; /* Conversion factor for micro seconds to seconds */
    const uint64_t  TIME_TO_SLEEP = 10ull; /* Time ESP32 will go to sleep (in seconds) */
    RTC_DATA_ATTR uint32_t bootCount = 0;
     
    void setup() {
      Serial.begin(115200); Serial.println();
      while(!Serial) yield();
      Serial.println("Hello World");
      ++bootCount;
      esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
      Serial.println("Sleeping in 10s"); Serial.flush();
      delay(10000);
      esp_deep_sleep_start();
    }
     
    void loop() {}
    Le résultat est :
    sleep = 10,76 mA
    no sleep = 49 mA

    conclusion : j'avais en "sleep" avec mon croquis pour mémoire une valeur de 11,39 mA et ici 10,76 mA, des valeurs cohérentes qui laisse à penser que l'ESP reste allumé !


    Le code tel qu'il est se réveille tous les ∆t par l'appel à esp_sleep_enable_timer_wakeup() et quand l'ESP voit un HIGH sur n'importe quelle pins des boutons de BUTTON_PIN_BITMASK. Le code exécute le setup() qui configure LoRa, affiche des choses sur le port série, configure les callbacks pour les boutons et appelle vos fonctions print_wakeup_reason() et print_GPIO_wake_up() puis votre arduino se rendort.

    la bibliothèque OneButton n'utilise que du polling (interrogation quand on demande). ici vous ne faites jamais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    1 sw1.tick();
    2 sw2.tick();
    donc la bibliothèque n'est jamais appelée et les callbacks sw1Click ou sw2Click ne sont jamais utilisés. Ce n'est pas la bibliothèque qui maintient votre ESP allumé

    J'avoue ne pas bien comprendre , car dans mon croquis , je fais bien appel aux boutons par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // BTN1
      sw1.attachClick(sw1Click);
      // BTN2
      sw2.attachClick(sw2Click);
    et ceux-ci jouent bien leur rôle par interruption comme demandé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     #define BUTTON_PIN_BITMASK 0x300002000 // PIN32+PIN33 in hex
     .../...
     esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK,ESP_EXT1_WAKEUP_ANY_HIGH);
    Mon problème de consommation peut-il être dû au fait que je ne déconnecte pas le Bus "SPI" ( Lora) durant le sommeil profond
    si oui comment faire ?

  2. #22
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    Re...

    j'ai un peu progressé depuis ce matin
    pour mémoire , j'avais une consommation résiduelle de 11,39 mA


    1° - les "pull-up" sur CS et RST ne change rien sur la valeur

    2° - j'ai téléversé le prg de Jay M
    j'ai constaté que j'avais une consommation résiduelle de 10,49 mA
    j'y ai donc incorporé les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
    delay(60) ; LoRa.end() ;
    delay(300); // necessary to stop LoRa modem
    la consommation est retombée à : 4,36 mA

    3° - j'ai mis la même ligne de code dans mon croquis d'origine
    résultat :
    - à l'init : 4,36 mA
    - puis : 11,49 mA

    Donc il apparait qu'il y a un élément qui consomme dès la sollicitation du 1er Boot
    les seuls éléments différents sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      print_wakeup_reason();
      print_GPIO_wake_up();
    je les ai donc commentés et là : consommation est revenue à : 4,36 mA
    je souhaiterai donc continuer à descendre ma consommation si c'est encore possible ....

  3. #23
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 714
    Points : 5 392
    Points
    5 392
    Par défaut
    Citation Envoyé par cobra38 Voir le message
    conclusion : j'avais en "sleep" avec mon croquis pour mémoire une valeur de 11,39 mA et ici 10,76 mA, des valeurs cohérentes qui laisse à penser que l'ESP reste allumé !
    l'ESP est sans doute en veille mais le reste de la carte sans doute pas. Peut-on mettre le module LoRa en mode basse consommation ou l'éteindre, avez vous des LEDs qui restent allumées sur la carte?

    Citation Envoyé par cobra38 Voir le message
    J'avoue ne pas bien comprendre , car dans mon croquis , je fais bien appel aux boutons par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // BTN1
      sw1.attachClick(sw1Click);
      // BTN2
      sw2.attachClick(sw2Click);
    ces appels ne font qu'attacher le call back aux boutons. Ce qui déclenche l'appel des fonctions sw1Click ou sw2Click c'est quand vous appelez tick() sur le bouton et que la condition est rempli (le bouton est vu comme étant appuyé). Sans tick(), aucun callback possible. c'est pour cela qu'on met les appels tick() dans la loop, pour vérifier le plus souvent possible si le bouton a été appuyé. virez le code lié à OneButton et mettez juste les pins en INPUT_PULLUP et vous devriez avoir le même comportement.



    Citation Envoyé par cobra38 Voir le message
    et ceux-ci jouent bien leur rôle par interruption comme demandé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     #define BUTTON_PIN_BITMASK 0x300002000 // PIN32+PIN33 in hex
     .../...
     esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK,ESP_EXT1_WAKEUP_ANY_HIGH);
    Oui c'est ce qui fait que le bouton fonctionne. vous associez une interruption aux pins des boutons qui va réveiller l'Arduino. Mais une fois réveillé vous ne vérifiez plus les appuis.

  4. #24
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 714
    Points : 5 392
    Points
    5 392
    Par défaut
    et sur votre autre message

    Citation Envoyé par cobra38 Voir le message
    j'y ai donc incorporé les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
    delay(60) ; LoRa.end() ;
    delay(300); // necessary to stop LoRa modem
    la consommation est retombée à : 4,36 mA

    3° - j'ai mis la même ligne de code dans mon croquis d'origine
    résultat :
    - à l'init : 4,36 mA
    - puis : 11,49 mA

    Donc il apparait qu'il y a un élément qui consomme dès la sollicitation du 1er Boot
    les seuls éléments différents sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      print_wakeup_reason();
      print_GPIO_wake_up();
    je les ai donc commentés et là : consommation est revenue à : 4,36 mA
    je souhaiterai donc continuer à descendre ma consommation si c'est encore possible ....
    Sur le premier point, vous éteignez certains service dont le LoRa apparemment donc ça se ressent sur la consommation.

    La fonction print_GPIO_wake_up() fait un appel à Lora donc réveille la puce ==> la consommation augmente c'est normal


    Si vous avez des Leds qui restent allumées, enlevez les physiquement, c'est ça qui consomme bcp...

  5. #25
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    Non Jay M
    je n'ai aucune Led allumée , j'avais même imaginé que le OLED consommait mais ce n'était pas le cas
    donc aucun "parasite" et j'ai du remettre dans le croquis les lignes de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     print_wakeup_reason();
      print_GPIO_wake_up();
    car je perdais les envois ....mais je reviens à 11,36 mA
    par contre j'ai lu ceci


    Modes Wi-Fi/Bluetooth et Veille

    En modes Veille profonde et Veille légère, les périphériques sans fil sont éteints. Avant de passer en mode Veille profonde ou Veille légère, l'application doit désactiver le Wi-Fi et le Bluetooth à l'aide des appels appropriés (par exemple, esp_bluedroid_disable(), esp_bt_controller_disable(), esp_wifi_stop()). Les connexions Wi-Fi et Bluetooth ne seront pas maintenues en mode Veille profonde ou Veille légère, même si ces fonctions ne sont pas appelées.

    Je crains donc que le WiFI , Bluetooth soient encore actifs mais je ne vois pas comment les inhiber


    EDIT:
    Help , J'ai essayé de diminuer ma consommation mais celle-ci démarre à 4,36 mA et reste à 11,39 mA dès que l'on actionne une entrée ou le "timer" , je ne trouve pas la cause

  6. #26
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 714
    Points : 5 392
    Points
    5 392
    Par défaut
    avez vous remis votre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
    delay(60) ; LoRa.end() ;
    delay(300); // necessary to stop LoRa modem
    avant de dormir ?

    pouvez vous reposter tout le code ?

    (je parlais de LED sur la carte, parfois il y en a une pour montrer que la pile fonctionne par exemple)

  7. #27
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    voici le dernier code EMETTEUR :

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
     
    /*************************************
                 EMETTEUR    
    ************************************/
     
     
    /***************************************
                    carte TTGO LoRa32-OLED V1
     
                       /----------------\
                       |19            18| 
                       |20            17|
                       |21            16|
                       |22            15| 
                       |23            14|
                       |24            13|
                       |25            12|
                       |26            11|
                       |27            10|  GPIO35   vbatPin
      MISO     GPIO19  |28             9|  GPIO32   volet
                       |29             8|  GPI033   Porte  
      SS       GPIO18  |30             7|
      SCK      GPIO05  |31             6|  GPIO26   DI0 
      I2C_SCL  GPIO15  |32             5|  GPIO27   MOSI
                       |33             4|  GPIO14   RST
      I2C_SDA  GPIO04  |34             3|
                       |35             2| 
      OLED_RST GPIO16  |36             1| 
                       -----------------
     
    *************************************/
     
    #include <LoRa.h>
    #include <SPI.h>
    #include <Wire.h>
    #include <OneButton.h> //  http://www.mathertel.de/Arduino/OneButtonLibrary.aspx
     
    //Libraries for OLED Display
    #include "SSD1306.h" 
     
    // LoRa definition
    #define SCK     5    // GPIO5  -- SX1278's SCK
    #define MISO    19   // GPIO19 -- SX1278's MISO
    #define MOSI    27   // GPIO27 -- SX1278's MOSI
    #define SS      18   // GPIO18 -- SX1278's CS
    #define RST     14   // GPIO14 -- SX1278's RESET
    #define DI0     26   // GPIO26 -- SX1278's IRQ(Interrupt Request)
    #define BAND    433E6
     
    // OLED definition
     
    #define I2C_SDA                     4
    #define I2C_SCL                     15
    #define OLED_RST                    16
    SSD1306Wire display(0x3c, I2C_SDA, I2C_SCL);
     
    const byte pinBouton1 = 32;
    const byte pinBouton2 = 33;
    const uint8_t vbatPin = 35;
     
    #define BUTTON_PIN_BITMASK 0x300002000 // PIN32+PIN33 in hex
    const uint64_t  uS_TO_S_FACTOR = 1000000ull; /* Conversion factor for micro seconds to seconds */
     
    //const uint64_t  TIME_TO_SLEEP = 3600ull; /* Time ESP32 will go to sleep (in seconds) */
    const uint64_t  TIME_TO_SLEEP = 30ull; /* Time ESP32 will go to sleep (in seconds) */
     
     
    RTC_DATA_ATTR int bootCount = 0;
     
    OneButton sw1(pinBouton1);
    int value1;
    OneButton sw2(pinBouton2);
    int value2;
     
    // CALLBACKS BOUTON 1
    void sw1Click()       {loraMessage("1");}
    void sw1DoubleClick() {loraMessage("11");}
    void sw1DebutLong()   {loraMessage("1D");}
    void sw1FinLong()     {loraMessage("1F");}
     
    // CALLBACKS BOUTON 2
    void sw2Click()       {loraMessage("2");}
    void sw2DoubleClick() {loraMessage("21");}
    void sw2DebutLong()   {loraMessage("2D");}
    void sw2FinLong()     {loraMessage("2F");}
     
    //**********************************************
    // SETUP
    //**********************************************
    void setup() {
      Serial.begin(115200);
     
      // BTN1
      sw1.attachClick(sw1Click);
      // BTN2
      sw2.attachClick(sw2Click);
     
      while (!Serial) yield();
       	SPI.begin(SCK,MISO,MOSI,SS);
        LoRa.setPins(SS,RST,DI0);
        Serial.println("LoRa : Emetteur");
      if (!LoRa.begin(433E6)) { // LoRa_frequency 
        Serial.println("Le lancement de LoRa a échoué !");
        while (true) yield();
      }
     
      Serial.println("init ok");
     
      display.init();
      display.flipScreenVertically(); 
      display.setFont(ArialMT_Plain_10);
      display.setTextAlignment(TEXT_ALIGN_CENTER);
      display.drawString(64, 22, "Emetteur: OK"); 
      display.display();
      delay(100);
      display.clear();
      display.display();
     
      //Increment boot number and print it every reboot
      ++bootCount;
      Serial.println("Boot number: " + String(bootCount));
     
      //Print the GPIO used to wake up
      print_wakeup_reason();
      print_GPIO_wake_up();  
      esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK,ESP_EXT1_WAKEUP_ANY_HIGH);
      esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
      esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_AUTO);
      esp_deep_sleep_start();
     
    }
     
    //**********************************************
    // LOOP
    //**********************************************
    void loop() {
    }
     
    //***********************************************
    void loraMessage(const char * message) {
      LoRa.beginPacket();
      LoRa.println(message);
      LoRa.endPacket();
    }
     
     
    void print_GPIO_wake_up(){
      uint64_t GPIO_reason = esp_sleep_get_ext1_wakeup_status();
      Serial.print("GPIO qui a déclenché le réveil : GPIO ");
      Serial.println((log(GPIO_reason))/log(2), 0);
      int val = (int)((log(GPIO_reason))/log(2));
      switch (val)
      {
      case 32:
      loraMessage("1");
      break;
      case 33:
      loraMessage("2");
      break;
      default : Serial.printf("Aucun GPIO n'a déclenché le réveil :"); break;
      }
    }
     
    //************************************************
    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_TIMER : 
          Serial.println("Réveil par un timer");
          envoiVbatBrut();
          break;
          default : Serial.printf("Réveil pas causé par le Deep Sleep: %d\n",source_reveil); break;
       }
    }
     
    //************************************************
    void envoiVbatBrut() {
      const int tailleMax = 20; // y compris le '\0' de fin
      static char vBatMessage[tailleMax];                                 // doit être assez grand pour contenir le message
      int vBat = analogRead(vbatPin); // tension échantillonnée brute
      Serial.print("Valeur Brute = "); Serial.println(vBat);
      int n = snprintf(vBatMessage, sizeof vBatMessage, "V%d", vBat);     // 'V' suivi de la tension échantillonnée brute
      if ((n > 0) && (n < tailleMax))                                     // si on a pu écrire correctement le message
        loraMessage(vBatMessage);                                         //   alors envoi du message
    }
    Pour info , je n'ai pas trouvé d'autres LEDs

    je n'ai pas remis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    delay(60) ; LoRa.end() ;
    delay(300); // necessary to stop LoRa modem
    car çà n'avait pas d'effet sur la valeur de la consommation

    En tout cas merci encore pour l'aide

  8. #28
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 714
    Points : 5 392
    Points
    5 392
    Par défaut
    je relisais votre code, la mask est faux (vous avez repris celui de cette discussion) mais il correspondait aux PIN13+PIN32+PIN33. Maintenant vous n'avez que 32 et 33 donc le masque est 0x300000000 et non pas 0x300002000

    j'ai donné un coup de nettoyage, essayez de mesurer la consommation avec ce code là - à la fois en veille et réveillé. (en pratique il ne faut pas que regarder l'intensité instantanée car vous consommerez plus au moment de l'envoi de données LORA)

    J'ai viré la bibliothèque OneButton puisqu'on ne s'en sert pas. ce sont les interruptions qui nous diront quel bouton a été appuyé

    J'ai changé la bande utilisée pour 866Mhz si vous êtes en Europe. 433MHz c'est si vous êtes en Asie.

    J'ai supposé que les 2 boutons (volet et porte) sont câblés entre la PIN et GND et donc nécessitent le pullup interne

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    /*************************************
                 EMETTEUR
    ************************************/
     
     
    /***************************************
                    carte TTGO LoRa32-OLED V1
     
                       /----------------\
                       |19            18|
                       |20            17|
                       |21            16|
                       |22            15|
                       |23            14|
                       |24            13|
                       |25            12|
                       |26            11|
                       |27            10|  GPIO35   vbatPin
      MISO     GPIO19  |28             9|  GPIO32   volet
                       |29             8|  GPI033   Porte
      SS       GPIO18  |30             7|
      SCK      GPIO05  |31             6|  GPIO26   DI0
      I2C_SCL  GPIO15  |32             5|  GPIO27   MOSI
                       |33             4|  GPIO14   RST
      I2C_SDA  GPIO04  |34             3|
                       |35             2|
      OLED_RST GPIO16  |36             1|
                       -----------------
     
    *************************************/
    #include <driver/rtc_io.h>
     
    #include <LoRa.h>
    #include <SPI.h>
     
    //Libraries for OLED Display
    #include "SSD1306Wire.h" // legacy: #include "SSD1306.h"
     
    // pins from https://randomnerdtutorials.com/ttgo-lora32-sx1276-arduino-ide/
    // LoRa definition
    #define SCK     5    // GPIO5  -- SX1278's SCK
    #define MISO    19   // GPIO19 -- SX1278's MISO
    #define MOSI    27   // GPIO27 -- SX1278's MOSI
    #define SS      18   // GPIO18 -- SX1278's CS
    #define RST     14   // GPIO14 -- SX1278's RESET
    #define DI0     26   // GPIO26 -- SX1278's IRQ(Interrupt Request)
    #define BAND 866E6   //433E6 for Asia, 866E6 for Europe and 915E6 for North America
     
     
    // OLED definition
     
    #define I2C_SDA                     4
    #define I2C_SCL                     15
    #define OLED_RST                    16
    SSD1306Wire display(0x3c, I2C_SDA, I2C_SCL);
     
    const gpio_num_t pinVolet  = GPIO_NUM_32; // RTC GPIO for ESP32: 0, 2, 4, 12-15, 25-27, 32-39;
    const gpio_num_t pinPorte  = GPIO_NUM_33;
    const gpio_num_t vbatPin   = GPIO_NUM_35;
     
    #define BUTTON_PIN_BITMASK (1ull << pinVolet) | (1ull << pinPorte) // 
    const uint64_t  uS_TO_S_FACTOR = 1000000ull; /* Conversion factor for micro seconds to seconds */
    const uint64_t  TIME_TO_SLEEP = 30ull; /* Time ESP32 will go to sleep (in seconds) */
     
    RTC_DATA_ATTR int bootCount = 0;
     
    //***********************************************
    void loraMessage(const char * message) {
      LoRa.beginPacket();
      LoRa.println(message);
      LoRa.endPacket();
    }
     
    //***********************************************
    void envoiVbatBrut() {
      const int tailleMax = 20; // y compris le '\0' de fin
      static char vBatMessage[tailleMax];                                 // doit être assez grand pour contenir le message
     
      int vBat = analogRead(vbatPin); // tension échantillonnée brute
      Serial.print("Valeur Brute = "); Serial.println(vBat);
     
      int n = snprintf(vBatMessage, sizeof vBatMessage, "V%d", vBat);     // 'V' suivi de la tension échantillonnée brute
      if ((n > 0) && (n < tailleMax))                                     // si on a pu écrire correctement le message
        loraMessage(vBatMessage);                                         //   alors envoi du message
    }
     
    //***********************************************
    void action() {
      esp_sleep_wakeup_cause_t source_reveil = esp_sleep_get_wakeup_cause();
      uint64_t GPIO_reason = esp_sleep_get_ext1_wakeup_status();
     
      switch (source_reveil) {
        case ESP_SLEEP_WAKEUP_TIMER :
          Serial.println("Réveil par un timer");
          envoiVbatBrut();
          break;
        default :
          Serial.print("Réveil pas causé par le Deep Sleep :");
          Serial.println(source_reveil);
          break;
      }
     
      if (GPIO_reason != 0) {
        const uint64_t gpioWakeUp = __builtin_ctzll(GPIO_reason); // __builtin_ctzll finds the position of the rightmost 1
        switch (gpioWakeUp) {
          case pinVolet: loraMessage("1"); break;
          case pinPorte: loraMessage("2"); break;
          default : Serial.println("Aucun GPIO connu n'a déclenché le réveil"); break;
        }
      }
    }
     
    //***********************************************
    void setup() {
      Serial.begin(115200);
      while (!Serial) yield();
     
      SPI.begin(SCK, MISO, MOSI, SS);
      LoRa.setPins(SS, RST, DI0);
     
      Serial.println("LoRa : Emetteur");
      if (!LoRa.begin(BAND)) { // LoRa_frequency
        Serial.println("Le lancement de LoRa a échoué !");
        while (true) yield();
      }
      Serial.println("init ok");
     
      display.init();
      display.flipScreenVertically();
      display.setFont(ArialMT_Plain_10);
      display.setTextAlignment(TEXT_ALIGN_CENTER);
      display.drawString(64, 22, "Emetteur: OK");
      display.display();
      delay(100);
      display.clear();
      display.display();
     
      //Increment boot number and print it every reboot
      ++bootCount;
      Serial.print("Boot number: ");  Serial.println(bootCount);
     
      action();
     
      // go back to sleep
      LoRa.end();
     
      esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK, ESP_EXT1_WAKEUP_ANY_HIGH);
      esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
     
      esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_AUTO);
      rtc_gpio_pullup_en(pinVolet);   //https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/sleep_modes.html#external-wakeup-ext1
      rtc_gpio_pullup_en(pinPorte);
      rtc_gpio_pulldown_dis(pinVolet);
      rtc_gpio_pulldown_dis(pinPorte);
     
      Serial.println("Going to sleep");
      Serial.flush(); // just for peace of mind, as esp_deep_sleep_start() will flush the contents of UART FIFOs
      esp_deep_sleep_start();
    }
     
    void loop() {}

    ça devrait compiler mais je n'ai pas votre carte donc je ne sais pas si ça fonctionne

  9. #29
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    Bonjour Jay M

    merci encore ...

    je relisais votre code, la mask est faux (vous avez repris celui de cette discussion) mais il correspondait aux PIN13+PIN32+PIN33. Maintenant vous n'avez que 32 et 33 donc le masque est 0x300000000 et non pas 0x300002000
    Oui effectivement, je l'ai vu aussi ce matin et je l'ai corrigé , j'ai eu un fol espoir car la consommation était retombée durant toute la mâtiné à 4,36mA mais çà n'a pas duré je recherche toujours la cause ...

    je teste le prg et je reviens vers vous

  10. #30
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    Désolé mais la valeur de l'intensité reste en base de : 11,36 mA
    je précise que je prends l'intensité directement sur la batterie
    toutefois, la mesure après RST est de 4,36 mA et passe ensuite à 11,36mA dès le 1er envoi soit par les boutons soit par test liaison
    puis reste à cette valeur

    J'ai également retiré la capa en // sur le pont de mesure de la tension batterie mais sans résultat
    tout semble donc démontrer que je n'éteins pas le LoRa
    pourtant il y a bien dans le setup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // go back to sleep
      LoRa.end();

  11. #31
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 714
    Points : 5 392
    Points
    5 392
    Par défaut
    comme au reset vous voyez une consommation basse qui ensuite augmente, il se peut que ce soit l'écran qui reste allumé. le SSD1306 a aussi un mode sleep activable par une commande spécifique (cf discussion https://github.com/adafruit/Adafruit_SSD1306/issues/106 et https://github.com/adafruit/Adafruit...ment-687494940) mais je ne sais pas si la bibliothèque que vous utilisez permet d'envoyer des commandes de bas niveau à l'écran

    EDIT: j'ai vu que la bibliothèque a une fonction displayOff() peut-être essayez de l'appeler avant d'endormir l'ESP32

  12. #32
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    J'ai tenté ceci :

    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
     
     
      sendCommand(0x8D); //into charger pump set mode
      sendCommand(0x10); //turn off charger pump
      sendCommand(0xAE); //set OLED sleep
     
    .../...
     
    void sendCommand(unsigned char command)
    {
      Wire.beginTransmission(0x3C); // oled adress
      Wire.write(0x80); // command mode
      Wire.write(command);
      Wire.endTransmission();
    }
    Je suis passé de : 11,36 mA à 10,68mA

    j'ai aussi trouvé ce lien sur le net :
    https://github.com/Heltec-Aaron-Lee/...eries/issues/6

    j'avoue ne pas avoir tout compris ....

  13. #33
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 714
    Points : 5 392
    Points
    5 392
    Par défaut
    ce n'est pas la même carte que vous, c'est la Heltech (j'en ai des comme ça) et on l'utilise avec d'autres bibliothèques


    essayez juste de mettre un juste après le

  14. #34
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    idem :

    après téléversement 3,68mA puis 10,68mA après le 1er envoi ...

    Comment puis-je faire pour forcer le WiFI et le Bluetooth en OFF ?

  15. #35
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    Bonjour à tous

    Après tout avoir essayé en software, j'ai toujours 10 mA durant le "deep-sleep" ce qui est incompatible avec
    une alimentation par batterie

    je pense mais je ne suis pas expert , qu'il y a un défaut sur la carte, le module CP2104 ( convertisseur USB ) ne semble pas
    être inhibé et reste donc alimenté par VCC3V3 ( voir schéma)
    ce qui entraine une consommation en base de quelques mA
    mais une confirmation de votre part s'impose ...
    Images attachées Images attachées

  16. #36
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 714
    Points : 5 392
    Points
    5 392
    Par défaut
    en lisant le web il y a plusieurs fois effectivement la mention qu'ils ne descendent pas sous 10mA avec cette carte

    Comment puis-je faire pour forcer le WiFI et le Bluetooth en OFF
    en mode deep sleep ils sont éteints (cf cet article par exemple)

    Nom : ESP32-Deep-Sleep-Functional-Block-Diagram.png
Affichages : 194
Taille : 16,2 Ko

  17. #37
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    Je vais essayer de me rabattre sur un autre type carte
    une suggestion ?

  18. #38
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Pour rester sur des cartes programmables via l'IDE Arduino :

    • Les Wireless Stick Lite (V3) et CubeCell – Dev-Board (V2) de chez Heltec
    • La FireBeetle + Lora cover de chez DFRobot
    • L'ESP32 Wroom Low Power DevKit de chez uPesy + LoRa Core1262 de chez Waveshare


    Pour l'écran un simple OLED branché en I2C fera l'affaire.

    Pensez à bien vérifier la fréquence du module LoRa (puisque vous ne nous avez toujours pas répondu à ce sujet).
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  19. #39
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    merci jerome pour les suggestions

    j'ai bien noté la fréquence et le fait que j'étais en 433Mhz
    toutefois j'ai déjà mon récepteur calé avec cette fréquence, je dois donc prendre la même pour l’appairer
    mais la prochaine fois promis je ferais attention

    pour les cartes, mon besoin émetteur est restreint 2 entrées + 1 mesure de niveau batterie
    je n'ai pas obligatoirement besoin de OLED
    mon choix porterait volontiers donc sur la carte FireBeetle + Lora cover de chez DFRobot ( courant en deep-sleep très faible)
    mais je ne saisi pas bien par contre l'utilité des broches au centre de la carte

    il me reste aussi un ESP32 WROVER-E , pourrai-je l'associer à un RA01 par ex ?

  20. #40
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par cobra38 Voir le message
    mon choix porterait volontiers donc sur la carte FireBeetle + Lora cover de chez DFRobot ( courant en deep-sleep très faible)
    mais je ne saisi pas bien par contre l'utilité des broches au centre de la carte
    Les trous permettent de router les broches CS (SPI) et RESET du module LoRa vers différentes broches de la carte FireBeetle. Pour correspondre aux exemples fournis, il faut souder un fil entre CS et D4 et entre RESET et D2 comme expliqué ici :

    https://wiki.dfrobot.com/FireBeetle_...L0121#target_3

    Citation Envoyé par cobra38 Voir le message
    il me reste aussi un ESP32 WROVER-E , pourrai-je l'associer à un RA01 par ex ?
    Oui mais encore une fois tout dépend de la consommation en veille profonde du module.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

Discussions similaires

  1. Comment améliorer la rotation à 45° d'une image dans un PictureBox
    Par ProgElecT dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 22/07/2006, 01h05
  2. Comment amèliorer ma demande d'emploi ?
    Par unix27 dans le forum Emploi
    Réponses: 19
    Dernier message: 29/03/2006, 13h55
  3. [Sécurité] Comment amélioré mon code ?
    Par Nadd dans le forum Langage
    Réponses: 14
    Dernier message: 03/03/2006, 20h13

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