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 :

Une durée de 10 minutes


Sujet :

Arduino

  1. #1
    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 Une durée de 10 minutes
    Bonjour à Tous ,

    Une petite question pratique svp :
    J'utilise la bibliothèque Lowpower.h pour mettre en sommeil durant environ 3x 8s = 24s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); //8s
    	LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); //8s
    	LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); //8s
    la consommation de la batterie ne me permet que de "tenir" 1 semaine
    je souhaite donc augmenter la durée du sommeil à 10mn au total au lie de 24s

    Comment puis-je faire ? j'imagine qu'il doit y avoir une autre manière de faire que de mettre 75 lignes identiques à la suite
    une simple boucle peut-être comme celle là?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     for (int i = 0; i < 75; i++) { // 600s de sommeil
         LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
     
       }

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    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 711
    Points : 5 390
    Points
    5 390
    Par défaut
    oui ça va fonctionner et vous aurez 75 période de sommeil

    la consommation de la batterie ne me permet que de "tenir" 1 semaine
    il faut regarder ce qui consomme: Que faites vous quand l'arduino se réveille et qui consomme du courant pendant que l'arduino dort ?

  3. #3
    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
    qui consomme du courant pendant que l'arduino dort ?
    Le module complet est composé :
    - Arduino Pro-Mini
    - NRF24L01
    - TP4056
    - DHT22
    La LED verte du PRO-MINI reste allumée et çà doit être la consommation la + importante
    je pense

    Que faites vous quand l'arduino se réveille
    Je transmets 3 mesures durant 2s
    - Température
    - Humidité
    - Niveau batterie

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    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 711
    Points : 5 390
    Points
    5 390
    Par défaut
    vous coupez le courant sur la NRF24L01 et la DHT22 en sommeil?

    il faut effectivement virer la LED verte du PRO-MINI si vous voulez faire des économies.

    Une alternative car elle est liée aussi à l'activité SPI serait de désactiver le SPI et la pin pendant la phase de sommeil, puis remettre tout en place au réveil.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      // avant de dormir
      byte etatSPI = SPCR;
      SPCR = 0;
      digitalWrite(13,LOW);
     
      // on dort
      ...
     
      // au réveil, on remet l'état
      SPCR = etatSPI;

    ----

    avez vous testé la durée de vie si vous ne mettez pas l'Arduino en sommeil?

  5. #5
    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 Jay M

    avez vous testé la durée de vie si vous ne mettez pas l'Arduino en sommeil?
    Non pas encore , çà fait maintenant 1 an que le module tourne avec une recharge hebdomadaire avec une batterie de 600mAh
    et un temps de repos de 24s
    pour 24h de fonctionnement =>86400s/24s = 3600 fois
    je vide ma batterie en 6 jours env
    3600 x 6 = 21600 fois
    sachant que la capacité max à 70% = 600 x 0,7 = 420 mA soit 19µA
    mais j'ai du certainement me tromper dans les calculs semble-t-il

    Pour info : le croquis fait 30 envois d'information avant de dormir

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    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 711
    Points : 5 390
    Points
    5 390
    Par défaut
    ça vaudrait le coup de tester la consommation sans la mise en sommeil si c'est la seule économie d'énergie.

  7. #7
    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

    ça vaudrait le coup de tester la consommation sans la mise en sommeil si c'est la seule économie d'énergie.
    effectivement j'aurai du commencer par là ...

    Par ailleurs, j'ai eu lors de mes essais de temps, un petit souci que j'ai découvert à savoir
    que je ne pouvais pas augmenter à loisir le temps de repos car le module récepteur avait lui une période de scrutation de 5 mn
    si je dépasse la période de scrutation du récepteur je perds la mesure car il considère que l’émetteur est absent
    je mets en copie le croquis du récepteur , pouvez-vous m'indiquer quelle serait la meilleure solution pour résoudre ce problème svp ?
    actuellement j'ai modifié l'émetteur jusqu'à 4 mn et çà semble fonctionner au delà je perds les mesures ....

    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
     
    //******************************************************************************
    // SENSOR_FN.ino
    //******************************************************************************
     
     
    //=======================================================
    #ifdef nrf 
    //=======================================================
     
      void do_read_ulica()  //<====  module déporté
      {
        static uint32_t t_fn=0;
        byte pipeNo;
        if (millis()-period_ulica<600000&&period_ulica!=0) // 10 mn
        {
          return; 
        }
     
        if (millis()-t_fn<1000) 
        {
        return; 
        }
        t_fn=millis();
        if (millis()-period_ulica>300000) // 5 mn
        temp_u=200;
        ref_temp_u=false;
        Serial.println("read ulica");
        if ( radio.available(&pipeNo)) // Non-blocking
        {
          uint8_t buff[32];
          uint8_t len = sizeof(buff);
          int i;  
          radio.read( &buff, sizeof(buff) ); 
          String strth= (const char*) buff;
          Serial.println(strth);
          ////////////////////////l'identification du paquet
          if (strth.substring(0,6)=="25UTH;")
          {
            if (strth.indexOf(";",7)!=9&& strth.indexOf(";",10)!=13)
            {
              Serial.println(F("erreur d'analyse"));
              delay(500);
            }else{
              Serial.print(F("ulica="));
              Serial.println(strth);
              //ppppp
              String sth=strth.substring(6,9); //3 simv 
              if (sth.toInt()>150&&sth.toInt()<260)
              {
                if (temp_u!= sth.toInt()-200) 
                ref_temp_u=true;    
                temp_u=sth.toInt()-200;
                period_ulica=millis();
                if (log_file)
                {
                  log_str="nrf24 do_read_ulica temp_u="+String(temp_u);
                  do_log();  
                }
              }
            }
          }
        } 
     }
     
    #endif
     
     
    //================================================================
    #ifdef dht22
    //================================================================
      void do_read_dht()
      { 
        static time_t t_period_dht=0; 
        delay(dht.getMinimumSamplingPeriod());
        if (millis()<t_period_dht&&temp_kv!=200) return; //5min
     
        // Reading temperature or humidity takes about 250 milliseconds!
        // Les relevés des capteurs peuvent également être vieux de 2 secondes (c'est un capteur très lent)
        float hum = dht.getHumidity();
        float temp= dht.getTemperature();
        float correction = 3 ;
        temp_kv=(round(temp)-correction);
        h_kv=round(hum);
        // Check if any reads failed and exit early (to try again).
        if (isnan(temp_kv) || isnan(h_kv))  {
        Serial.println("Impossible de lire la sonde DHT!");
        return;
        }
     
        #ifdef debug  
        float hic = dht.computeHeatIndex(temp_kv, h_kv, false);
        Serial.print("Humidite: ");
        Serial.println(h_kv);
        Serial.print("Temperature: ");
        Serial.println(temp_kv-4);
        Serial.print("Heat index: ");
        Serial.println(hic);
        #endif debug
     
        if (temp_kv<-50||temp_kv>70) 
        {
          if (log_file)
          {
            log_str="DHT22 ERR temp_kv="+String(temp_kv);
            do_log();  
          }
        temp_kv=200;
        }
     
        if (h_kv<0||h_kv>100)  
        {
          if (log_file)
          {
          log_str="DHT22 ERR H="+String(h_kv);
          do_log();  
          }
        h_kv=200;
        }
     
        if (temp_kv!=200) 
        {
        ref_kv_th=true;
        t_period_dht=millis()+t_dht_ref*200; //5min
        }
     
      }
    #endif

  8. #8
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    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 711
    Points : 5 390
    Points
    5 390
    Par défaut
    votre première fonction do_read_ulica()commence comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      if (millis() - period_ulica < 600000 && period_ulica != 0) // 10 mn 
        return;
      }
     
      if (millis() - t_fn < 1000)
      {
        return;
      }
    donc si period_ulica est non nulle (faudrait commencer par tester cela d'abord au lieu de faire le calcul avec millis, ce serait plus efficace) et qu'il est écoulé moins de 10 minutes la fonction ne fait rien. idem s'il s'est écoulé moins d'une seconde depuis t_fn alors qu'un message peut-être dans le buffer de réception

    Ensuite seulement vous testez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if (millis() - period_ulica > 300000) // 5 mn
    si 5 minutes se sont écoulées et dans ce cas vous regardez si un message radio est disponible.


    la question à se poser c'est à quoi servent tous ces tests puisque la fonction n'indique rien en retour.

    Moi je testerais à chaque appel la présence d'un message, si oui je mets à jour une variable temporelle de dernier message reçu. je modifierais aussi la fonction pour qu'elle dise à l'appelant ce qu'il se passe.

    Ce serait quelque chose comme cela (tapé à la volée ici donc il y a peut être des fautes, mais c'est le principe)

    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
    enum t_etat : byte {MESSAGE_RECU, SIGNAL_PERDU, RIEN_DE_NEUF}; // il faut que l'appelant connaisse aussi cet enum pour connaître les types, donc voir les .h et .cpp si vous ne faites pas des .ino
    t_etat do_read_ulica() { //<====  module déporté
      const uint32_t dureeMaxSansSignal = 60000ul;  // après 10 minutes sans message radio on considère qu'on a perdu le signal
      static uint32_t dernierSignal = millis();
      t_etat etat = RIEN_DE_NEUF;
      byte pipeNo;
     
      // détection du Signal
      if ( radio.available(&pipeNo)) {
        // traiter le message
        // éventuellement en utilisant dernierSignal 
        // ==> s'il est trop récent ne pas mettre dans le log
     
        ...
     
        etat = MESSAGE_RECU;
        dernierSignal = millis();
      }
     
      // détection de la perte de signal
      if (millis() - dernierSignal >= dureeMaxSansSignal) {
        etat = SIGNAL_PERDU;
      }
     
      // on retourne notre état
      return etat;
    }

  9. #9
    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 Jay M pour vos réponses

    Je vais essayer de refaire mon appel .ino
    mais j'ai actuellement un petit souci que je découvre
    à savoir que mon croquis ne se compile plus (?)

    j'ai une erreur obsolète sur : http.begin(url)

    j'ai soupçonné la version ESP8266 et donc repassé de la version 3.0.2 à la version 2.7.4
    mais désormais si je n'ai plus d'erreur sur cela mais le croquis ne se compile pas et je ne trouve pas l'erreur

    "Erreur de compilation pour la carte LOLIN(WEMOS) D1 R2 & mini"
    je précise que la compilation s'effectue sans raccordement USB

  10. #10
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    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 711
    Points : 5 390
    Points
    5 390
    Par défaut
    l'API a évolué maintenant c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http.begin(WiFiClient, url)
    il faut faire un code qui ressemble à cela:

    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
    #include <WiFiClient.h>
    WiFiClient wifiClient;
     
     
    void requete(const char * uri) {
      HTTPClient http;
      http.begin(wifiClient, uri);
      int httpCode = http.GET();
      if (httpCode > 0) {
        String response = http.getString();
        http.end();
        if (httpCode != 200) {      // erreur
          Serial.println(response);
          return;  
        }
        ...
    }

  11. #11
    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 Jay M

    c'est bien noté
    il faut que je repasse quand même ESP32 en version 3.0.2 préalablement je suppose ?

  12. #12
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    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 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Je ne suis plus trop sûr de quand ça a changé…

Discussions similaires

  1. Réponses: 29
    Dernier message: 14/11/2017, 19h29
  2. Convertir une durée en minute avec datetime.timedelta
    Par www.rubis dans le forum Général Python
    Réponses: 4
    Dernier message: 13/05/2016, 14h18
  3. [MySQL] Calculer la somme d'une durée sous la forme Heure:Minute:Seconde
    Par radhwene dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 23/06/2007, 10h49
  4. Formatage d'une durée en heure:minute
    Par FlyByck dans le forum Langage
    Réponses: 3
    Dernier message: 15/09/2006, 21h43
  5. Formater une durée sous la forme Heure:Minute:Seconde
    Par marsupile dans le forum C++Builder
    Réponses: 2
    Dernier message: 31/01/2004, 23h29

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