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 :

Probleme de Busy Timeout


Sujet :

Arduino

  1. #1
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 144
    Par défaut Probleme de Busy Timeout
    Bonjour à tous

    j'aurai besoin de votre aide car je n'arrive à régler mon problème de <<Busy Timeout!>>

    mon projet se compose en autres de 2 capteurs VL50L0x permettant de me donner une position "ouverte" "fermée" de 2 panneaux de toit distincts

    Panneau 1 => P1 = 0 panneau fermé et P1 = 1 panneau ouvert
    panneau 2 => P2 = 0 panneau fermé et P1 = 1 panneau ouvert

    un ESP32 Lilygo T5 E-paper me permet d'afficher la position des panneaux à chaque redémarrage du programme toutes les 5 secondes
    le rafraichissement de l'ecran s'effectue que si les panneaux ont été préalablement deplacés

    le programme me permet aussi de réveiller l'ESP32 ( GPIO_33 ) par une heure d'alarme journalière calculée à partir d'un éphéméride,
    cette alarme est active que si les panneaux sont ouverts
    en résumé, je reveille l'ESP32 :
    - tous les jours par une interruption GPIO-33 si les panneaux sont ouverts
    - toutes les 5 secondes donc par minuterie mais je ne rafraichis l'écran que si nécessaire
    le problème étant que je vois apparaitre <<Busy Timeout!>> toutes les 10 secondes sans que je puisse en déterminer la raison
    voici ci-dessous le resutat à la console

    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
    16:11:51.333 -> Capteurs activées...
    16:11:51.607 -> VL53L0X 1 = OK
    16:11:52.170 -> VL53L0X 2 = OK
    16:11:52.170 ->  RTC = OK
    16:11:52.170 -> Réveil provoqué par la minuterie
    16:11:52.170 -> 08/06/2026
    16:11:52.208 -> -----------
    16:11:52.208 -> 16:09:56
    16:11:52.208 -> -----------
    16:11:52.208 -> Panneau N°1 => - Ouvert
    16:11:52.208 -> Panneau N°2 => - Fermé
    16:11:52.254 -> 
    16:11:52.254 -> -----------
    16:11:52.254 -> Pas de Changement
    16:11:52.254 -> -----------
    16:11:52.432 -> Voltage = 4.02
    16:11:52.471 -> Lever : 03:51:34
    16:11:52.471 -> Meridien : 11:37:58
    16:11:52.471 -> Coucher : 19:24:42
    16:12:02.509 -> Busy Timeout!  <===================
    16:12:12.484 -> Busy Timeout!  <===================
    16:12:22.507 -> Busy Timeout!  <===================
    16:12:32.487 -> Busy Timeout!  <===================
    16:12:32.487 -> [ Alarme 1: 08 21:24:42, Mode: Date ]
    16:12:32.487 -> --------------------
    16:12:32.487 -> Boot number: 56
    16:12:32.532 -> --------------------
    et le programme (sans les sous-prog affichage et epehemride ) :

    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
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
     
    //----------------------------------------------------------------------
    //                        Lilygo T5 ESP32 E-paper
    //  
    //                        ===============    
    //                  3.3V -|             |- 
    //                  GND -|             |- 
    //             SDA  21 -|             |- 
    //                         -|             |-
    //                         -|             |- 3.3V
    //             SCL  22 -|             |- 32  Alarme
    //                         -|             |- 33  SQW DS3231
    //  VL53L0X 1   14 -|             |- 25  Panneau 2
    //                         -|             |- 26  Panneau 1
    //  VL53L0X 2   15 -|             |- 27  LDR
    //                         -|             |- 
    //                    5V -|             |- 
    //                VBAT -|             |- GND
    //                        ===============
    //
    // I2C device found at address 0x30  !
    // I2C device found at address 0x31  !
    // I2C device found at address 0x38  !
    // I2C device found at address 0x57  !
    // I2C device found at address 0x68  !
    //
    //   Tension VBAT   35
    //   VERANDA_V260608a : 
    //-----------------------------------------------------------------------							
     
    /**** Branchements *****************************************************/ 
    #define pinAlarm             32                   //* Alarme */
    #define pinP1                25                   //* Panneau 1 ouvert */
    #define pinP2                26                   //* Panneau 2 ouvert /*
     
    /********************************************************************/
    #include <SPI.h>
    #include "RTClib.h"
    #include "driver/rtc_io.h"
    #include <Wire.h>
    #include <time.h>
    #include <Adafruit_AHTX0.h>
    #include <Adafruit_Sensor.h>
    #include "Adafruit_VL53L0X.h"
    #include <GxEPD2_BW.h>
    #include <U8g2_for_Adafruit_GFX.h>
    #include <Adafruit_NeoPixel.h>
    #include "ephemeride.h"
    #include "affichage.h"
    /*********************************************************************/
     
    /******* Declarations ************************************************/
     
    //------------------ AHT10  ---------------------------
    Adafruit_AHTX0 aht; // I2C device found at address 0x38
    //------------------ NeoPixel  ---------------------------
    #define NUMPIXELS 10 // Popular NeoPixel ring size
    #define DELAYVAL 200 // Time (in milliseconds) to pause between pixels
    Adafruit_NeoPixel pixels(NUMPIXELS, pinAlarm , NEO_GRB + NEO_KHZ800);
    // ------------Capteurs vl53l0x..............................
    #define pinLOX1  14                  //* Capteur 1           */
    #define pinLOX2  15                  //* Capteur 2           */
    #define LOX1_ADDRESS         0x31               //* Adresse I2C : 0x31  */
    #define LOX2_ADDRESS         0x30               //* Adresse I2C : 0x30  */
    #define maxDistance          100                //* distance max 100 mm */
    Adafruit_VL53L0X LOX1      = Adafruit_VL53L0X();
    Adafruit_VL53L0X LOX2      = Adafruit_VL53L0X();
    VL53L0X_RangingMeasurementData_t measure1;
    VL53L0X_RangingMeasurementData_t measure2;
    //-------------- Mesure Batterie...............................
    #define pinVb                35                  //* mesure BATT                                
    #define VccMin               3.2                 //* Niveau minimum attendu de BAT, en Volts    
    #define VccMax               4.2                 //* Niveau maximum attendu de BAT, en Volts    
    const float voltage        = 0.0 ;
    uint8_t percentage         = 0.0 ;
    //---------------- DS3231 ---------------------------------------
    // Définir la broche d'interruption du DS3231 (qui réveillera l'ESP32)
    #define CLOCK_INTERRUPT_PIN   GPIO_NUM_33 
    // --------------sauvegarde variables --------------------------
    RTC_DATA_ATTR bool premier_demarrage = true;
    RTC_DATA_ATTR int bootCount = 0;
    RTC_DATA_ATTR bool exP1 = 0;
    RTC_DATA_ATTR bool exP2 = 0;
    // -----Instance pour le RTC -----------------------------------
    RTC_DS3231 rtc;
    DateTime alarm1Time = DateTime(0, 0, 0, 0, 0, 0);
    // -----Variables ----------------------------------------------
    bool P1                    = 0;  // 0: ferme, 1: ouvert
    bool P2                    = 0;  // 0: ferme, 1: ouvert
    bool change                = 0;
    int pp                     = 0;
    int tt                     = 0;
    int hh                     = 0;
    bool n1                    = 0;
    bool n2                    = 0;
    int  valarme               = 0;
    bool vVCC                  = false;
     
    float AHT_Temp = 0 ;
    float AHT_Humidite = 0;
    int jour;
    int mois;
    int annee;
    int heure;
    int minute;
    int seconde;
    char alarm1Date[12] = "DD hh:mm:ss";
    String(affichalarme);
    String(affichmode);
     
    // ------- Données Géographiques --------------------------------
    double latitude_nord = 45.6590039;
    double longitude_ouest = -5.278757777777778;
    double lever, meridien, coucher;
     
    /*************************************************/
    long SleepDuration = 10; // Temps de sommeil en minutes, aligné sur la limite de la minute la plus proche, donc si 30, la mise à jour se fera toujours à 00 ou 30 heures passées.
    int  WakeupHour    = 7;  // Ne pas se réveiller avant 07h00 pour économiser la batterie
    int  SleepHour     = 23; // Mise en veille après (23+1) 00:00 pour économiser la batterie
    int  CurrentHour = 0, CurrentMin = 0, CurrentSec = 0;
    long StartTime = 0;
    /*************************************************/
     
    /***************************************************************/
    /*               SETUP                                         */
    /***************************************************************/
    void setup() 
    {
       StartTime = millis();
       Serial.begin(115200);
       delay(500);
       pinMode(pinAlarm, OUTPUT);                    // Sortie Alarme
       pinMode(pinLOX1, OUTPUT);                     // Sortie LOX1  
       pinMode(pinLOX2, OUTPUT);                     // Sortie LOX2
       pinMode(pinP1, OUTPUT);                       // Sortie Panneau 1 Ouvert
       pinMode(pinP2, OUTPUT);                       // Sortie Panneau 2 Ouvert
     
      // Capteurs Proximités activés 
       Serial.println(F("Capteurs activées..."));
       digitalWrite(pinLOX1, LOW);
       digitalWrite(pinLOX2, LOW);
       setID();
     
      esp_sleep_enable_timer_wakeup(5000000ULL); // 5 secondes
     
      // Initialiser le RTC
      if(!rtc.begin()) {
        Serial.println("Impossible de trouver RTC!");
        Serial.flush();
        while (1) delay(10);
      }else{
          Serial.println(F(" RTC = OK"));
      }  
      // Initialiser le AHT10
      /*
      if (! aht.begin()) {
        Serial.println("Impossible de trouver l'AHT ? Vérifier le câblage");
        while (1) delay(10);
      }else{
        Serial.println(F(" AHT10 = OK"));
      }	
      */
     
       char texte[80];
       print_wakeup_reason(); //Imprime le motif de réveil de l'ESP32
     
      // Clignotement de la LED lorsque l'ESP32 se réveille
      //pinMode (pinAlarm, OUTPUT);
      //digitalWrite(pinAlarm, HIGH);
      //delay(1000);
      //digitalWrite(pinAlarm, LOW);
     
     
     
      // Init Date -------------------------------  
      DateTime maintenant = rtc.now();  // on lit la date actuelle
      // s'il y a eu déclenchement d'alarme on ajoute 1 jour à la date en cours et enlève l'alarme
      if (rtc.alarmFired(1)==true) {
        rtc.clearAlarm(1);
        maintenant = maintenant + TimeSpan(1,0,0,0); // On ajoute 1 jour à la date en cours
        Serial.println(" -Alarme réactualisée-");
      }
     
      // On calcule la Date du Jour -------------
      double lever, meridien, coucher;
      jour = maintenant.day();
      mois = maintenant.month();
      annee = maintenant.year();
      afficherDate(jour,mois,annee);  
      Serial.println("\n-----------");
       // On calcule l'heure UTC 
      heure  = maintenant.hour();
      minute = maintenant.minute();
      seconde = maintenant.second();
      char buf[9];
      sprintf(buf, "%02d:%02d:%02d", heure, minute,seconde );
      afficherHeure(heure,minute,seconde);  // affichage date du jour
      Serial.println("\n-----------");
     
      // Lecture Position des panneaux
      ReadPanels();
      change = premier_demarrage || (P1 != exP1) || (P2!= exP2);
      Serial.println("\n-----------");
         if(change) Serial.print(F("Changement- OK! ")); else Serial.print(F("Pas de Changement"));
      Serial.println("\n-----------");
      // Lecture Tension batterie
      tensionbatterie();
      // Lecture AHT10
      //Temp_Hum_Section();
     
      /* --- Décommenter si besoin de définir l'heure du RTC ----*/
      //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      //rtc.adjust(DateTime(2026, 6, 8,13, 07, 00)); // Attention mettre à l'heure UTC
      /*-------------------------------------------------------------------*/
     
      rtc.disable32K();   // Désactiver la broche 32K
      rtc.writeSqwPinMode(DS3231_OFF);
      rtc.disableAlarm(2);
     
       // L'alarme déclenche une interruption
      pinMode(CLOCK_INTERRUPT_PIN, INPUT_PULLUP);
      attachInterrupt(digitalPinToInterrupt(CLOCK_INTERRUPT_PIN), onAlarm, FALLING);
     
     
     
      /* Mettre l'alarme 1 à jour en fonction de l'ephemeride */
      if(!rtc.setAlarm1(alarm1Time, DS3231_A1_Date)) {  // ce mode déclenche l'alarme lorsque la date et heure correspondantes
            Serial.println("Erreur, l'alarme n'a pas été réglée!");
      }else {
          //testerEphemeride(jour,mois,annee, 1, -5, 16, 43, 45, 39, 32); // Lat : 45.6590039 & Long : 5.278757777777778  => Lat : N 45 39 32.414 & Long : E 5 16 43
          //calculerEphemeride(jour,mois,annee, 1, -5, 16, 43, 45, 39, 32); // Lat : 45.6590039 & Long : 5.278757777777778  => Lat : N 45 39 32.414 & Long : E 5 16 43
          calculerEphemeride(jour, mois, annee, longitude_ouest, latitude_nord, &lever, &meridien, &coucher);
          Serial.print("Lever : ");
          afficherHeureJulienne(lever);
          Serial.print("Meridien : ");
          afficherHeureJulienne(meridien);
          Serial.print("Coucher : ");
          afficherHeureJulienne(coucher); 
          full_sreeen();
          //display.display(false); // Full screen update mode 
      }
     
      programmerAlarme(annee, mois, jour, coucher); 
      checkDate(); 
     
     
      // Affichage  
      if (change) {
        exP1 = P1;
        exP2 = P2;  
        premier_demarrage = false;
        InitialiseDisplay();  //<====
        Draw_Heading_Section(); // <====== 
        DrawBattery(190, 12);  //  <====== 
        DrawPanneaux(5, 15);   //  <======
        Draw_Temp_Hum_Section(192,15); // <====== 
        DisplayAstronomySection(10, 10); // affichage E-Paper
      }
     
      // Mettre l'alarme 1, 2 à false (donc l'alarme 1, 2 ne s'est pas produite jusqu'à présent)
      // si ce n'est pas fait, cela conduit facilement à des problèmes, car les deux registres ne sont pas réinitialisés au redémarrage/recompilation.
      rtc.clearAlarm(1);
      rtc.clearAlarm(2);
     
      // Incrémente le numéro de démarrage et l'imprime à chaque redémarrage
      ++bootCount;
      Serial.println("--------------------");
      Serial.println("Boot number: " + String(bootCount));
      Serial.println("--------------------");
     
      // Configuration du réveil externe
      // esp_sleep_enable_ext0_wakeup(CLOCK_INTERRUPT_PIN, 0);  //1 = Haut, 0 = Bas
      // Configurer le pullup/down via RTCIO pour lier les broches de réveil à un niveau inactif pendant le sommeil profond.
      // La broche SQW du RTC est active à un niveau bas.
      rtc_gpio_pulldown_dis(CLOCK_INTERRUPT_PIN);
      rtc_gpio_pullup_en(CLOCK_INTERRUPT_PIN); 
     
      //S'endormir maintenant jusqu'à ce qu'une alarme se déclenche
      // Serial.println("Going to sleep now");
      esp_deep_sleep_start();  
      //BeginSleep();
    }
     
    /***************************************************************/
    /*               LOOP                                          */
    /***************************************************************/
    void loop() {}
     
    //#########################################################################################
    void BeginSleep() {
      powerOff();
      long SleepTimer = (SleepDuration * 60 - ((CurrentMin % SleepDuration) * 60 + CurrentSec)); //Certaines ESP32 sont trop rapides pour maintenir une heure précise
      esp_sleep_enable_timer_wakeup((SleepTimer + 20) * 1000000LL); // Ajout de +20 secondes pour couvrir les imprécisions de la source du timer RTC de l'ESP32
     
      Serial.println("Entering " + String(SleepTimer) + "-secs of sleep time");
      Serial.println("Awake for : " + String((millis() - StartTime) / 1000.0, 3) + "-secs");
      Serial.println("Starting deep-sleep period...");
      esp_deep_sleep_start();  // Sleep for e.g. 30 minutes
    }
     
    //#########################################################################################
    // Méthode permettant d'imprimer la raison pour laquelle l'ESP32 a été réveillé de son sommeil
    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 causé 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 la minuterie"); break;
        case ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println("Réveil provoqué par le pavé tactile"); 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", wakeup_reason); break;
      }
    }
     
    //#########################################################################################
    void programmerAlarme(int annee, int mois, int jour, double heureJulienne) {
     
      // on calcule l'heure, minute et seconde comme dans le code de bricoleau
      // dans sa fonction afficherHeure() en modifiant éventuellement le jour
      int h, m, s;
      double d = heureJulienne + 0.5;
     
      if (d < 0.0) {
        jour -= 1;
        d += 1.0;
      } else if (d >= 1.0) {
        jour += 1;
        d -= 1.0;
      }
     
      h = d * 24.0;
      d -= (double) h / 24.0;
      m = d * 1440.0;
      d -= (double) m / 1440.0;
      s = d * 86400.0 + 0.5;
      h= h + 2 ; // <=== correction UTC + 2
     
      DateTime alarme(annee, mois, jour, h, m, s); // puis on fabrique un DateTime avec ces infos
      rtc.setAlarm1(alarme, DS3231_A1_Date); // qu'on utilise pour armer l'alarme1 du DS3231 en mode date+heure exacte
      //rtc.enableAlarm(DS3231_ALARM_1);
    }
     
     
    //#########################################################################################
    void checkDate()
    {
        DateTime alarm1Time = rtc.getAlarm1();
        Ds3231Alarm1Mode alarm1mode = rtc.getAlarm1Mode();
        //char alarm1Date[12] = "DD hh:mm:ss";
        alarm1Time.toString(alarm1Date);
        Serial.print("[ Alarme 1: ");
        Serial.print(alarm1Date);
        Serial.print(", Mode: ");
        switch (alarm1mode) {
          case DS3231_A1_PerSecond:
            Serial.println("PerSecond ]");
            affichmode = "Par Seconde";
            break;
          case DS3231_A1_Second:
            Serial.println("Second ]");
            affichmode = "Seconde";
            break;
          case DS3231_A1_Minute:
            Serial.println("Minute ]");
            affichmode = "Minute";
            break;
          case DS3231_A1_Hour:
            Serial.println("Hour ]");
             affichmode = "Heure";
            break;
          case DS3231_A1_Date:
            Serial.println("Date ]");
             affichmode = "Date";
            break;
          case DS3231_A1_Day:
            Serial.println("Day ]");
             affichmode = "Jour";
            break;
        }
        //affichalarme = alarm1Date;
        affichalarme = "Alarme => ";
        affichalarme += alarm1Date;
        affichalarme += " - En Mode: ";
        affichalarme += affichmode;
        affichalarme +=  " ";
        Serial.print("");
    }
     
     
    //#########################################################################################
    void onAlarm(){
      Serial.print("Une alarme s'est produite!");
     
    }
     
    /*****************************************************************/
    void tensionbatterie() {
      float v_mes = analogRead(pinVb);
      delay(200);
      //float voltage = 1.435*(v_mes/4095)*3.3;
      float voltage = 2*(v_mes/4095)*3.3;
      Serial.println("Voltage = " + String(voltage));
      percentage = 2836.9625 * pow(voltage, 4) - 43987.4889 * pow(voltage, 3) + 255233.8134 * pow(voltage, 2) - 656689.7123 * voltage + 632041.7303;
      if (voltage >= 4.20) percentage = 100;
      if (voltage <= 3.20) percentage = 0 ;
     
    }
     
    /*******************************************************************/
    void Temp_Hum_Section() {
      sensors_event_t humidity, temp;
      aht.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
      AHT_Temp = temp.temperature;
      AHT_Humidite = humidity.relative_humidity;
      Serial.print("Temperature: "); Serial.print(temp.temperature,1); Serial.println(" degrees C");
      Serial.print("Humidity: "); Serial.print(humidity.relative_humidity,0); Serial.println("% rH");
     
    } 
     
    /*****Initialiser les capteurs VL53L0X *********************/
    void setID() {
      // tout est remis à zéro
       digitalWrite(pinLOX1, LOW);                   
       digitalWrite(pinLOX2, LOW);
       delay(20);
     
       // initialisation LOX1........................
       digitalWrite(pinLOX1, HIGH);
       delay(30);
       if(! LOX1.begin(LOX1_ADDRESS)) {
          Serial.println(F("Echec init VL53L0X 1"));
          while(1);
        }else{
          Serial.println(F("VL53L0X 1 = OK"));
        }
        // initialisation LOX2........................
       digitalWrite(pinLOX2, HIGH);
       delay(30);
       if(! LOX2.begin(LOX2_ADDRESS)) {
          Serial.println(F("Echec init VL53L0X 2"));
          while(1);
       }else{
          Serial.println(F("VL53L0X 2 = OK"));
       }
    }
     
     
     
    /***************** PANNEAUX ********************************/
    void ReadPanels() {  
     
       // Capteur1 en lecture........P1 = 1 si panneau n°1 ouvert................
       Serial.print(F("Panneau N°1 => "));
       LOX1.rangingTest(&measure1, false);    // 'true' pour avoir les données de débogage
       P1 = (measure1.RangeMilliMeter >  maxDistance); 
       //Serial.print(P1);
       if(P1) Serial.print(F("- Ouvert")); else Serial.print(F("- Fermé"));
       Serial.println();
     
       // Capteur2 en lecture...P2 = 1 si panneau n°2 ouvert.....................
       Serial.print(F("Panneau N°2 => "));
       LOX2.rangingTest(&measure2, false);  // 'true' pour avoir les données de débogage
       P2 = (measure2.RangeMilliMeter >  maxDistance);
       if(P2) Serial.print(F("- Ouvert")); else Serial.print(F("- Fermé"));
       Serial.println();
     
       // Affichage LEDS 
         if (P1 != 0) digitalWrite(pinP1 , HIGH); else digitalWrite(pinP1 , LOW);
         if (P2 != 0) digitalWrite(pinP2 , HIGH); else digitalWrite(pinP2 , LOW);
     
    }
     
    /******** Traitement Alarme ******************************/
    void alarme() { 
     
       Serial.print(F("Alarme: "));    Serial.print(valarme);      Serial.println();
     
       /*
       for(int i=0; i<NUMPIXELS; i++) 
    	 { // For each pixel...
           
           if (valarme==1){
              pixels.setPixelColor(i, pixels.Color(255, 0, 255)); // Sombre = VIOLET
           }
           if (valarme==2){
              pixels.setPixelColor(i, pixels.Color(255, 0, 0)); // Pluie = ROUGE
           }   
           if (valarme==3){
              pixels.setPixelColor(i, pixels.Color(0, 255, 0)); // Batterie = VERT
           }
            
            pixels.show();   // Envoyez les couleurs de pixel mises à jour au matériel.
            delay(DELAYVAL); // Pause avant le passage suivant dans la boucle
            pixels.setPixelColor(i, pixels.Color(0, 0, 0));
            pixels.show(); 
       }
       */
    }
     
    /*** Alarme OFF *****************************************/
    void alarmeOFF() { 
        /*
        pixels.clear();
    	  pixels.show(); 
        digitalWrite(pinP1 , LOW);
        digitalWrite(pinP2 , LOW);
    	  valarme = 0;
        */
    }

    je precise que le choix de reveiller toutes 5 secondes l'ESP32 pour rafrachir si besoin l'ecran, a été fait car la gestion de l'interruption des capteurs par le programme est très compliquéeà mettre en oeuvre
    pendant le sommeil les capteurs ne sont plus alimentés par le RTC , une bibliothèque spécale doit être utilsée et je n'y suis pas arrivé , j'ai donc choisi une autre approche peu gourmande en energie

    merci de m'avoir lu

    pascal

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 759
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 759
    Par défaut
    Ce que l'on peut a priori dire c'est que ça se passe entre la ligne 238 et la ligne 266.
    Comme on est dans le cas "Pas de changement", ça ne peut pas être les appels de fonctions d'affichage du bloc if(change) et comme le checkDate fonctionne, ça nous laisse ces 3 appels:
    afficherHeureJulienne(coucher);
    full_sreeen();
    programmerAlarme(annee, mois, jour, coucher);

    Il y a une issue a priori similaire sur le github https://github.com/G6EJD/ESP32-e-Pap...play/issues/70
    Soit un problème de timing au niveau de la commande de l'écran
    soit un écran "mal étiqueté" donc configuration à ajusté (dernière réponse de l'issue)

    Le "busy timeout" apparait uniquement quand il n'y a pas de changement détecté ou même si un changement a été détecté?

  3. #3
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 144
    Par défaut
    Merci umfred pour la réponse
    je vais regarder çà de plus près

    la logique serait que je puisse distinguer au mieux dans le programme
    ce qui change vraiment en effet, l'alarme ne se calcule qu'une fois par jour et balayer le traitement cela tous les 10 secondes semble à priori inutile

  4. #4
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 144
    Par défaut
    j'ai modifié le programme sur ton conseil umfred et supprimé l'appel aux calculs pour affichage des données d'heure de lever, de méridien et de coucher
    le résultat semble nettement meilleur

    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
     
    /* Mettre l'alarme 1 à jour en fonction de l'ephemeride */
      if(!rtc.setAlarm1(alarm1Time, DS3231_A1_Date)) {  // ce mode déclenche l'alarme lorsque la date et heure correspondantes
            Serial.println("Erreur, l'alarme n'a pas été réglée!");
      }else {
          calculerEphemeride(jour, mois, annee, longitude_ouest, latitude_nord, &lever, &meridien, &coucher);
          /*
              Serial.print("Lever : ");
              afficherHeureJulienne(lever);
              Serial.print("Meridien : ");
              afficherHeureJulienne(meridien);
              Serial.print("Coucher : ");
              afficherHeureJulienne(coucher); 
              full_sreeen();
             //display.display(false); // Full screen update mode 
          */
      }
    le résultat semble nettement meilleur comme dans l'exemple de la console ci-dessous car le <<Busy Timeout!>> n'apparait plus

    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
     
     
    ets Jul 29 2019 12:21:46
     
    rst:0x5 (DEEPSLEEP_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
    configsip: 0, SPIWP:0xee
    clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
    mode:DIO, clock div:1
    load:0x3fff0030,len:4876
    ho 0 tail 12 room 4
    load:0x40078000,len:16560
    load:0x40080400,len:3500
    entry 0x400805b4
    Capteurs activées...
    VL53L0X 1 = OK
    VL53L0X 2 = OK
     RTC = OK
    Réveil provoqué par la minuterie  <=======================================
    09/06/2026
    -----------
    11:09:30
    -----------
    Panneau N°1 => - Ouvert
    Panneau N°2 => - Fermé
     
    -----------
    Pas de Changement
    -----------
    Voltage = 3.86
    [ Alarme 1: 09 21:25:21, Mode: Date ]
    --------------------
    Boot number: 100
    --------------------
    ets Jul 29 2019 12:21:46
     
    rst:0x5 (DEEPSLEEP_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
    configsip: 0, SPIWP:0xee
    clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
    mode:DIO, clock div:1
    load:0x3fff0030,len:4876
    ho 0 tail 12 room 4
    load:0x40078000,len:16560
    load:0x40080400,len:3500
    entry 0x400805b4
    Capteurs activées...
    VL53L0X 1 = OK
    VL53L0X 2 = OK
     RTC = OK
    Réveil provoqué par la minuterie  <==========================================
    09/06/2026
    -----------
    11:09:36
    -----------
    Panneau N°1 => - Ouvert
    Panneau N°2 => - Fermé
     
    -----------
    Pas de Changement
    -----------
    Voltage = 3.96
    [ Alarme 1: 09 21:25:21, Mode: Date ]
    --------------------
    Boot number: 101
    --------------------
    ets Jul 29 2019 12:21:46
     
    rst:0x5 (DEEPSLEEP_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
    configsip: 0, SPIWP:0xee
    clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
    mode:DIO, clock div:1
    load:0x3fff0030,len:4876
    ho 0 tail 12 room 4
    load:0x40078000,len:16560
    load:0x40080400,len:3500
    entry 0x400805b4
    Capteurs activées...
    VL53L0X 1 = OK
    VL53L0X 2 = OK
     RTC = OK
    Réveil provoqué par la minuterie
    09/06/2026
    -----------
    11:09:42
    -----------
    Panneau N°1 => - Ouvert
    Panneau N°2 => - Fermé
     
    -----------
    Pas de Changement
    -----------
    Voltage = 4.01
    [ Alarme 1: 09 21:25:21, Mode: Date ]
    --------------------
    Boot number: 102
    --------------------

    Toutefois , je requière votre avis car l'ESP32 se réveille toutes les 5 secondes actuellement par minuterie donc, mais qu'en est-il lorsqu'il se réveillera par l'action RTC comme ici ce jour à 21h25 ?
    comment l'ESP32 se comportera , y a-t-il par exemple une priorité ?

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 759
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 759
    Par défaut
    Je n'ai donné aucun conseil à part regarder les 3 fonctions qui pouvaient peut-être généré le problème.(2 liés à l'affichage a priori, et 1 au réglage de l'alarme) .
    Comme tu as mis en commentaire full_screen() et afficherHeureJulienne(coucher) et que ça semble fonctionner, le problème vient donc de l'une de ces 2 fonctions (je pencherai pour full_screen())

  6. #6
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 822
    Par défaut
    Bonjour,

    J"ai regardé le code. Il donne l'impression d'avoir un long historique. Il me semble qu'il est temps de faire un travail de clarification.

    La langue des messages qui change au gré du code.

    Il y a beaucoup de code mis en commentaire sans qu'on sache si c'est une mise en bière, un code sous optimal attendant un remodelage, une variante parmi d'autres... Je conseillerais, dès qu'il y a plus de 5 lignes de code à neutraliser de mettre un petit commentaire avec la date. C'est un conseil que je suis la plupart du temps et m'en veux sinon.

    Il y a des variables qui ne servent à rien : n1 et n2 par exemple.

    Il y a des calculs faux, comme celui du pourcentage de la charge batterie qui monte à plus de 300% juste au-dessus de 3.2V alors qu'à 3.2V et en dessous la valeur est forcée à 0%. Heureusement ces valeurs, qui ne sauraient rentrer sans dégât dans le uint8_t prévu, ne sont pas utilisées.

    L'usage d'un tableau de structures ou de classes caractérisant les volets simplifierait le code tout en permettant de prévoir facilement des ajouts. J'ai relevé, mais je ne suis sans doute pas exhaustif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    structure TPanel {
       bool  isOpen;      // actuellement P1 ou P2
       int    pin;
       VL53L0X_RangingMeasurementData_t  Dist // actuellement measure1 ou measure2 
       int    pinDist;    // actuellement pinLOX1 ou pinLOX2 
       uint8_t adrsDist;  // actuellement LOX1_ADDRESS ou LOX2_ADDRESS
    }
    Il y a aussi beaucoup de code sur les dates. Même si je n'ai pas creusé trop ce sujet j'ai l'impression qu'il y un travail de simplification possible ne serait-ce qu'en utilisant plus les fonctions de manipulations de dates. Je pense que cela résulte du patchwork de codes divers, chacun venant avec son format. C'est déjà pénible pour la mise au point, mais la maintenance sera pire

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  7. #7
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 144
    Par défaut
    Salut Guesset

    J"ai regardé le code. Il donne l'impression d'avoir un long historique. Il me semble qu'il est temps de faire un travail de clarification.
    Sur ce point tu as raison , ce projet que j'ai repris récemment à une longue date auquel j'ai ajouté des fonctions encore "en construction" comme on dit
    le code n'est pas structuré car j'essaie de mettre au point chaque éléments
    - le traitement de mesure des capteurs VL50L0x
    - le traitement du calcul de l'éphéméride
    - le traitement au final de la date et l'heure de l'alarme
    - le traitement de l'affichage très particulier de l'E-paper que je découvre

    bref, j'essaie avec mes faibles connaissances de faire fonctionner tout çà
    pour l'instant
    - le traitement de mesure des capteurs fonctionne
    - le traitement du calcul de l'alarme aussi ( j'avais un problème de "busy timout" qui est lui résolu voir plus haut )
    - le traitement de l'affichage semble correct

    il me reste un point noir , mais avec votre aide j'espère y arriver

    ce problème est le suivant :
    - lorsque le DS3231 génère l'interruption par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    attachInterrupt(digitalPinToInterrupt(CLOCK_INTERRUPT_PIN), onAlarm, FALLING);
    j'ai un sous programme qui à ma connaissance devait pouvoir mettre ma variable valarme = 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
     
    //#########################################################################################
    void onAlarm(){
      Serial.print("Une alarme s'est produite!");
      valarme = 1;
      return;
    }
    mais je ne vois pas à la console le message alors que l'interruption elle est bien notée
    je remets le code actuel pour une meilleure compréhension

    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
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    /----------------------------------------------------------------------
    //                        Lilygo T5 ESP32 E-paper
    //  
    //                        ===============    
    //                  3.3V -|             |- 
    //                   GND -|             |- 
    //               SDA  21 -|             |- 
    //                       -|             |-
    //                       -|             |- 3.3V
    //               SCL  22 -|             |- 32  Alarme
    //                       -|             |- 33  SQW DS3231
    //        VL53L0X 1   14 -|             |- 25  Panneau 2
    //                       -|             |- 26  Panneau 1
    //        VL53L0X 2   15 -|             |- 27  LDR
    //                       -|             |- 
    //                    5V -|             |- 
    //                  VBAT -|             |- GND
    //                        ===============
    //
    // I2C device found at address 0x30  !
    // I2C device found at address 0x31  !
    // I2C device found at address 0x38  !
    // I2C device found at address 0x57  !
    // I2C device found at address 0x68  !
    //
    //   Tension VBAT   35
    //   VERANDA_V260608a : 
    //-----------------------------------------------------------------------							
    
    /**** Branchements *****************************************************/ 
    #define pinAlarm             32                   //* Alarme */
    #define pinP1                25                   //* Panneau 1 ouvert */
    #define pinP2                26                   //* Panneau 2 ouvert /*
    
    /********************************************************************/
    #include <SPI.h>
    #include "RTClib.h"
    #include "driver/rtc_io.h"
    #include <Wire.h>
    #include <time.h>
    #include <Adafruit_AHTX0.h>
    #include <Adafruit_Sensor.h>
    #include "Adafruit_VL53L0X.h"
    #include <GxEPD2_BW.h>
    #include <U8g2_for_Adafruit_GFX.h>
    #include <Adafruit_NeoPixel.h>
    #include "ephemeride.h"
    #include "affichage.h"
    /*********************************************************************/
    
    /******* Declarations ************************************************/
    
    //------------------ AHT10  ---------------------------
    Adafruit_AHTX0 aht; // I2C device found at address 0x38
    //------------------ NeoPixel  ---------------------------
    #define NUMPIXELS 10 // Popular NeoPixel ring size
    #define DELAYVAL 200 // Time (in milliseconds) to pause between pixels
    Adafruit_NeoPixel pixels(NUMPIXELS, pinAlarm , NEO_GRB + NEO_KHZ800);
    // ------------Capteurs vl53l0x..............................
    #define pinLOX1  14                  //* Capteur 1           */
    #define pinLOX2  15                  //* Capteur 2           */
    #define LOX1_ADDRESS         0x31               //* Adresse I2C : 0x31  */
    #define LOX2_ADDRESS         0x30               //* Adresse I2C : 0x30  */
    #define maxDistance          100                //* distance max 100 mm */
    Adafruit_VL53L0X LOX1      = Adafruit_VL53L0X();
    Adafruit_VL53L0X LOX2      = Adafruit_VL53L0X();
    VL53L0X_RangingMeasurementData_t measure1;
    VL53L0X_RangingMeasurementData_t measure2;
    //-------------- Mesure Batterie...............................
    #define pinVb                35                  //* mesure BATT                                
    #define VccMin               3.2                 //* Niveau minimum attendu de BAT, en Volts    
    #define VccMax               4.2                 //* Niveau maximum attendu de BAT, en Volts    
    const float voltage        = 0.0 ;
    uint8_t percentage         = 0.0 ;
    //---------------- DS3231 ---------------------------------------
    // Définir la broche d'interruption du DS3231 (qui réveillera l'ESP32)
    #define CLOCK_INTERRUPT_PIN   GPIO_NUM_33 
    // --------------sauvegarde variables --------------------------
    RTC_DATA_ATTR bool premier_demarrage = true;
    RTC_DATA_ATTR int bootCount = 0;
    RTC_DATA_ATTR bool exP1 = 0;
    RTC_DATA_ATTR bool exP2 = 0;
    // -----Instance pour le RTC -----------------------------------
    RTC_DS3231 rtc;
    DateTime alarm1Time = DateTime(0, 0, 0, 0, 0, 0);
    // -----Variables ----------------------------------------------
    bool P1                    = 0;  // 0: ferme, 1: ouvert
    bool P2                    = 0;  // 0: ferme, 1: ouvert
    bool change                = 0;
    int pp                     = 0;
    int tt                     = 0;
    int hh                     = 0;
    bool n1                    = 0;
    bool n2                    = 0;
    volatile byte valarme      = 0;       // Interrupt signaling byte
    bool vVCC                  = false;
    float AHT_Temp = 0 ;
    float AHT_Humidite = 0;
    int jour;
    int mois;
    int annee;
    int heure;
    int minute;
    int seconde;
    char alarm1Date[12] = "DD hh:mm:ss";
    String(affichalarme);
    String(affichmode);
    
    // ------- Données Géographiques --------------------------------
    double latitude_nord = 45.6590039;
    double longitude_ouest = -5.278757777777778;
    double lever, meridien, coucher;
    
    /*************************************************/
    long SleepDuration = 10; // Temps de sommeil en minutes, aligné sur la limite de la minute la plus proche, donc si 30, la mise à jour se fera toujours à 00 ou 30 heures passées.
    int  WakeupHour    = 7;  // Ne pas se réveiller avant 07h00 pour économiser la batterie
    int  SleepHour     = 23; // Mise en veille après (23+1) 00:00 pour économiser la batterie
    int  CurrentHour = 0, CurrentMin = 0, CurrentSec = 0;
    long StartTime = 0;
    /*************************************************/
    
    /***************************************************************/
    /*               SETUP                                         */
    /***************************************************************/
    void setup() 
    {
       StartTime = millis();
       Serial.begin(115200);
       while (!Serial) {
          delay(1);
       }
       
       pinMode(pinAlarm, OUTPUT);                    // Sortie Alarme
       pinMode(pinLOX1, OUTPUT);                     // Sortie LOX1  
       pinMode(pinLOX2, OUTPUT);                     // Sortie LOX2
       pinMode(pinP1, OUTPUT);                       // Sortie Panneau 1 Ouvert
       pinMode(pinP2, OUTPUT);                       // Sortie Panneau 2 Ouvert
       pinMode (pinAlarm, OUTPUT);                   // Sortie alarme
    
      // Capteurs Proximités activés 
       Serial.println(F("Capteurs activées..."));
       digitalWrite(pinLOX1, LOW);
       digitalWrite(pinLOX2, LOW);
       setID();
    
      esp_sleep_enable_timer_wakeup(5000000ULL); // 5 secondes
    
      // Initialiser le RTC
      if(!rtc.begin()) {
        Serial.println("Impossible de trouver RTC!");
        Serial.flush();
        while (1) delay(10);
      }else{
          Serial.println(F(" RTC = OK"));
      }  
      // Initialiser le AHT10
      /*
      if (! aht.begin()) {
        Serial.println("Impossible de trouver l'AHT ? Vérifier le câblage");
        while (1) delay(10);
      }else{
        Serial.println(F(" AHT10 = OK"));
      }	
      */
         
       char texte[80];
       print_wakeup_reason(); //Imprime le motif de réveil de l'ESP32
       
      // Clignotement de la LED lorsque l'ESP32 se réveille
      pinMode (pinAlarm, OUTPUT);
     
      // Init Date -------------------------------  
      DateTime maintenant = rtc.now();  // on lit la date actuelle
      // s'il y a eu déclenchement d'alarme on ajoute 1 jour à la date en cours et enlève l'alarme
      if (rtc.alarmFired(1)==true) {
        rtc.clearAlarm(1);
        maintenant = maintenant + TimeSpan(1,0,0,0); // On ajoute 1 jour à la date en cours
        Serial.println(" -Alarme réactualisée-");
      }
    
      // On calcule la Date du Jour -------------
      double lever, meridien, coucher;
      jour = maintenant.day();
      mois = maintenant.month();
      annee = maintenant.year();
      afficherDate(jour,mois,annee);  
      Serial.println("\n-----------");
       // On calcule l'heure UTC 
      heure  = maintenant.hour();
      minute = maintenant.minute();
      seconde = maintenant.second();
      char buf[9];
      sprintf(buf, "%02d:%02d:%02d", heure, minute,seconde );
      afficherHeure(heure,minute,seconde);  // affichage date du jour
      Serial.println("\n-----------");
      
      // Lecture Position des panneaux
      ReadPanels();
      change = premier_demarrage || (P1 != exP1) || (P2!= exP2);
      Serial.println("\n-----------");
         if(change) Serial.print(F("Changement- OK! ")); else Serial.print(F("Pas de Changement"));
      Serial.println("\n-----------");
      // Lecture Tension batterie
      tensionbatterie();
      // Lecture AHT10
      //Temp_Hum_Section();
     
      /* --- Décommenter si besoin de définir l'heure du RTC ----*/
      //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      //rtc.adjust(DateTime(2026, 6, 9,21, 24, 00)); // Attention mettre à l'heure UTC
      /*-------------------------------------------------------------------*/
     
      rtc.disable32K();   // Désactiver la broche 32K
      rtc.writeSqwPinMode(DS3231_OFF);
      rtc.disableAlarm(2);
    
       // L'alarme déclenche une interruption
      pinMode(CLOCK_INTERRUPT_PIN, INPUT_PULLUP);
      attachInterrupt(digitalPinToInterrupt(CLOCK_INTERRUPT_PIN), onAlarm, FALLING);
    
      
          
      /* Mettre l'alarme 1 à jour en fonction de l'ephemeride */
      if(!rtc.setAlarm1(alarm1Time, DS3231_A1_Date)) {  // ce mode déclenche l'alarme lorsque la date et heure correspondantes
            Serial.println("Erreur, l'alarme n'a pas été réglée!");
      }else {
          calculerEphemeride(jour, mois, annee, longitude_ouest, latitude_nord, &lever, &meridien, &coucher);
          /*
          Serial.print("Lever : ");
          afficherHeureJulienne(lever);
          Serial.print("Meridien : ");
          afficherHeureJulienne(meridien);
          Serial.print("Coucher : ");
          afficherHeureJulienne(coucher); 
          full_sreeen();
          //display.display(false); // Full screen update mode 
          */
      }
      
      programmerAlarme(annee, mois, jour, coucher); 
      checkDate(); 
        
      // Affichage  
      if (change) {
        exP1 = P1;
        exP2 = P2;  
        premier_demarrage = false;
        InitialiseDisplay();  //<====
        Draw_Heading_Section(); // <====== 
        DrawBattery(190, 12);  //  <====== 
        DrawPanneaux(5, 15);   //  <======
        Draw_Temp_Hum_Section(192,15); // <====== 
        DisplayAstronomySection(10, 10); // affichage E-Paper
      }
    
       Serial.println("vAlarme : "+ String(valarme));
      
      // Mettre l'alarme 1, 2 à false (donc l'alarme 1, 2 ne s'est pas produite jusqu'à présent)
      // si ce n'est pas fait, cela conduit facilement à des problèmes, car les deux registres ne sont pas réinitialisés au redémarrage/recompilation.
      rtc.clearAlarm(1);
      rtc.clearAlarm(2);
    
      // Incrémente le numéro de démarrage et l'imprime à chaque redémarrage
      ++bootCount;
      Serial.println("--------------------");
      Serial.println("Boot number: " + String(bootCount));
      Serial.println("--------------------");
      
      // Configuration du réveil externe
      esp_sleep_enable_ext0_wakeup(CLOCK_INTERRUPT_PIN, 0);  //1 = Haut, 0 = Bas
      // Configurer le pullup/down via RTCIO pour lier les broches de réveil à un niveau inactif pendant le sommeil profond.
      // La broche SQW du RTC est active à un niveau bas.
      rtc_gpio_pulldown_dis(CLOCK_INTERRUPT_PIN);
      rtc_gpio_pullup_en(CLOCK_INTERRUPT_PIN); 
       
      
      //S'endormir maintenant jusqu'à ce qu'une alarme se déclenche
      // Serial.println("Going to sleep now");
      esp_deep_sleep_start();  
      //BeginSleep();
    }
    
    /***************************************************************/
    /*               LOOP                                          */
    /***************************************************************/
    void loop() {}
    
    //#########################################################################################
    void BeginSleep() {
      powerOff();
      long SleepTimer = (SleepDuration * 60 - ((CurrentMin % SleepDuration) * 60 + CurrentSec)); //Certaines ESP32 sont trop rapides pour maintenir une heure précise
      esp_sleep_enable_timer_wakeup((SleepTimer + 20) * 1000000LL); // Ajout de +20 secondes pour couvrir les imprécisions de la source du timer RTC de l'ESP32
    
      Serial.println("Entering " + String(SleepTimer) + "-secs of sleep time");
      Serial.println("Awake for : " + String((millis() - StartTime) / 1000.0, 3) + "-secs");
      Serial.println("Starting deep-sleep period...");
      esp_deep_sleep_start();  // Sleep for e.g. 30 minutes
    }
    
    
    
    
    //#########################################################################################
    // Méthode permettant d'imprimer la raison pour laquelle l'ESP32 a été réveillé de son sommeil
    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 causé 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 la minuterie"); break;
        case ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println("Réveil provoqué par le pavé tactile"); 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", wakeup_reason); break;
      }
    }
    
    //#########################################################################################
    void programmerAlarme(int annee, int mois, int jour, double heureJulienne) {
     
      // on calcule l'heure, minute et seconde comme dans le code de bricoleau
      // dans sa fonction afficherHeure() en modifiant éventuellement le jour
      int h, m, s;
      double d = heureJulienne + 0.5;
       
      if (d < 0.0) {
        jour -= 1;
        d += 1.0;
      } else if (d >= 1.0) {
        jour += 1;
        d -= 1.0;
      }
     
      h = d * 24.0;
      d -= (double) h / 24.0;
      m = d * 1440.0;
      d -= (double) m / 1440.0;
      s = d * 86400.0 + 0.5;
      h= h + 2 ; // <=== correction UTC + 2
       
      DateTime alarme(annee, mois, jour, h, m, s); // puis on fabrique un DateTime avec ces infos
      rtc.setAlarm1(alarme, DS3231_A1_Date); // qu'on utilise pour armer l'alarme1 du DS3231 en mode date+heure exacte
      //rtc.enableAlarm(DS3231_ALARM_1);
    }
    
    
    //#########################################################################################
    void checkDate()
    {
        DateTime alarm1Time = rtc.getAlarm1();
        Ds3231Alarm1Mode alarm1mode = rtc.getAlarm1Mode();
        //char alarm1Date[12] = "DD hh:mm:ss";
        alarm1Time.toString(alarm1Date);
        Serial.print("[ Alarme 1: ");
        Serial.print(alarm1Date);
        Serial.print(", Mode: ");
        switch (alarm1mode) {
          case DS3231_A1_PerSecond:
            Serial.println("PerSecond ]");
            affichmode = "Par Seconde";
            break;
          case DS3231_A1_Second:
            Serial.println("Second ]");
            affichmode = "Seconde";
            break;
          case DS3231_A1_Minute:
            Serial.println("Minute ]");
            affichmode = "Minute";
            break;
          case DS3231_A1_Hour:
            Serial.println("Hour ]");
             affichmode = "Heure";
            break;
          case DS3231_A1_Date:
            Serial.println("Date ]");
             affichmode = "Date";
            break;
          case DS3231_A1_Day:
            Serial.println("Day ]");
             affichmode = "Jour";
            break;
        }
        //affichalarme = alarm1Date;
        affichalarme = "Alarme => ";
        affichalarme += alarm1Date;
        affichalarme += " - En Mode: ";
        affichalarme += affichmode;
        affichalarme +=  " ";
        Serial.print("");
    }
    
    
    //#########################################################################################
    void onAlarm(){
      Serial.print("Une alarme s'est produite!");
      valarme = 1;
      return;
    }
    
    /*****************************************************************/
    void tensionbatterie() {
      float v_mes = analogRead(pinVb);
      delay(200);
      //float voltage = 1.435*(v_mes/4095)*3.3;
      float voltage = 2*(v_mes/4095)*3.3;
      Serial.println("Voltage = " + String(voltage));
      percentage = 2836.9625 * pow(voltage, 4) - 43987.4889 * pow(voltage, 3) + 255233.8134 * pow(voltage, 2) - 656689.7123 * voltage + 632041.7303;
      if (voltage >= 4.20) percentage = 100;
      if (voltage <= 3.20) percentage = 0 ;
       
    }
    
    /*******************************************************************/
    void Temp_Hum_Section() {
      sensors_event_t humidity, temp;
      aht.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
      AHT_Temp = temp.temperature;
      AHT_Humidite = humidity.relative_humidity;
      Serial.print("Temperature: "); Serial.print(temp.temperature,1); Serial.println(" degrees C");
      Serial.print("Humidity: "); Serial.print(humidity.relative_humidity,0); Serial.println("% rH");
      
    } 
    
    /*****Initialiser les capteurs VL53L0X *********************/
    void setID() {
      // tout est remis à zéro
       digitalWrite(pinLOX1, LOW);                   
       digitalWrite(pinLOX2, LOW);
       delay(20);
       
       // initialisation LOX1........................
       digitalWrite(pinLOX1, HIGH);
       delay(30);
       if(! LOX1.begin(LOX1_ADDRESS)) {
          Serial.println(F("Echec init VL53L0X 1"));
          while(1);
        }else{
          Serial.println(F("VL53L0X 1 = OK"));
        }
        // initialisation LOX2........................
       digitalWrite(pinLOX2, HIGH);
       delay(30);
       if(! LOX2.begin(LOX2_ADDRESS)) {
          Serial.println(F("Echec init VL53L0X 2"));
          while(1);
       }else{
          Serial.println(F("VL53L0X 2 = OK"));
       }
    }
    
    
    
    /***************** PANNEAUX ********************************/
    void ReadPanels() {  
         
       // Capteur1 en lecture........P1 = 1 si panneau n°1 ouvert................
       Serial.println("\n-----------");
       Serial.print(F("Panneau N°1 => "));
       LOX1.rangingTest(&measure1, false);    // 'true' pour avoir les données de débogage
       P1 = (measure1.RangeMilliMeter >  maxDistance); 
       if(P1) Serial.print(F("- Ouvert")); else Serial.print(F("- Fermé"));
       Serial.println();
       // Capteur2 en lecture...P2 = 1 si panneau n°2 ouvert.....................
       Serial.print(F("Panneau N°2 => "));
       LOX2.rangingTest(&measure2, false);  // 'true' pour avoir les données de débogage
       P2 = (measure2.RangeMilliMeter >  maxDistance);
       if(P2) Serial.print(F("- Ouvert")); else Serial.print(F("- Fermé"));
       Serial.println("\n-----------");
       
    
       // Affichage LEDS 
         if (P1 != 0) digitalWrite(pinP1 , HIGH); else digitalWrite(pinP1 , LOW);
         if (P2 != 0) digitalWrite(pinP2 , HIGH); else digitalWrite(pinP2 , LOW);
        
    }
    
    /******** Traitement Alarme ******************************/
    void alarme() { 
    
       Serial.print(F("Alarme: "));    Serial.print(valarme);      Serial.println();
       
       /*
       for(int i=0; i<NUMPIXELS; i++) 
    	 { // For each pixel...
           
           if (valarme==1){
              pixels.setPixelColor(i, pixels.Color(255, 0, 255)); // Sombre = VIOLET
           }
           if (valarme==2){
              pixels.setPixelColor(i, pixels.Color(255, 0, 0)); // Pluie = ROUGE
           }   
           if (valarme==3){
              pixels.setPixelColor(i, pixels.Color(0, 255, 0)); // Batterie = VERT
           }
            
            pixels.show();   // Envoyez les couleurs de pixel mises à jour au matériel.
            delay(DELAYVAL); // Pause avant le passage suivant dans la boucle
            pixels.setPixelColor(i, pixels.Color(0, 0, 0));
            pixels.show(); 
       }
       */
    }
    Il y a des variables qui ne servent à rien : n1 et n2 par exemple.
    exact je vais nettoyer tout çà

    Il y a des calculs faux, comme celui du pourcentage de la charge batterie qui monte à plus de 300% juste au-dessus de 3.2V alors qu'à 3.2V et en dessous la valeur est forcée à 0%. Heureusement ces valeurs, qui ne sauraient rentrer sans dégât dans le uint8_t prévu, ne sont pas utilisées.
    je vais regarder


    merci en tout cas d'avoir regardé
    pascal


    EDIT pour illuster mon problème, pour mémoire l'alarme etait programmée à : [ Alarme 1: 10 21:25:57, Mode: Date ]

    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
     
     
    /*****************************************************************************/
    Capteurs activées...
    VL53L0X 1 = OK
    VL53L0X 2 = OK
     RTC = OK
    Réveil causé par un signal externe utilisant RTC_IO       <=======================
     -Alarme réactualisée-
    11/06/2026
    -----------
    21:25:57                                                                   <======================
    -----------
     
    -----------
    Panneau N°1 => - Ouvert
    Panneau N°2 => - Ouvert
    -----------
     
    -----------
    Pas de Changement
    -----------
    Voltage = 4.42
    [ Alarme 1: 11 21:26:32, Mode: Date ]
    vAlarme : 0                                             <=====================
    --------------------
    Boot number: 17
    --------------------
    /*********************************************************************/

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 759
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 759
    Par défaut
    Tu as mis la résistance de pull-up sur la sortie alarme (SQW) (elle est peut-être déjà présente sur la carte module cela dit)
    J'ai vu que tu as configuré l'entrée avec pullup pour ce signal, ça devrait donc être bon (mais à vérifier)

    Dans le code, tu as plusieurs fois pinMode (pinAlarm, OUTPUT) pour moi, un seul suffit.

  9. #9
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 144
    Par défaut
    merci umfred

    Dans le code, tu as plusieurs fois pinMode (pinAlarm, OUTPUT) pour moi, un seul suffit.
    ok merci, c'est rectifié

    j'ai refait l'essai ( voir Edit dans mon poste précédent )
    le réveil de l'ESP32 se passe bien avec l'interruption du DS3231 mais la variable "valarme" reste à zéro
    et le programme ne semble pas passer par le sous-programme "onAlarm" comme demandé , bizarre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    attachInterrupt(digitalPinToInterrupt(CLOCK_INTERRUPT_PIN), onAlarm, FALLING);

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 759
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 759
    Par défaut
    retire la mention volatile devant sa déclaration, et passe la à 0 après traitement des alarmes, pour tester

  11. #11
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 144
    Par défaut
    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
    rst:0x5 (DEEPSLEEP_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
    configsip: 0, SPIWP:0xee
    clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
    mode:DIO, clock div:1
    load:0x3fff0030,len:4876
    ho 0 tail 12 room 4
    load:0x40078000,len:16560
    load:0x40080400,len:3500
    entry 0x400805b4
    Capteurs activées...
    VL53L0X 1 = OK
    VL53L0X 2 = OK
    
    -----------
    RTC = OK
    
    -----------
     -Alarme réactualisée-
    11/06/2026
    -----------
    21:25:57  <=======================
    -----------
    
    -----------
    Panneau N°1 => - Ouvert
    Panneau N°2 => - Ouvert
    -----------
    
    -----------
    Pas de Changement
    -----------
    Voltage = 4.51
    [ Alarme 1: 11 21:26:32, Mode: Date ]
    vAlarme : 0                                                               <==================
    Réveil causé par un signal externe utilisant RTC_IO      <==================
    --------------------
    Boot number: 17
    c'est idem ....

    et passe la à 0 après traitement des alarmes, pour tester
    j'ai déclaré :
    => bool valarme = 0;
    mais j'avoue ne pas avoir compris :" passe la à 0 après traitement des alarmes"
    peux-tu développer stp ?

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 759
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 759
    Par défaut
    Citation Envoyé par cobra38 Voir le message
    mais j'avoue ne pas avoir compris :" passe la à 0 après traitement des alarmes"
    peux-tu développer stp ?
    bah une fois que tu as testé sa valeur, remet la à 0 pour être sûr de ne pas repasser par le test valarme==1 la fois d'après

    Bon, il faut bien que la variable soit en volatile, mais pas besoin du return dans la fonction, et il y a potentiellement conflit entre l'interruption et l'utilisation du Serial.Print

  13. #13
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 822
    Par défaut
    Bonjour,

    Je pense que l'ESP32 est comme moi : il ne faut pas le réveiller et en même temps lui demander d'agir. En résumé, l'ESP reçoit l'interruption alors même qu'il n'est pas encore réveillé par celle-ci.

    Une solution possible serait d'ajouter dans le case ESP_SLEEP_WAKEUP_EXT0: de print_wakeup_reason(), un appel à la même fonction OnAlarm().

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  14. #14
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 144
    Par défaut
    Pour umfred

    bah une fois que tu as testé sa valeur, remet la à 0 pour être sûr de ne pas repasser par le test valarme==1 la fois d'après
    on remet la valeur à zéro après chaque réveil non ?
    j'ai redéclaré :
    - volatile bool valarme = false;
    mais çà n'a rien changé

    pour Guesset

    Une solution possible serait d'ajouter dans le case ESP_SLEEP_WAKEUP_EXT0: de print_wakeup_reason(), un appel à la même fonction OnAlarm().
    j'ai essayé aussi mais sans résultat

    j'ai trouvé çà sur le net qui en parle
    https://forum.arduino.cc/t/rtc-alarm...king/672990/17
    il semblerait qu'il y ait des problèmes avec onAlarm()

    je suis donc rabattu sur la fonction : rtc.alarmFired(1)==true
    et j'y ai affecté ma variable : valarme = 1;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (rtc.alarmFired(1)==true) {
        valarme = 1;                            <================================
        rtc.clearAlarm(1);
        maintenant = maintenant + TimeSpan(1,0,0,0); // On ajoute 1 jour à la date en cours
        Serial.println(" -Alarme réactualisée-");
      }
    j'ai bien retrouvé ma variable à 1 au moment de la mise à jour de la date
    maintenant comment feriez-vous si vous deviez faire clignoter une LED et maintenir ce clignotement tant que les panneaux P1 et P2 ne sont pas à zéro !

  15. #15
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 759
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 759
    Par défaut
    dans la loop, en inversant la valeur de sortie + delay dans un bloc if(!(p1==0 && p2==0))
    quelque chose comme ça (si la led demandé est celle piloté par pinAlarm)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void loop(){
        ReadPanels()
        if(P1 || P2){
        {
            digitalWrite(pinAlarm,!digitalRead(pinAlarm)); //on inverse l'état actuel de pinAlarm
            delay(250); //250ms
        }
        else
        {
            digitalWrite(pinAlarm,HIGH); // état éteint (mettre LOW si logique inverse)
         }
    }

  16. #16
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 822
    Par défaut
    Bonjour,

    On aurait pu aussi mettre valarme = 1 directement dans le case en supposant que c'est le bon case. Je me suis fier au message, s'il apparaît je ne vois pas pourquoi OnAlarme ne serait pas appelée.

    Pour le clignotement d'une led classique, le plus simple, si on veut pouvoir le traiter comme un état, est un PWM très lent. Pour jouer, on peut aussi confier un blink classique au second coeur (j'avais déjà pensé à cela quand j'avais vu que la procédure qui faisait tourner des lumières était assez lente et bloquante).

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  17. #17
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 144
    Par défaut
    Il y a quelque chose que je ne comprends pas

    j'ai dans le programme 2 séquences distinctes

    - un réveil toutes les 5 secondes pour réactualiser l'affichage par cohérence de la position de mes panneaux
    - un autre réveil dès que l'interruption du DS3231 est activée seulement 1 fois par jour

    dans les 2 cas, seul le "setup" est actif , le programme balaye la séquence toutes les 5 secondes pour regarder si la position des panneaux a changé sinon il se rendort
    et 1 fois par jour il se réveille avec le DS3231 pour réactualiser l'alarme et c'est à ce moment là que je dois regarder si mes panneaux sont fermés
    et enclenché le clignotement des leds sinon et ceci tant que les panneaux ne sont pas fermés
    donc au final bloquer le deep_sleep !
    or je ne comprends pas comment faire cette boucle d'attente dans un setup (?) ou dois-je nécessairement passer par le loop alors ?
    et si oui comment faire pour "sortir" du loop après avoir fermé les panneaux ?

    Question : je n'utilise pas de Wifi ni BT , on pourrait faire tourner une partie du programme sur le CPU1 et le clignotement sur le CPU0 par exemple ?

  18. #18
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 822
    Par défaut
    Bonjour,

    La boucle peut être n'importe où, un for() dans le setup(), dans une fonction dédiée, ou utiliser loop() disponible. Je préférerais cette dernière approche qui déchargerait un peu le setup.

    En fait le setup est l'élément actif d'une boucle qui ne dit pas son nom : démarrage->setup()->dodo(5 s)->démarrage->setup()->dodo(5 s)->démarrage->setup()->dodo(5s)->démarrage->setup()->dodo(5 s)->...

    Je présume qu'une fois le travail de fermeture opéré par la boucle du soir, celle-ci endormira le MPU après avoir programmé un réveil au matin. Réveil matinal à distinguer dans le code de celui du soir (en lisant l'heure ?) pour repasser en siestes de 5 s.
    Que se passe-t-il si on réveille le MPU alors qu'il ne dort pas ? N'y a-t-il pas risque de rater l'activation de la boucle du soir ?

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  19. #19
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 144
    Par défaut
    Que se passe-t-il si on réveille le MPU alors qu'il ne dort pas ?
    j'avoue ne pas avoir la réponse mais les essais effectués ne semble pas perturber le cycle , les variables sont remises à zero et on continue le cycle des 5 s

    N'y a-t-il pas risque de rater l'activation de la boucle du soir ?
    je ne pense pas puisqu'il s'agit d'une interruption periodique d'une part tandis que l'autre est faite à partir d'une date précise
    pour l'instant la mise à jour s'effectue de façon cyclique tout a fait normalement


    Je présume qu'une fois le travail de fermeture opéré par la boucle du soir, celle-ci endormira le MPU après avoir programmé un réveil au matin. Réveil matinal à distinguer dans le code de celui du soir (en lisant l'heure ?) pour repasser en siestes de 5 s.
    Il n'y pas de reveil au matin seule la date du crépuscule est prise ne compte , une boucle de 5s pour actualiser l'affichage pour l journée et une mise à jour au crépuscule pour la programmation de la date du lendemain calculée à l'aide des données de l'éphéméride


    mon problème actuel reste le traitement de l'alarme mais çà tu le sais déjà ...

  20. #20
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 822
    Par défaut
    Bonjour,

    Je crois que j'ai compris pourquoi l'appel direct de OnAlarm ne fonctionne pas. Cette fonction est déclarée comme fonction d'interruption, donc même si elle ressemble à une fonction classique, son appel comme son retour ne sont pas gérés classiquement. L'appel doit garder toutes les informations du code interrompu et le retour les restituer.

    Mea Culpa.

    Donc la modification directement dans le case de la variable valarm doit fonctionner correctement puisqu'on évite d'appeler la pseudo-fonction OnAlarm.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

Discussions similaires

  1. Problème de session timeout
    Par johnaliashead dans le forum ASP.NET
    Réponses: 9
    Dernier message: 11/05/2011, 18h21
  2. [1.x] probleme envoi email timeout
    Par lepopol dans le forum Symfony
    Réponses: 2
    Dernier message: 18/01/2011, 23h52
  3. Problème transaction JTA timeout
    Par bidi dans le forum Weblogic
    Réponses: 3
    Dernier message: 19/12/2008, 13h11
  4. [BO 5.1]Problème conversion Business Object
    Par michaelknight00 dans le forum Deski
    Réponses: 3
    Dernier message: 17/04/2008, 11h06
  5. probleme ncurses avec timeout
    Par darkgenesx dans le forum Linux
    Réponses: 0
    Dernier message: 08/12/2007, 22h27

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