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 :

Problème avec switch : Arduino qui redémarre


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    devellopement sur temps libre
    Inscrit en
    Mars 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : devellopement sur temps libre
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 27
    Par défaut Problème avec switch : Arduino qui redémarre
    Bonjour a tous

    Alors voila mon problème j'ai un switch qui me permet de déclencher une fonction identique pour tous

    Ce switch contient 16 condition qui dépendent du relais que l'on souhaite modifier mais voila quand je decommante la 7ème conditions (case 7 cela me décale tout d'un niveau dans autres menu j'ai essayer de toute les façons que je voyait avec des pointeurs avec des returns etc...

    pour être plus précis si dans le sous_menu floraison si je décommente la 7eme condition dans affichage_menu.h a la ligne 675 ou une des conditions qui suit cela me décale tout d'un cran dans le menu forcer état. Quand je tente d'accéder à état lampe cro la carte redémarre par contre si je sélectionne le deuxième (etat lampe flo) j'accède a etat lampe cro et ainsi de suite

    j'ai mis des variables pour voir ou le script plantais il programme plante au niveau du switch ligne 777 j'ai placé une variable a cette endroit et elle s'affiche a zero pas moyen de rentrer dans ce switch ligne 777

    par contre si je commente la ligne 675 jusqu'a la ligne 700 je rentre dans le switch ligne 777 sans aucun problème voir photo et video


    video avec conditions 7 et suivante commenté
    https://drive.google.com/file/d/1YcV...ew?usp=sharing

    video avec conditions 7 et/ou suivante décommenté
    https://drive.google.com/file/d/1P9e...ew?usp=sharing


    Nom : arduino1.jpg
Affichages : 372
Taille : 523,7 Ko
    Nom : arduino2.jpg
Affichages : 352
Taille : 394,9 Ko

    le sketch arduino:
    automate_version2beta0.1.zip

    en espérant que vous pourrez m'aidez

  2. #2
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Qu'entendez vous par
    décale tout d'un niveau dans autres menu
    ? est-ce que ça veut dire que le menu n'est pas sur sa bonne ligne?

    Je vois que vous utilisez des interruptions pour lire un encodeur rotatif. Dans votre ISR Vous utilisez des variables qui ne sont pas déclarées en volatile. il faut le faire pour etat, Compteur, selecteur, previousmillismenu. (en fait Compteur ne sert à rien, autant le virer).

    ==> Il se pourrait que vous soyez victime d'une corruption d'une de ces variables pendant l'interruption et dans le code principal l'accès à ces variables devrait être en zone critique ou se faire sur une copie.

    de plus dans la fonction modifyetat() je vois un bug ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if ( digitalRead(validate) == LOW && (*modify_etat = 3))
    le test d'égalité c'est == mais comme vous ne l'appelez pas je suppose que vous n'avez pas été victime de cette initialisation

    Je vois que vous avez commenté ces lignes, mais vous ne devez pas utiliser print() dans une interruption car ça utilise aussi les interruptions qui sont désactivées et il faut minimiser au maximum le temps passé dans l'interruption).

    Bon - après "un peu" de ménage pour y voir plus clair, j'ai regroupé vos fichiers et détruit tout ce qui ne servait pas ou était commenté voici le code auquel j'arrive.
    Dans ce code j'ai mis une petite section critique pour recopier les variables modifiables dans interruption.

    Pourriez vous tester ce que ça donne ? (NB J'ai mis le moniteur série à 115200 bauds - changez le dans votre IDE pour voir les traces)

    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
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    #include <SPI.h>
    #include <LiquidCrystal.h>
     
    //////////////////////////////////////////////////////////////PINOUT////////////////////////////////////////////////////
    LiquidCrystal lcd(5, 7, 15, 13, 11, 9);
    #define retro 17
     
    #define validate 18
    #define portA 2
    #define portB 3
     
     
    //////////////////////////////////Variables des du programme
    const unsigned long temps_menu = 20000;
    unsigned long current_millis_pompe;
     
    boolean menuActif;
     
    volatile unsigned long previousmillismenuISR;
    volatile byte selecteurISR = 1;
     
    // ces variables de travail seront mises à jour en début de loop en section critique
    unsigned long previousmillismenu;
    byte selecteur;
     
    unsigned long previousmillisaffichage;
     
    int modify_h = 0;
    byte S_menu;
     
    byte S_menu_sauverconfig;
    byte  sous_menu_sauverconfig;
    byte Sous_menu;
    int Sous_sous_menu ;
    byte pages = 1;
    char Mode[] = {0, 0, 0};
    byte level = 0;
    byte nombremenu;
     
    unsigned long tempspompemode;
     
     
    void Rotation();
    void selecteurmenu(int nombremenu);
     
    /*############################Constante affichage##########################*/
    const char chainevide20[] = "                    ";
     
    /*############################Fin constante affichage##########################*/
     
    void setSelecteur(byte s)
    {
      // SECTION CRITIQUE, ON MODIFIE UNE VARIABLE VOLATILE, ON S'ASSURE DE LA COHERENCE ENTRE LES DEUX */
      noInterrupts();
      selecteur = s;
      selecteurISR = selecteur;
      interrupts();
      // FIN DE SECTION CRITIQUE
    }
     
    void setup()
    {
      pinMode(portA, INPUT);                           //ENCODER ROTATIF
      pinMode(portB, INPUT);                           //ENCODER ROTATIF
      pinMode(validate, INPUT);                        //ENCODER ROTATIF
     
      attachInterrupt(0, Rotation, CHANGE);            //ENCODER ROTATIF
      attachInterrupt(1, Rotation, CHANGE);            //ENCODER ROTATIF
     
      Serial.begin(115200);                            //INITIALISATION SERIE A 115200 BAUDS
      lcd.begin(20, 4);                                //INITIALISATION LCD
      pinMode(retro, OUTPUT);
     
      // initialisation du lcd
      digitalWrite(retro, HIGH);
    }
     
    void loop()
    {
      // SECTION CRITIQUE, ON PREND UNE COPIE DE NOS VARIABLES */
      noInterrupts();
      previousmillismenu = previousmillismenuISR;
      selecteur = selecteurISR;
      interrupts();
      // FIN DE SECTION CRITIQUE
     
      if (!menuActif && (digitalRead(validate) == LOW )) //si menu n'est pas activé et bouton est cliqué
      {
        menuActif = true; //active le menu
        setSelecteur(1); // modifie selecteur en gardant l'intégrité / cohérence pour les interruptions
        pages = 1;
        lcd.clear();
        delay(200);
      }
     
      else if (menuActif) //Si menu est activé
      {
        if (level == 0) {
          lcd.setCursor(0, 0);
          lcd.print (F("        Menu       "));
          lcd.setCursor(16, 0);
          lcd.print(pages);
          lcd.print("-");
          lcd.print(selecteur);
          nombremenu = 7;
          selecteurmenu(nombremenu);
          Sous_menu = selecteur;
          switch (pages) // selectionne la page de niveau 1
          {
            case 1:
              lcd.setCursor(1, 1);
              lcd.print(F("Mode Croissance    "));//1
              lcd.setCursor(1, 2);
              lcd.print(F("Mode floraison 1   "));//2
              lcd.setCursor(1, 3);
              lcd.print(F("Mode floraison 2   "));//3
              break;
            case 2:
              lcd.setCursor(1, 1);
              lcd.print(F("Sauver config      "));//4
              lcd.setCursor(1, 2);
              lcd.print(F("Forcer etat        "));//5
              lcd.setCursor(1, 3);
              lcd.print(F("Selection mode     "));//6
              break;
            case 3:
              lcd.setCursor(1, 1);
              lcd.print(F("Return             "));//7
              lcd.setCursor(1, 2);
              lcd.print(F("                   "));//8
              lcd.setCursor(1, 3);
              lcd.print(F("                   "));//9
              break;
          }
     
          if (digitalRead(validate) == LOW) // selectionne le menu croissance flo ou flo1
          {
            setSelecteur(1); // modifie selecteur en gardant l'intégrité / cohérence pour les interruptions
            level = 1;
            if (Sous_menu == 1 or Sous_menu == 2 or Sous_menu == 3 or Sous_menu == 5 or Sous_menu == 6)
            {
              S_menu = Sous_menu;
            }
     
            else if ( Sous_menu == 4 )
            {
     
            }
            else if ( Sous_menu == 7 )
            {
              menuActif = false; // on désactive le menu
              level = 0;
              lcd.clear();
              delay(200);
     
            }
          }
        }
     
        else if (level == 1)
        {
          tempspompemode = 0;
     
          if ( S_menu == 2 or S_menu == 3 ) // menu flo 1 ou flo2
          {
            lcd.setCursor(0, 0);
            if (S_menu == 2) {
              lcd.print(F("    Floraison 1     "));
            }
            else if (S_menu == 3) {
              lcd.print(F("    Floraison 2     "));
            }
            lcd.setCursor(16, 0);
            lcd.print(pages);
            lcd.print("-");
            lcd.print(selecteur);
            nombremenu = 11;
            selecteurmenu(nombremenu);
            Sous_sous_menu = selecteur;
     
     
            switch (pages)
            {
              case 1:
                lcd.setCursor(1, 1);
                lcd.print(F("Heure On lampe     "));
                lcd.setCursor(1, 2);
                lcd.print(F("Heure Off lampe    "));
                lcd.setCursor(1, 3);
                lcd.print(F("Tps On pompe J     "));
                break;
     
              case 2:
                lcd.setCursor(1, 1);
                lcd.print(F("Tps Off pompe J    "));
                lcd.setCursor(1, 2);
                lcd.print(F("Tps On pompe N     "));
                lcd.setCursor(1, 3);
                lcd.print(F("Tps Off pompe N    "));
                break;
     
              case 3:
                lcd.setCursor(1, 1);
                lcd.print(F("Brasseur temps on  "));
                lcd.setCursor(1, 2);
                lcd.print(F("Brasseur temps off "));
                lcd.setCursor(1, 3);
                lcd.print(F("Heat water On      "));
                break;
     
              case 4 :
                lcd.setCursor(1, 1);
                lcd.print(F("Extra lampe        "));
                lcd.setCursor(1, 2);
                lcd.print(F("Return             "));
                lcd.setCursor(0, 3);
                lcd.print(chainevide20);
                break;
            }
            delay(200);
            if (digitalRead(validate) == LOW && selecteur != nombremenu)
            {
              level = 2;
              Sous_sous_menu = selecteur;
     
            }
            else if (digitalRead(validate) == LOW && selecteur == nombremenu)
            {
              level--;
              S_menu = LOW;
              delay(200);
            }
          }
          else if ( S_menu == 1 ) // menu croissance
          { }
          else if (S_menu == 5 ) // Menu forcer état
          {
            nombremenu = 17;
            selecteurmenu(nombremenu);
            Sous_sous_menu = selecteur;
            lcd.setCursor(0, 0);
            lcd.print(F("   Forcer Etat    "));
            lcd.setCursor(16, 0);
            lcd.print(pages);
            lcd.print("-");
            lcd.print(selecteur);
     
            delay(200);
            switch (pages)
            {
              case 1:
                lcd.setCursor(1, 1);
                lcd.print(F("Etat lampe cro     "));//1
                lcd.setCursor(1, 2);
                lcd.print(F("Etat lampe flo     "));//2
                lcd.setCursor(1, 3);
                lcd.print(F("Etat lampe flo1    "));//3
                break;
     
              case 2:
                lcd.setCursor(1, 1);
                lcd.print(F("Pompe cro          "));//4
                lcd.setCursor(1, 2);
                lcd.print(F("Pompe flo          "));//5
                lcd.setCursor(1, 3);
                lcd.print(F("Pompe flo1         "));//6
                break;
     
              case 3:
                lcd.setCursor(1, 1);
                lcd.print(F("Extra air cro      "));//7
                lcd.setCursor(1, 2);
                lcd.print(F("Extra lampe flo 1  "));//8
                lcd.setCursor(1, 3);
                lcd.print(F("Extra lampe flo 2  "));//9
                break;
     
              case 4:
                lcd.setCursor(1, 1);
                lcd.print(F("Extra filtre flo 1 "));//10
                lcd.setCursor(1, 2);
                lcd.print(F("Extra filtre flo 2 "));//11
                lcd.setCursor(1, 3);
                lcd.print(F("Chauffage eau flo1 "));//13
                break;
     
              case 5:
                lcd.setCursor(1, 1);
                lcd.print(F("Chauffage eau flo2 "));//14
                lcd.setCursor(1, 2);
                lcd.print(F("Brasseur flo       "));//15
                lcd.setCursor(1, 3);
                lcd.print(F("Brasseur flo1      "));//16
                break;
     
              case 6:
                lcd.setCursor(1, 1);
                lcd.print(F("non defini        "));//12
                lcd.setCursor(1, 2);
                lcd.print(F("return             "));//12
                lcd.setCursor(0, 3);
                lcd.print(chainevide20);
                break;
     
            }
     
            if (digitalRead(validate) == LOW && Sous_sous_menu != nombremenu)
            {
     
              level = 2;
              Sous_sous_menu = selecteur;
            }
            else if (digitalRead(validate) == LOW && Sous_sous_menu == nombremenu)
            {
              level--;
              S_menu = 0;
              delay(200);
            }
     
          }   //fin
          else if (( S_menu == 6 )) // selection activation mode
          {  }
          //fin
        }
     
        else if (level == 2)
        {
          switch (S_menu)
          {
            case 6: //si sous menu 3 est activer
              break;
            case 1: //si sous menu 1 est activer
              break;
            case 2: //si sous menu 2 est activer (floraison)
              Sous_menu = 0;
              lcd.setCursor(0, 0);
              switch (Sous_sous_menu)
              {
     
                case 1:
                  lcd.print(F("   Lampe on flo 1   "));
     
                  break;
                case 2:
                  lcd.print(F("   Lampe off flo 1   "));
                  break;
                case 3:
                  lcd.print(F("Pompe on jour flo 1 "));
                  break;
                case 4:
                  lcd.print(F("Pompe off jour flo 1"));
                  break;
                case 5:
                  lcd.print(F("Pompe on nuit flo 1"));
                  break;
                case 6:
                  lcd.print(F("Pompe off nuit flo 1"));
                  break;
                case 7:
                  lcd.print(F("Brasseur flo 1 on"));
                  break;
     
                  /* case 8:
                    lcd.print(F(" Brasseur flo 1 off "));
                    break;
     
                    case 9:
                    lcd.setCursor(0, 0);
                    lcd.print(F("Chauffage eau flo 1 "));
                    lcd.setCursor(0, 1);
                    lcd.print(F("                    "));
                    lcd.setCursor(0, 2);
                    lcd.print(F("Chauffage eau:"));
                    lcd.setCursor(0, 3);
                    lcd.print(F("                    "));
                    heat_water_flo_actif = modifyonoff(heat_water_flo_actif);
                    break;
                    case 10:
                    lcd.print(F(" Extra Lampe flo 1  "));
                    modifytemperatureextraction(&temperatureextraflo_on, &temperatureextraflo_off);
                    break;
                  */
              }
     
              break;
     
            case 3: //si sous menu 3 est activer
              break;
            case 5: //si sous menu 3 est activer
     
              Sous_menu = 0;
              lcd.setCursor(0, 0);
     
              switch (Sous_sous_menu)
              {
                case 1:
                  lcd.print(F("Lampe cro"));
                  break;
                case 2:
                  lcd.print(F("Lampe flo1"));
                  break;
                case 3:
                  lcd.print(F("Lampe flo2"));
                  break;
                case 4:
                  lcd.print(F("Pompe cro     "));
                  break;
                case 5:
                  lcd.print(F("     Pompe flo1     "));
                  break;
                case 6:
                  lcd.print(F("     Pompe flo2     "));
                  break;
                case 7:
                  lcd.print(F("   Etat extra cro   "));
                  break;
                case 8:
                  lcd.print(F("  Extra lampe flo1  "));
                  break;
                case 9:
                  lcd.print(F("  Extra lampe flo2  "));
                  break;
                case 10:
                  lcd.print(F("  Extra filtre flo1 "));
                  break;
                case 11:
                  lcd.print(F("  Extra filtre flo2 "));
                  break;
                case 12:
                  lcd.print(F(" Chauffage eau flo1 "));
                  break;
                case 13:
                  lcd.print(F(" Chauffage eau flo2 "));
                  break;
                case 14:
                  lcd.print(F("   Brasseur flo1    "));
                  break;
                case 15:
                  lcd.print(F("   Brasseur flo2    "));
                  break;
                case 16:
                  lcd.print(F("   non défini    "));
                  break;
              }
              break;
     
          }
          if ((selecteur == nombremenu) and ( digitalRead(validate) == LOW))             //gestion du return
          {
            setSelecteur(Sous_sous_menu); // modifie selecteur en gardant l'intégrité / cohérence pour les interruptions
            S_menu = 0;
            level--;
          }
        }
      }
     
      if (menuActif && (millis() - previousmillismenu >= temps_menu)) //sinon si le temps est depassé  quitte le menu
      {
        level = 0;
        pages = 1;
        setSelecteur(1);  // modifie selecteur en gardant l'intégrité / cohérence pour les interruptions
        menuActif = false;
        S_menu = 0;
        Sous_sous_menu = LOW;
        Sous_menu = LOW;
        lcd.clear();
      }
      if (menuActif) {}
     
    }
     
     
    void selecteurmenu(int nombremenu)
    {
      if (selecteur > nombremenu) {
        setSelecteur(1);  // modifie selecteur en gardant l'intégrité / cohérence pour les interruptions
      }
      else if (selecteur < 1)
      {
        setSelecteur(nombremenu);  // modifie selecteur en gardant l'intégrité / cohérence pour les interruptions
     
      }
     
      if (selecteur == 1 or selecteur == 4 or selecteur == 7 or selecteur == 10 or selecteur == 13 or selecteur == 16 or selecteur == 19 or selecteur == 22 or selecteur == 25 or selecteur == 28)
      {
        lcd.setCursor(0, 1);
        lcd.print((char)35);
        lcd.setCursor(0, 2);
        lcd.print((char)32);
        lcd.setCursor(0, 3);
        lcd.print((char)32);
      }
      else if (selecteur == 2 or selecteur == 5 or selecteur == 8 or selecteur == 11 or selecteur == 14 or selecteur == 17 or selecteur == 20 or selecteur == 23 or selecteur == 26 or selecteur == 29)
      {
        lcd.setCursor(0, 1);
        lcd.print((char)32);
        lcd.setCursor(0, 2);
        lcd.print((char)35);
        lcd.setCursor(0, 3);
        lcd.print((char)32);
      }
      else if (selecteur == 3 or selecteur == 6 or selecteur == 9 or selecteur == 12 or selecteur == 15 or selecteur == 18 or selecteur == 21 or selecteur == 24 or selecteur == 27 or selecteur == 30)
      {
        lcd.setCursor(0, 1);
        lcd.print((char)32);
        lcd.setCursor(0, 2);
        lcd.print((char)32);
        lcd.setCursor(0, 3);
        lcd.print((char)35);
      }
     
      if (selecteur > 0 && selecteur < 4)
      {
        pages = 1;
      }
      else if (selecteur >= 4 && selecteur < 7)
      {
        pages = 2;
      }
      else if (selecteur >= 7 && selecteur < 10)
      {
        pages = 3;
      }
     
      else if (selecteur >= 10 && selecteur < 13)
      {
        pages = 4;
      }
      else if (selecteur >= 13 && selecteur < 16)
      {
        pages = 5;
      }
      else if (selecteur >= 16 && selecteur < 19)
      {
        pages = 6;
      }
      else if (selecteur >= 19 && selecteur < 22)
      {
        pages = 7;
      }
      else if (selecteur >= 22 && selecteur < 25)
      {
        pages = 8;
      }
      else if (selecteur >= 25 && selecteur < 28)
      {
        pages = 9;
      }
      else if (selecteur >= 28 && selecteur < 31)
      {
        pages = 10;
      }
    }
     
    void Rotation()
    {
      static volatile byte etatISR = 0;
      etatISR = etatISR << 1 | digitalRead(portA);
      etatISR = etatISR << 1 | digitalRead(portB);
      etatISR &= 0b00001111;  //on ne prend que les 4 bits de poids faible
     
      if (etatISR == 0b0111 ) {
        selecteurISR++;
        previousmillismenuISR = millis();
      } else if (etatISR == 0b1101) {  //test des 4 bits de poids faible
        selecteurISR--;
        previousmillismenuISR = millis();
      }
    }



    PS: Sans jugement de valeur... ma première réaction c'est "Mais quel bazar !"...
    C'est quoi tous ces onglets avec du code entièrement commenté ou d'autres avec du code hors de toute fonction ? comment voulez vous vous y retrouver ou maintenir quoi que ce soit ?
    #include c'est fait pour structurer le code en modules qui contiennent des fonctions ou autres entités plus ou moins autonomes. On ne l'utilise pas pour injecter des bouts de code.


    - Pour l'initialisation de variables globales vous faites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned long previous_millis_capteur_cro = millis() + 10000;
    unsigned long current_millis_capteur_cro = millis();
    . Comme millis() vaut 0 à ce moment là, autant mettre 0 et 10000 dans les variables.




    - Pouvez vous clarifier si Sous_menu et Sous_sous_menu sont des indices dans un tableau ou une tension ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      menu = LOW;
      S_menu = 0;
      Sous_sous_menu = = LOW;
      Sous_menu = = LOW;


    - Pourquoi Sous_menu est un octet alors que Sous_sous_menu est un int?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    byte Sous_menu;
    int Sous_sous_menu ;

    - Pouvez vous expliquer ce que vous faites avec cette fonction?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte modifyetat(byte *relay, int *previousCompteur , byte *modify_etat, byte *selecteur, byte *level) ;
    Dans une partie commentée du code je vois que vous faites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            //modifyetat(&etatrelay[Sous_sous_menu], &previousCompteur , &modify_etat, &selecteur, &level);
    Pourquoi passer des pointeurs sur des octets alors que ce sont des variables globales que vous modifiez ? de plus cette fonction est supposée retourner un byte mais elle ne retourne rien. (à déclarer en void)



    - Quand vous voulez masquer des bits, ne faites pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      byte etat_test = (etat | B11110000) - B11110000;//test des 4 bits de poids faible
    faites simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      byte etat_test = etat & B00001111; // test des 4 bits de poids faible

    - Comme vous avez commenté le delay(), vous n'aurez pas le temps de voir votre message de mise en route, il va s'effacer juste après avoir été affiché
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      // Message de mise en route
      lcd.print(F("  Automate poezadri  "));
      lcd.setCursor(0, 1);
      lcd.print(F(" CHAMBRE DE CULTURE flo 1 "));
      lcd.setCursor(0, 2);
      lcd.print(F(" INITIALISATION... "));
      lcd.setCursor(0, 3);
      lcd.print(F("    VERSION V1.0    "));
      //delay(3000);
      lcd.clear();
    - idem pour le test de présence de carte SD. Comme le code de gestion de la SD est commenté, toute cette partie SD ne sert à rien en fait ??

    - Si vous veniez à utiliser la carte SD, si le fichier n'est pas bien formaté avec des \n sur la dernière ligne, votre lecture de fichier () va partir en boucle infinie
    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
      while (config_file.available() > 0 )  { // <=== ICI VOUS TESTEZ LA DISPO D'UN SEUL OCTET
        /* Récupère une ligne entière dans le buffer */
        i = 0;
        while ((buffer[i++] = config_file.read()) != '\n'). // <=== ICI VOUS EN LISEZ PLEIN 
        {
    
          /* Si la ligne dépasse la taille du buffer */
          if (i == BUFFER_SIZE)
          {
    
            /* On finit de lire la ligne mais sans stocker les données */
            while (config_file.read() != '\n');  // <=== ICI VOUS EN RISQUEZ LA BOUCLE INFINIE SI FIN DE FICHIER 
            break; // Et on arrête la lecture de cette ligne
          }
        }
    Que se passe-t-il si vous avez des "\r\n" comme fin de ligne et pas juste "\n" ?

  3. #3
    Membre averti
    Femme Profil pro
    devellopement sur temps libre
    Inscrit en
    Mars 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : devellopement sur temps libre
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 27
    Par défaut
    Citation Envoyé par Jay M Voir le message
    Qu'entendez vous par ? est-ce que ça veut dire que le menu n'est pas sur sa bonne ligne?
    j'ai réussi a stopper le phénomènes en découpant mes switch dans le level2 avec des if et des else if avec la variable pages. En faite ce qu'il ce passait si je rentre dans le sous menu croissance et que je selectionne le premier paramètres par exemples heures lampe on l'arduino redémarre par contre si je descend sur pompe on jour la j'ai access au réglage "heure lampe on " alors que la valeur de mon selecteur est correcte
    encore mieux floraison 1 et floraison 2 sont identiques j'ai été obligé de découper mon switch dans "level 2" pour "floraison 2" alors que "floraison 1" fonctionne bien

    Citation Envoyé par Jay M Voir le message
    Je vois que vous utilisez des interruptions pour lire un encodeur rotatif. Dans votre ISR Vous utilisez des variables qui ne sont pas déclarées en volatile. il faut le faire pour etat, Compteur, selecteur, previousmillismenu. (en fait Compteur ne sert à rien, autant le virer).

    ==> Il se pourrait que vous soyez victime d'une corruption d'une de ces variables pendant l'interruption et dans le code principal l'accès à ces variables devrait être en zone critique ou se faire sur une copie.
    j'ai fait les modifs préconiser viré compteur et passé les autres variable en volatile repris votre code pour l'encodeur rotatif mais le problème reste le même


    Citation Envoyé par Jay M Voir le message
    PS: Sans jugement de valeur... ma première réaction c'est "Mais quel bazar !"...
    C'est quoi tous ces onglets avec du code entièrement commenté ou d'autres avec du code hors de toute fonction ? comment voulez vous vous y retrouver ou maintenir quoi que ce soit ?
    #include c'est fait pour structurer le code en modules qui contiennent des fonctions ou autres entités plus ou moins autonomes. On ne l'utilise pas pour injecter des bouts de code.
    Sans vouloir me justifier je pensait bien faire en séparant mon code, le code commenté sert belle et bien a quelques chose c'est juste qu'en vu des problèmes que j'ai j'ai préféré commenter tout le reste pour voir si le problème ne venait pas ces morceau de code, de plus j'ai écrit ce code il y a déja plusieur mois/année et je me remet seulement dessus (enfin ca fait 7 jours/nuit que je me fait des cheveux blanc) par contre j'ai bien entendu vos remarques et j'en prends notes

    Citation Envoyé par Jay M Voir le message
    - Pouvez vous clarifier si Sous_menu et Sous_sous_menu sont des indices dans un tableau ou une tension ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      menu = LOW;
      S_menu = 0;
      Sous_sous_menu = = LOW;
      Sous_menu = = LOW;
    - Pourquoi Sous_menu est un octet alors que Sous_sous_menu est un int?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    byte Sous_menu;
    int Sous_sous_menu ;
    qu'entendez vous par indices dans un tableau ou une tension je pense que c'est l'utilisation l'attribut LOW qui vous mets le doute si c'est bien ça il est la pour dire 0 et les variables servent uniquement pour le menu, sinon pour l'histoire de byte et de int cela va avec le bazar et surtout un manque de réflexion avant la déclaration des variables qui ont changer de type entre 2 et celle ci est passer entre les mailles

    Citation Envoyé par Jay M Voir le message
    - Pouvez vous expliquer ce que vous faites avec cette fonction?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte modifyetat(byte *relay, int *previousCompteur , byte *modify_etat, byte *selecteur, byte *level) ;
    Dans une partie commentée du code je vois que vous faites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            //modifyetat(&etatrelay[Sous_sous_menu], &previousCompteur , &modify_etat, &selecteur, &level);
    Pourquoi passer des pointeurs sur des octets alors que ce sont des variables globales que vous modifiez ? de plus cette fonction est supposée retourner un byte mais elle ne retourne rien. (à déclarer en void)
    la fonction modifyétat me permet d'attribuer un mode de fonctionnement à mes différents relais: par exemple pour les lampe marche auto(en fonction de l'heure ), marche forcé, et éteint forcé

    j'ai aussi fait les modifs indiquer sur la fonction j'ai par contre gardé le pointeur sur mes relais sinon je ne sais pas pourquoi mais l'état n'est pas sauvegardé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void modifyetat(byte *relay)
    Citation Envoyé par Jay M Voir le message
    - Comme vous avez commenté le delay(), vous n'aurez pas le temps de voir votre message de mise en route, il va s'effacer juste après avoir été affiché
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      // Message de mise en route
      lcd.print(F("  Automate poezadri  "));
      lcd.setCursor(0, 1);
      lcd.print(F(" CHAMBRE DE CULTURE flo 1 "));
      lcd.setCursor(0, 2);
      lcd.print(F(" INITIALISATION... "));
      lcd.setCursor(0, 3);
      lcd.print(F("    VERSION V1.0    "));
      //delay(3000);
      lcd.clear();
    - idem pour le test de présence de carte SD. Comme le code de gestion de la SD est commenté, toute cette partie SD ne sert à rien en fait ??
    oui je sais j'en avais juste marre d'attendre 5seconde avant de pouvoir retester chaque fonction


    Citation Envoyé par Jay M Voir le message
    - Si vous veniez à utiliser la carte SD, si le fichier n'est pas bien formaté avec des \n sur la dernière ligne, votre lecture de fichier () va partir en boucle infinie
    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
      while (config_file.available() > 0 )  { // <=== ICI VOUS TESTEZ LA DISPO D'UN SEUL OCTET
        /* Récupère une ligne entière dans le buffer */
        i = 0;
        while ((buffer[i++] = config_file.read()) != '\n'). // <=== ICI VOUS EN LISEZ PLEIN 
        {
    
          /* Si la ligne dépasse la taille du buffer */
          if (i == BUFFER_SIZE)
          {
    
            /* On finit de lire la ligne mais sans stocker les données */
            while (config_file.read() != '\n');  // <=== ICI VOUS EN RISQUEZ LA BOUCLE INFINIE SI FIN DE FICHIER 
            break; // Et on arrête la lecture de cette ligne
          }
        }
    Que se passe-t-il si vous avez des "\r\n" comme fin de ligne et pas juste "\n" ?
    pour la carte SD je prends notes de vos remarque et retravaillerais ça plus tard car ce n'est pas mon problème principale.

    Sinon je vous remet mon code modifié le menu fonctionne parfaitement de cette façon par contre les switch dans les if, else if dans level 2 ne me plaise pas du tout mais sait le seul moyens que j'ai trouver

    automate.ino
    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
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    730
    731
    732
    733
    734
    735
    736
    737
    738
    739
    740
    741
    742
    743
    744
    745
    746
    747
    748
    749
    750
    751
    752
    753
    754
    755
    756
    757
    758
    759
    760
    761
    762
    763
    764
    765
    766
    767
    768
    769
    770
    771
    772
    773
    774
    775
    776
    777
    778
    779
    780
    781
    782
    783
    784
    785
    786
    787
    788
    789
    790
    791
    792
    793
    794
    795
    796
    797
    798
    799
    800
    801
    802
    803
    804
    805
    806
    807
    808
    809
    810
    811
    812
    813
    814
    815
    816
    817
    818
    819
    820
    821
    822
    823
    824
    825
    826
    827
    828
    829
    830
    831
    832
    833
    834
    835
    836
    837
    838
    839
    840
    841
    842
    843
    844
    845
    846
    847
    848
    849
    850
    851
    852
    853
    854
    855
    856
    857
    858
    859
    860
    861
    862
    863
    864
    865
    866
    867
    868
    869
    870
    871
    872
    873
    874
    875
    876
    877
    878
    879
    880
    881
    882
    883
    884
    885
    886
    887
    888
    889
    890
    891
    892
    893
    894
    895
    896
    897
    898
    899
    900
    901
    902
    903
    904
    905
    906
    907
    908
    909
    910
    911
    912
    913
    914
    915
    916
    917
    918
    919
    920
    921
    922
    923
    924
    925
    926
    927
    928
    929
    930
    931
    932
    933
    934
    935
    936
    937
    938
    939
    940
    941
    942
    943
    944
    945
    946
    947
    948
    949
    950
    951
    952
    953
    954
    955
    956
    957
    958
    959
    960
    961
    962
    963
    964
    965
    966
    967
    968
    969
    970
    971
    972
    973
    974
    975
    976
    977
    978
    979
    980
    981
    982
    983
    984
    985
    986
    987
    988
    989
    990
    991
    992
    993
    994
    995
    996
    997
    998
    999
    1000
    1001
    1002
    1003
    1004
    1005
    1006
    1007
    1008
    1009
    1010
    1011
    1012
    1013
    1014
    1015
    1016
    1017
    1018
    1019
    1020
    1021
    1022
    1023
    1024
    1025
    1026
    1027
    1028
    1029
    1030
    1031
    1032
    1033
    1034
    1035
    1036
    1037
    1038
    1039
    1040
    1041
    1042
    1043
    1044
    1045
    1046
    1047
    1048
    1049
    1050
    1051
    1052
    1053
    1054
    1055
    1056
    1057
    1058
    1059
    1060
    1061
    1062
     
     
    #include <SD.h>
    #include <SPI.h>
    #include <LiquidCrystal.h>
    #include <Wire.h>
    #include <Arduino.h>
    #include <DS1307.h>
    #include "DHT.h"
    //////////////////////////////////////////////////////////////PINOUT////////////////////////////////////////////////////
    LiquidCrystal lcd(5, 7, 15, 13, 11, 9);
    #define retro 17
    #define DHTcro 27
    #define DHTflo 29
    #define DHTflo1 30
    #define validate 18
    #define portA 2
    #define portB 3
    #define CS_pin_sd 53
    //croissance
    #define lampe_cro 34
    #define pompe_1 32
    #define extra_cro A14
    #define heatwater_cro A12
     
    #define hAterre_1 A5
    #define hAterre_2 A2
    #define hAterre_3 A1
    #define hNterre_1 A7
    #define hNterre_2 A0
    #define hNterre_3 A3
     
    // floraison
    #define lampe_flo A10
    #define pompe_2 A8
    #define extra_lampe_flo A6
    #define extra_filtre_flo A4
    #define brasseur_flo 48
    #define heatwater_flo 47
    #define DHT_flo 46
     
    // floraison1
    #define lampe_flo1 44
    #define pompe_3 42
    #define extra_lampe_flo1 40
    #define extra_filtre_flo1 38
    #define brasseur_flo1 36
     
     
    DHT dht_cro(DHTcro, DHT11);
    DHT dht_flo(DHTflo, DHT11);
    DHT dht_flo1(DHTflo1, DHT11);
     
    Sd2Card card;
    SdVolume volume;
    SdFile root;
     
    File fichier;
    DS1307 rtc;
     
    volatile unsigned long previousmillismenuISR;
    volatile byte selecteurISR = 1;
     
    ///////////////////////////////////////////congiguration du programmes/////////////////////////////////////
     
    //----------Croissance----------//
     
    word lampe_on_cro = 1730;                            //lampe croissance
    word lampe_off_cro = 1400;                           //lampe croissance
    unsigned long pompe_cro_on_j = 1000;                //pompe croissance
    unsigned long pompe_cro_on_n = 2000;                //pompe croissance
    unsigned long pompe_cro_off_j = 3000 ;               //pompe croissance
    unsigned long pompe_cro_off_n = 4000;               //pompe croissance
    word lampe_on_flo = 1730;                             //lampe floraison
    word lampe_off_flo = 1400;                            //lampe floraison
    unsigned long pompe_flo_on_j = 2000;                 // pompe floraison
    unsigned long pompe_flo_off_j = 3000;                // pompe floraison
    unsigned long pompe_flo_on_n = 4000;                 // pompe floraison
    unsigned long  pompe_flo_off_n = 5000;                // pompe floraison
    unsigned long  intervalle_brasseur_on_flo = 2000;
    unsigned long  intervalle_brasseur_off_flo = 4000;
    boolean heat_water_flo_actif = false;                     //chauffage eau flo
    boolean extra_filtre_flo_actif = false;                   //extra floraison
    boolean brasseur_flo_actif = false;                       // brasseur floraison
     
    //-----------Floraison 1-------------------//
     
    unsigned long pompe_flo1_on_j = 2000;                // pompe floraison1
    unsigned long pompe_flo1_off_j = 3000;               // pompe floraison1
    unsigned long pompe_flo1_on_n = 4000;                // pompe floraison1
    unsigned long  pompe_flo1_off_n = 5000;               // pompe floraison1
     
    unsigned long  intervalle_brasseur_on_flo1 = 2000;    // brasseur floraison1
    unsigned long  intervalle_brasseur_off_flo1 = 2000;   // brasseur floraison1
     
    byte temperatureextracro_on = 27;
    byte temperatureextracro_off = 23;
    byte temperatureextraflo_on = 26;
    byte temperatureextraflo_off = 22;
    byte temperatureextraflo1_on = 25;
    byte temperatureextraflo1_off = 21;
    unsigned long temps_menu = 20000;
     
    word lampe_on_flo1 = 1700;                               //lampe on floraison1
    word lampe_off_flo1 = 1800;                              //lampe off floraison1
    boolean heat_water_flo1_actif = false;                     //chauffage eau flo1
    boolean extra_filtre_flo1_actif = false;                   //extra floraison1
    boolean brasseur_flo1_actif = false;                       // brasseur floraison1
    byte chaine;
     
    //////////////////////////////////Variables des du programme
     
    //heure et date
    int temps_perso;
    int date_perso;
    uint8_t sec, min, hour, day, month;
    uint16_t year;
    //fonction pompe
     
    boolean pomperelay_cro;
    boolean pomperelay_flo;
    boolean pomperelay_flo1;
    unsigned long current_millis_pompe;
    byte pompemode;
     
    unsigned long previous_millis_brasseur_flo_on;        //fonction brasseur flo
    unsigned long previous_millis_brasseur_flo1_on;       //fonction brasseur flo1
     
    //fonction lampe
    byte lampe_on;
    byte lampe_off;
    byte lampemode;
    //fonction commune
     
    unsigned long previous_millis_pompe1;
    unsigned long previous_millis_pompe2;
    unsigned long previous_millis_pompe3;
     
    unsigned int hsolA1;
    unsigned int hsolA2;
    unsigned int hsolA3;
    bool hsolN1;
    bool hsolN2;
    bool hsolN3;
    float t_cro;
    float t_flo;
    float t_flo1;
    float tension_p1;
    float tension_p2;
    float tension_p3;
     
    unsigned long previous_millis_capteur_cro = 10000;
    unsigned long current_millis_capteur_cro = 0;
     
    byte nombre_menu;
    boolean menu;
     
    byte S_menu_sauverconfig;
    byte  sous_menu_sauverconfig;
    byte Sous_menu;
    int previousCompteur;
    volatile byte selecteur;
    volatile unsigned long previousmillismenu;
    unsigned long previousmillisaffichage;
    unsigned long previousmillispages; //temps changement pages
    byte pages = 1;
    byte level = 0;
    byte nombremenu;
    byte fonction_menu;
    byte niveau_1;
     
     
    float h_cro;
    float h_flo;
    float h_flo1;
    byte etatpompe_cro = 0;
    byte etatpompe_flo = 0;
    byte etatpompe_flo1 = 0;
    unsigned long previousmillisdhtcro;
    unsigned long previousmillisdhtflo;
    unsigned long previousmillisdhtflo1;
    unsigned long previousmilliscapteur;
     
    boolean Mode1 = 0;
    boolean Mode2 = 0;
    boolean Mode3 = 0;
     
    long intervalle;
     
     
    int modify_h = 0;
     
    int lampeheuremode;
    word modify_heure = 0;
    int heure_mode;
    int minute_mode;
     
    unsigned long tempspompemode;
    unsigned long secondepompe;
    unsigned long heurepompe;
    unsigned long minutepompe;
    unsigned long tempspompe;
    byte modify_pompe;
     
    byte temperature_extra_on = 0;
    byte temperature_extra_off = 0;
    byte modify_temperature_extra;
     
    byte modify_onoff;
    byte modify_etat = 0;
    byte etatrelay[16] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
     
    void Rotation();
    int modifyheuref(int lampeheuremode);
    unsigned long modifytempspompe(unsigned long tempspompemode);
    void modifytemperatureextraction(byte *temperature_on, byte *temperature_off);
    void modifyonoff(boolean *onoff) ;
    void modifyetat(byte *relay) ;
    void selecteurmenu(byte nombremenu);
     
     
    void Pompe(int relay, int pompe_mode, int etat_lampe, unsigned long *previous_millis_pompe, unsigned long pompe_on_j, unsigned long pompe_off_j, unsigned long pompe_on_n, unsigned long pompe_off_n);
    void lampe(int lampe_on, int lampe_off, int relay , int temps_perso, int lampe_mode, int *etatlampe);
    void extratemperature(int temperatureextraon, int temperatureextraoff, int relay, int extra_mode, int temperature_mode);
    void allumeeteint(int mode_etat, int mode, int relay);
    void allumeinterval(unsigned long interval_on , unsigned long interval_off, int etat_mode, unsigned long *previous_millis_pompe, int relay);
     
     
    /*############################Constante affichage##########################*/
    const char chainevide20[] = "                    ";
     
    /*############################Fin constante affichage##########################*/
     
     
    void setSelecteur(byte s)
    {
      // SECTION CRITIQUE, ON MODIFIE UNE VARIABLE VOLATILE, ON S'ASSURE DE LA COHERENCE ENTRE LES DEUX */
      noInterrupts();
      selecteur = s;
      selecteurISR = selecteur;
      interrupts();
      // FIN DE SECTION CRITIQUE
    }
     
     
    void setup()
    {
      pinMode(portA, INPUT);                           //ENCODER ROTATIF
      pinMode(portB, INPUT);                           //ENCODER ROTATIF
      pinMode(validate, INPUT);                        //ENCODER ROTATIF
     
      attachInterrupt(0, Rotation, CHANGE);            //ENCODER ROTATIF
      attachInterrupt(1, Rotation, CHANGE);            //ENCODER ROTATIF
     
      Serial.begin(115200);                              //INITIALISATION SERIE
      lcd.begin(20, 4);                                //INITIALISATION LCD
      pinMode(retro, OUTPUT);
      rtc.start();                                     //RTC MODULE
     
      pinMode(lampe_cro, OUTPUT);
      pinMode(pompe_1, OUTPUT);
      pinMode(extra_cro, OUTPUT);
      pinMode(heatwater_cro, OUTPUT);
      pinMode(hAterre_1, INPUT);
      pinMode(hAterre_2, INPUT);
      pinMode(hAterre_3, INPUT);
      pinMode(hNterre_1, INPUT);
      pinMode(hNterre_2, INPUT);
      pinMode(hNterre_2, INPUT);
      pinMode(lampe_flo, OUTPUT);
      pinMode(pompe_2, OUTPUT);
      pinMode(DHT_flo, INPUT);
      pinMode(heatwater_flo, OUTPUT);
      pinMode(extra_lampe_flo, OUTPUT);
      pinMode(extra_filtre_flo, OUTPUT);
      pinMode(brasseur_flo, OUTPUT);
      pinMode(lampe_flo1, OUTPUT);
      pinMode(pompe_3, OUTPUT);
      pinMode(extra_lampe_flo1, OUTPUT);
      pinMode(extra_filtre_flo1, OUTPUT);
      pinMode(brasseur_flo1, OUTPUT);
      pinMode(CS_pin_sd, OUTPUT);
     
      digitalWrite(lampe_cro, 0);
      digitalWrite(pompe_1, 0);
      digitalWrite(extra_cro, 0);
      digitalWrite(heatwater_cro, 0);
      digitalWrite(lampe_flo, 0);
      digitalWrite(pompe_2, 0);
      digitalWrite(extra_lampe_flo, 0);
      digitalWrite(extra_filtre_flo, 0);
      digitalWrite(brasseur_flo, 0);
      digitalWrite(heatwater_flo, 0);
      digitalWrite(lampe_flo1, 0);
      digitalWrite(pompe_3, 0);
      digitalWrite(extra_lampe_flo1, 0);
      digitalWrite(extra_filtre_flo1, 0);
      digitalWrite(brasseur_flo1, 0);
     
      // initialisation du lcd
      digitalWrite(retro, HIGH);
     
     
      // Message de mise en route
      lcd.print(F("  Automate poezadri  "));
      lcd.setCursor(0, 1);
      lcd.print(F(" CHAMBRE DE CULTURE flo 1 "));
      lcd.setCursor(0, 2);
      lcd.print(F(" INITIALISATION... "));
      lcd.setCursor(0, 3);
      lcd.print(F("    VERSION V1.0    "));
     
      //delay(3000);
     
      lcd.clear();
     
      if (!SD.begin(CS_pin_sd))
      {
        lcd.setCursor(0, 1);
        lcd.print(F("Pas de carte SD"));
        // delay(2000);
        Serial.print(F("Pas de carte SD"));
        lcd.clear();
      }
      else
      {
        // #include "SDcard_f.h"
        // fichier = SD.open("conf.txt",FILE_WRITE);
      }
     
    }
     
    void loop()
    {
      // SECTION CRITIQUE, ON PREND UNE COPIE DE NOS VARIABLES */
      noInterrupts();
      previousmillismenu = previousmillismenuISR;
      selecteur = selecteurISR;
      interrupts();
      // FIN DE SECTION CRITIQUE
     
     
     
      //rtc.get(&sec, &min, &hour, &day, &month, &year);
     
     
      //temps_perso = (hour * 100) + min;  //creation temps_perso
      //date_perso = day, '/', month, '/', year;
     
      /*   //lecture  des capteur humidité terre
           if (millis()-previousmilliscapteur>=60000 )
             {
               hsolA1=(analogRead(hAterre_1));
               hsolA2=(analogRead(hAterre_2));
               hsolA3=(analogRead(hAterre_3));
     
               hsolN1=(digitalRead(hNterre_1));
               hsolN2=(digitalRead(hNterre_2));
               hsolN3=(digitalRead(hNterre_3));
     
               tension_p1= map(hsolA1, 300, 1023, 100, 0);
               tension_p2 = map(hsolA1, 300, 1023, 100, 0);
               tension_p3 = map(hsolA1, 300, 1023, 100, 0);
               previousmilliscapteur=millis();
             }
             //lecture des capteur d'humidité et temperature dht 11
           if (millis()-previousmillisdhtcro>=60000)
             {
               h_cro= dht_cro.readHumidity();
                t_cro = dht_cro.readTemperature();
               previousmillisdhtcro=millis();
             }
           if (millis()-previousmillisdhtflo>=60000)
             {
                h_flo = dht_flo.readHumidity();
                t_flo = dht_flo.readTemperature();
               previousmillisdhtflo=millis();
             }
           if (millis()-previousmillisdhtflo1>=60000)
             {
             //  h_flo1 = dht_flo1.readHumidity();
             //   t_flo1 = dht_flo1.readTemperature();
                 previousmillisdhtflo1=millis();
             }
     
      */
     
     
      if (menu == false && (digitalRead(validate) == LOW )) //si menu n'est pas activé et bouton est cliquer
      {
        menu = true; //active le menu
        setSelecteur(1);
        pages = 1;
        previousmillismenuISR = millis();
        previousmillismenu = millis();
        lcd.clear();
        delay(200);
      }
     
      if (menu == true ) //Si menu est activé
      {
        if (level == 0)
        {
          lcd.setCursor(0, 0);
          lcd.print (F("        Menu       "));
          lcd.setCursor(16, 0);
          lcd.print(pages);
          lcd.print("-");
          lcd.print(selecteur);
          nombremenu = 7;
          selecteurmenu(nombremenu);
          Sous_menu = selecteur;
     
     
          switch (pages) // selectionne la page de niveau 1
          {
            case 1:
     
              lcd.setCursor(1, 1);
              lcd.print(F("Mode Croissance    "));//1
              lcd.setCursor(1, 2);
              lcd.print(F("Mode floraison 1   "));//2
              lcd.setCursor(1, 3);
              lcd.print(F("Mode floraison 2   "));//3
              break;
            case 2:
              lcd.setCursor(1, 1);
              lcd.print(F("Sauver config      "));//4
              lcd.setCursor(1, 2);
              lcd.print(F("Forcer etat        "));//5
              lcd.setCursor(1, 3);
              lcd.print(F("Selection mode     "));//6
              break;
            case 3:
              lcd.setCursor(1, 1);
              lcd.print(F("Return             "));//7
              lcd.setCursor(1, 2);
              lcd.print(F("                   "));//8
              lcd.setCursor(1, 3);
              lcd.print(F("                   "));//9
              break;
          }
          delay(200);
          if (digitalRead(validate) == LOW) // selectionne le menu croissance flo ou flo1
          {
            Serial.print(pages);
            setSelecteur(1);
            level = 1;
            if (Sous_menu == 1 or Sous_menu == 2 or Sous_menu == 3 or Sous_menu == 5 or Sous_menu == 6)
            {
              niveau_1 = Sous_menu;
     
            }
     
            else if ( Sous_menu == 4 )
            {
                    }
            else if ( Sous_menu == 7 )
            {
              menu = false;
              level = 0;
              lcd.clear();
              delay(200);
              setSelecteur(1);
     
            }
          }
     
        }
        else if (level == 1)
        {
          if ( niveau_1 == 2 or niveau_1 == 3 ) // menu flo 1 ou flo2
          {
            lcd.setCursor(0, 0);
            if (niveau_1 == 2) {
              lcd.print(F("    Floraison 1     "));
            }
            else if (niveau_1 == 3) {
              lcd.print(F("    Floraison 2     "));
            }
            lcd.setCursor(16, 0);
            lcd.print(pages);
            lcd.print("-");
            lcd.print(selecteur);
     
            nombremenu = 11;
            selecteurmenu(nombremenu);
            fonction_menu = selecteur;
     
     
            switch (pages)
            {
              case 1:
                lcd.setCursor(1, 1);
                lcd.print(F("Heure On lampe     "));
                lcd.setCursor(1, 2);
                lcd.print(F("Heure Off lampe    "));
                lcd.setCursor(1, 3);
                lcd.print(F("Tps On pompe J     "));
                break;
     
              case 2:
                lcd.setCursor(1, 1);
                lcd.print(F("Tps Off pompe J    "));
                lcd.setCursor(1, 2);
                lcd.print(F("Tps On pompe N     "));
                lcd.setCursor(1, 3);
                lcd.print(F("Tps Off pompe N    "));
                break;
     
              case 3:
                lcd.setCursor(1, 1);
                lcd.print(F("Brasseur temps on  "));
                lcd.setCursor(1, 2);
                lcd.print(F("Brasseur temps off "));
                lcd.setCursor(1, 3);
                lcd.print(F("Heat water On      "));
                break;
     
              case 4 :
                lcd.setCursor(1, 1);
                lcd.print(F("Extra lampe        "));
                lcd.setCursor(1, 2);
                lcd.print(F("Return             "));
                lcd.setCursor(0, 3);
                lcd.print(chainevide20);
                break;
            }
            delay(200);
            if (digitalRead(validate) == LOW && selecteur != nombremenu)
            {
              level = 2;
              fonction_menu = selecteur;
              delay(200);
     
            }
            else if (digitalRead(validate) == LOW && fonction_menu == nombremenu)
            {
              level = 0;
              niveau_1 = 0;
              delay(200);
            }
          }
          else if ( niveau_1 == 1 ) // menu croissance
          {
     
            lcd.setCursor(0, 0);
            lcd.print(F("   Croissance 1   "));
            lcd.setCursor(16, 0);
            lcd.print(pages);
            lcd.print(F("-"));
            lcd.print(selecteur);
            nombremenu = 8;
            selecteurmenu(nombremenu);
            fonction_menu = selecteur;
     
            switch (pages) //AFFICHAGE PAGES MENU CRO
            {
              case 1:
                lcd.setCursor(1, 1);
                lcd.print(F("Heure On lampe     "));//1
                lcd.setCursor(1, 2);
                lcd.print(F("Heure Off lampe    "));//2
                lcd.setCursor(1, 3);
                lcd.print(F("Tps On pompe J     "));//3
                break;
              case 2:
                lcd.setCursor(1, 1);
                lcd.print(F("Tps Off pompe J    "));//4
                lcd.setCursor(1, 2);
                lcd.print(F("Tps On pompe N     "));//5
                lcd.setCursor(1, 3);
                lcd.print(F("Tps Off pompe N    "));//6
                break;
     
              case 3:
                lcd.setCursor(1, 1);
                lcd.print(F("Extraction air     "));//7
                lcd.setCursor(1, 2);
                lcd.print(F("Return             "));//8
                lcd.setCursor(1, 3);
                lcd.print(F("                   "));
                break;
            }
            delay(200);
     
            if (digitalRead(validate) == LOW && fonction_menu != nombremenu)
            {
              level = 2;
              fonction_menu = selecteur;
              delay(200);
     
            }
            else if (digitalRead(validate) == LOW && fonction_menu == nombremenu)
            {
              level = 0;
              niveau_1 = 0;
              setSelecteur(Sous_menu);
              delay(200);
            }
          }
          else if (niveau_1 == 5 ) // Menu forcer état
          {
            nombremenu = 17;
            selecteurmenu(nombremenu);
            fonction_menu = selecteur;
     
     
            lcd.setCursor(0, 0);
            lcd.print(F("   Forcer Etat    "));
            lcd.setCursor(16, 0);
            lcd.print(pages);
            lcd.print("-");
            lcd.print(selecteur);
     
     
            switch (pages)
            {
              case 1:
                lcd.setCursor(1, 1);
                lcd.print(F("Etat lampe cro     "));//1
                lcd.setCursor(1, 2);
                lcd.print(F("Etat lampe flo     "));//2
                lcd.setCursor(1, 3);
                lcd.print(F("Etat lampe flo1    "));//3
                break;
     
              case 2:
                lcd.setCursor(1, 1);
                lcd.print(F("Pompe cro          "));//4
                lcd.setCursor(1, 2);
                lcd.print(F("Pompe flo          "));//5
                lcd.setCursor(1, 3);
                lcd.print(F("Pompe flo1         "));//6
                break;
     
              case 3:
                lcd.setCursor(1, 1);
                lcd.print(F("Extra air cro      "));//7
                lcd.setCursor(1, 2);
                lcd.print(F("Extra lampe flo 1  "));//8
                lcd.setCursor(1, 3);
                lcd.print(F("Extra lampe flo 2  "));//9
                break;
     
              case 4:
                lcd.setCursor(1, 1);
                lcd.print(F("Extra filtre flo 1 "));//10
                lcd.setCursor(1, 2);
                lcd.print(F("Extra filtre flo 2 "));//11
                lcd.setCursor(1, 3);
                lcd.print(F("Chauffage eau flo1 "));//13
                break;
     
              case 5:
                lcd.setCursor(1, 1);
                lcd.print(F("Chauffage eau flo2 "));//14
                lcd.setCursor(1, 2);
                lcd.print(F("Brasseur flo       "));//15
                lcd.setCursor(1, 3);
                lcd.print(F("Brasseur flo1      "));//16
                break;
     
              case 6:
                lcd.setCursor(1, 1);
                lcd.print(F("non defini        "));//12
                lcd.setCursor(1, 2);
                lcd.print(F("return             "));//12
                lcd.setCursor(0, 3);
                lcd.print(chainevide20);
                break;
            }
            delay(200);
     
            if (digitalRead(validate) == LOW && fonction_menu != nombremenu)
            {
              level = 2;
              fonction_menu = selecteur;
              delay(200);
            }
            else if (digitalRead(validate) == LOW && fonction_menu == nombremenu)
            {
              level = 0;
              niveau_1 = 0;
              delay(200);
            }
     
          }   //fin
          else if (( niveau_1 == 6 )) // selection activation mode
          {
            nombremenu = 4;
            selecteurmenu(nombremenu);
            fonction_menu = selecteur;
            lcd.setCursor(0, 0);
            lcd.print("       Mode      ");
            lcd.setCursor(16, 0);
            lcd.print(pages);
            lcd.print("-");
            lcd.print(selecteur);
     
            switch (pages)
            {
              case 1:
                lcd.setCursor(1, 1);
                lcd.print(F("Mode cro           "));//1
                lcd.setCursor(1, 2);
                lcd.print(F("mode flo 1         "));//2
                lcd.setCursor(1, 3);
                lcd.print(F("Mode flo 2         "));//3
                break;
              case 2:
                lcd.setCursor(1, 1);
                lcd.print(F("Return             "));//1
                lcd.setCursor(1, 2);
                lcd.print(chainevide20);//2
                lcd.setCursor(1, 3);
                lcd.print(chainevide20);//3
                break;
            }
            delay(200);
            if (digitalRead(validate) == LOW && fonction_menu != nombremenu)
            {
              level = 2;
              fonction_menu = selecteur;
     
              delay(200);
            }
            else if (digitalRead(validate) == LOW && fonction_menu == nombremenu)
            {
              level = 0;
              niveau_1 = 0;
              delay(200);
     
            }
     
          }
          //fin
        }
        else if (level == 2)
        {
     
          switch (niveau_1)
          {
     
            case 6: //si sous menu 3 est activer
              Serial.print("coucou");
              lcd.setCursor(0, 1);
              lcd.print(chainevide20);
              lcd.setCursor(0, 3);
              lcd.print(chainevide20);
              if (fonction_menu == 1)
              {
                lcd.setCursor(0, 0);
                lcd.print(F("       Mode cro       "));
                lcd.setCursor(0, 2);
                lcd.print(F("Etat cro       "));
                modifyonoff(&Mode1);
              }
              else if (fonction_menu == 2)
              {
     
                lcd.setCursor(0, 0);
                lcd.print(F("      Mode flo1      "));
                lcd.setCursor(0, 2);
                lcd.print(F("Etat flo1      "));
     
                modifyonoff(&Mode2);
              }
     
              else if (fonction_menu == 3)
              {
                lcd.setCursor(0, 0);
                lcd.print(F("      Mode flo2     "));
                lcd.setCursor(0, 2);
                lcd.print(F("Etat flo2       "));
                modifyonoff(&Mode3);
     
              }
              break;
     
            case 1: //si sous menu 1 est activer menu croissance
              lcd.setCursor(0, 0);
              if (pages == 1 or pages == 2)
              {
     
                switch (fonction_menu)
                {
                  case 1:
                    lcd.print(F("Lampe on croissance "));
                    lampe_on_cro = modifyheuref(lampe_on_cro);
                    break;
                  case 2:
                    lcd.print(F("Lampe off croissance"));
                    lampe_off_cro = modifyheuref(lampe_off_cro);
                    break;
                  case 3:
                    lcd.print(F("Pompe on jour cro   "));
                    pompe_cro_on_j =  modifytempspompe(pompe_cro_on_j);
                    break;
                  case 4:
                    lcd.print(F("Pompe off jour cro  "));
                    pompe_cro_off_j =  modifytempspompe(pompe_cro_off_j);
                    break;
                  case 5:
                    lcd.print(F("Pompe on nuit cro   "));
                    pompe_cro_on_n =  modifytempspompe(pompe_cro_on_n);
                    break;
                  case 6:
                    lcd.print(F("Pompe off nuit cro  "));
                    pompe_cro_off_n = modifytempspompe(pompe_cro_off_n);
                    break;
                }
     
              }
              else if (pages == 3)
              {
                switch (fonction_menu)
                { case 7:
                    lcd.print(F("Extraction air cro  "));
                    modifytemperatureextraction(&temperatureextracro_on, &temperatureextracro_off);
                    break;
                }
              }
     
              break;
     
            case 2: //si sous menu 2 est activer (floraison)
              lcd.setCursor(0, 0);
              switch (fonction_menu)
              {
                case 1:
                  lcd.print(F("   Lampe on flo 1   "));
                  lampe_on_flo = modifyheuref(lampe_on_flo);
                  break;
                case 2:
                  lcd.print(F("   Lampe off flo 1   "));
                  lampe_off_flo = modifyheuref(lampe_off_flo);
                  break;
                case 3:
                  lcd.print(F("Pompe on jour flo 1 "));
                  pompe_flo_on_j = modifytempspompe(pompe_flo_on_j); //fonction ok
                  break;
                case 4:
                  lcd.print(F("Pompe off jour flo 1"));
                  pompe_flo_off_j = modifytempspompe(pompe_flo_off_j); //fonction ok
                  break;
                case 5:
                  lcd.print(F("Pompe on nuit flo 1"));
                  pompe_flo_on_n = modifytempspompe(pompe_flo_on_n); //fonction ok
                  break;
                case 6:
                  lcd.print(F("Pompe off nuit flo 1"));
                  pompe_flo_off_n = modifytempspompe(pompe_flo_off_n);
                  break;
                case 7:
                  lcd.print(F("Brasseur flo 1 on"));
                  intervalle_brasseur_on_flo = modifytempspompe(intervalle_brasseur_on_flo );
                  break;
                case 8:
                  lcd.print(F(" Brasseur flo 1 off "));
                  intervalle_brasseur_off_flo = modifytempspompe(intervalle_brasseur_off_flo );
                  break;
                case 9:
                  lcd.setCursor(0, 0);
                  lcd.print(F("Chauffage eau flo 1 "));
                  lcd.setCursor(0, 1);
                  lcd.print(F("                    "));
                  lcd.setCursor(0, 2);
                  lcd.print(F("Chauffage eau:"));
                  lcd.setCursor(0, 3);
                  lcd.print(F("                    "));
                  modifyonoff(&heat_water_flo_actif);
                  break;
                case 10:
                  lcd.print(F(" Extra Lampe flo 1  "));
                  modifytemperatureextraction(&temperatureextraflo_on, &temperatureextraflo_off);
                  break;
              }
              break;
            case 3: //si sous menu 3 est activer floraison 2
              lcd.setCursor(0, 0);
              if (pages == 1 or pages == 2)
              {
                switch (fonction_menu)
                {
                  case 1:
                    lcd.print(F("   Lampe on flo 2   "));
                    lampe_on_flo1 = modifyheuref(lampe_on_flo1);
                    break;
                  case 2:
                    lcd.print(F("   Lampe off flo 2   "));
                    lampe_off_flo1 = modifyheuref(lampe_off_flo1);
                    break;
                  case 3:
                    lcd.print(F("Pompe on jour flo 2 "));
                    pompe_flo1_on_j = modifytempspompe(pompe_flo1_on_j); //fonction ok
                    break;
                  case 4:
                    lcd.print(F("Pompe off jour flo 2"));
                    pompe_flo1_off_j = modifytempspompe(pompe_flo1_off_j); //fonction ok
                    break;
                  case 5:
                    lcd.print(F("Pompe on nuit flo 2"));
                    pompe_flo1_on_n = modifytempspompe(pompe_flo1_on_n); //fonction ok
                    break;
                  case 6:
                    lcd.print(F("Pompe off nuit flo 2"));
                    pompe_flo1_off_n = modifytempspompe(pompe_flo1_off_n);
                    break;
                }
                break;
              }
              else if (pages == 3 or pages == 4)
              {
                switch (fonction_menu)
                {
                  case 7:
                    lcd.print(F("Brasseur flo 2 on"));
                    intervalle_brasseur_on_flo1 = modifytempspompe(intervalle_brasseur_on_flo1 );
                    break;
                  case 8:
                    lcd.print(F(" Brasseur flo 2 off "));
                    intervalle_brasseur_off_flo1 = modifytempspompe(intervalle_brasseur_off_flo1 );
                    break;
                  case 9:
                    lcd.setCursor(0, 0);
                    lcd.print(F("Chauffage eau flo 2 "));
                    lcd.setCursor(0, 1);
                    lcd.print(F("                    "));
                    lcd.setCursor(0, 2);
                    lcd.print(F("Chauffage eau:"));
                    lcd.setCursor(0, 3);
                    lcd.print(F("                    "));
                    modifyonoff(&heat_water_flo1_actif);
                    break;
                  case 10:
                    lcd.print(F(" Extra Lampe flo 2  "));
                    modifytemperatureextraction(&temperatureextraflo1_on, &temperatureextraflo1_off);
                    break;
                }
                break;
              }
            case 5: //si sous menu 3 est activer
     
              lcd.setCursor(0, 0);
              if ( pages == 1 or pages == 2)
              {
                switch (fonction_menu)
                {
                  case 1:
                    lcd.print(F("Lampe cro"));
                    break;
                  case 2:
                    lcd.print(F("Lampe flo1"));
                    break;
                  case 3:
                    lcd.print(F("Lampe flo2"));
                    break;
                  case 4:
                    lcd.print(F("Pompe cro     "));
                    break;
                  case 5:
                    lcd.print(F("     Pompe flo1     "));
                    break;
                  case 6:
                    lcd.print(F("     Pompe flo2     "));
                    break;
                }
              }
              else if ( pages == 3 or pages == 4)
              {
                switch (fonction_menu)
                {
                  case 7:
                    lcd.print(F("   Etat extra cro   "));
                    break;
                  case 8:
                    lcd.print(F("  Extra lampe flo1  "));
                    break;
                  case 9:
                    lcd.print(F("  Extra lampe flo2  "));
                    break;
                  case 10:
                    lcd.print(F("  Extra filtre flo1 "));
                    break;
                  case 11:
                    lcd.print(F("  Extra filtre flo2 "));
                    break;
                  case 12:
                    lcd.print(F(" Chauffage eau flo1 "));
                    break;
                }
              }
              else   if ( pages == 5 or pages == 6)
              {
                switch (fonction_menu)
                {
                  case 13:
                    lcd.print(F(" Chauffage eau flo2 "));
                    break;
                  case 14:
                    lcd.print(F("   Brasseur flo1    "));
                    break;
                  case 15:
                    lcd.print(F("   Brasseur flo2    "));
                    break;
                  case 16:
                    lcd.print(F("   non défini    "));
                    break;
                }
              }
              modifyetat(&etatrelay[fonction_menu]);
              break;
          }
     
     
        }
        if ((selecteur == nombremenu) and ( digitalRead(validate) == LOW))             //gestion du return
        {
          setSelecteur(fonction_menu);
          niveau_1 = 0;
          level--;
     
        }
        if (millis() - previousmillismenu >= temps_menu) //sinon si le temps est depasser  quitte le menu
        {
          level = 0;
          pages = 1;
          setSelecteur(1);
          menu = false;
          fonction_menu = 0;
          Sous_menu = 0;
          niveau_1 = 0;
          lcd.clear();
        }
      }
     
     
      //#include "cro.h"   //mode 1
      //#include "flo.h" //mode 2
      //#include "flo1.h" //mode 3
     
    }
    #include"Fonctions_modifier.h"
    //#include"F_programmes.h"
     
    void Rotation()
    {
      static volatile byte etatISR = 0;
      etatISR = etatISR << 1 | digitalRead(portA);
      etatISR = etatISR << 1 | digitalRead(portB);
      etatISR &= 0b00001111;  //on ne prend que les 4 bits de poids faible
     
      if (etatISR == 0b0111 ) {
        selecteurISR++;
        previousmillismenuISR = millis();
      } else if (etatISR == 0b1101) {  //test des 4 bits de poids faible
        selecteurISR--;
        previousmillismenuISR = millis();
      }
    }
    //fin fonction
    et fonctions_modifier.h
    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
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
     
    void modifyetat(byte *relay)  // fonction ok
    {
      lcd.setCursor(0, 1);
      lcd.print(chainevide20);
      lcd.setCursor(0, 3);
      lcd.print(chainevide20);
      switch (*relay)
      {
        case 1:
          lcd.setCursor(0, 2);
          lcd.print(F("   automatique      "));
          break;
     
        case 2:
          lcd.setCursor(0, 2);
          lcd.print(F("   marche force     "));
          break;
     
        case 3:
          lcd.setCursor(0, 2);
          lcd.print(F("   eteint force     "));
          break;
      }
      if (modify_etat == 0)
      {
        previousCompteur = selecteur; //vaiable globale
        modify_etat = 2; //variable globale
        delay(500);
      }
      if ( digitalRead(validate) == LOW && modify_etat == 3)
      {
        level = 1; //vaiable globale
        modify_etat = 0; //vaiable globale
        setSelecteur(fonction_menu); //vaiable globale
        delay(200);
      }
      if ( modify_etat == 2)
      {
     
        lcd.setCursor(0, 3);
     
     
        if ( previousCompteur > selecteur)
        {
          *relay = *relay + 1;
          previousCompteur = selecteur; //vaiable globale
     
     
        }
        else if ( previousCompteur < selecteur)
        {
          *relay = *relay - 1; //vaiable globale mais teste fais avec un pointeur
          previousCompteur = selecteur; //vaiable globale
        }
        if (*relay > 3)
        {
          *relay = 1;
        }
        else if (*relay < 1)
        {
          *relay = 3;
        }
        if (digitalRead(validate) == LOW ) //Si bouton est activer
        {
          modify_etat = 3;
        }
      }
    }
     
    void modifytemperatureextraction(byte *temperature_on, byte *temperature_off)
    {
      if ( modify_temperature_extra == 0)
      {
     
        modify_temperature_extra = 1;
        lcd.clear();
        lcd.setCursor(0, 1);
        lcd.print(chainevide20);
        lcd.setCursor(19, 2);
        lcd.print((char)35);
        lcd.setCursor(19, 3);
        lcd.print(F(" "));
        delay(200);
      }
     
      if (digitalRead(validate) == LOW && modify_temperature_extra == 2)
      {
        modify_temperature_extra = 3;
        lcd.setCursor(19, 2);
        lcd.print(F(" "));
        lcd.setCursor(19, 3);
        lcd.print((char)35);
        delay(200);
      }
      if (digitalRead(validate) == LOW && modify_temperature_extra == 4)
      {
        modify_temperature_extra = 0;
        level--;
        selecteur = fonction_menu;
        delay(200);
        lcd.clear();
      }
     
     
      if (modify_temperature_extra == 1)
      {
        if ( previousCompteur < selecteur) {
          *temperature_on = *temperature_on + 1;
        }
        if ( previousCompteur > selecteur)  {
          *temperature_on = *temperature_on - 1;
        }
     
        if (*temperature_on > 50)
        {
          *temperature_on = 00;
        }
        if (*temperature_on < 00)
        {
          *temperature_on = 50;
        }
     
        if (digitalRead(validate) == LOW)
        {
          modify_temperature_extra = 2;
        }
        previousCompteur = selecteur;
     
     
      }
     
     
     
      if ( modify_temperature_extra == 3) //minute
      {
     
        if ( previousCompteur < selecteur)  {
          *temperature_off = *temperature_off + 1;
        }
        if ( previousCompteur > selecteur)  {
          *temperature_off = *temperature_off - 1;
        }
     
        if (*temperature_off > 50)
        {
          *temperature_off = 00;
        }
     
        if (*temperature_off < 00)
        {
          *temperature_off = 50;
        }
        if (digitalRead(validate) == LOW)
        {
          modify_temperature_extra = 4;
        }
        previousCompteur = selecteur;
      }
     
      lcd.setCursor(0, 2);
      lcd.print(F("T"));
      lcd.print((char)223);
      lcd.print(F("on:"));
      if (*temperature_on < 10 ) {
        lcd.print(0);
      }
      lcd.print(*temperature_on);
      lcd.print((char)223);
      lcd.print(F("C "));
      lcd.setCursor(0, 3);
      lcd.print(F("T"));
      lcd.print((char)223);
      lcd.print(F("off:"));
      if (*temperature_off < 10 ) {
        lcd.print(0);
      }
      lcd.print(*temperature_off);
      lcd.print((char)223);
      lcd.print(F("C  "));
     
    }
     
    //################################## Début de reglage de l'heure d'allumage ou d'extinction################################################################
    int  modifyheuref(int lampeheuremode)//fonction ok
    {
      if (modify_h == 0)
      {
        previousCompteur = selecteur;
        modify_h = 1;
        heure_mode = lampeheuremode / 100;
        minute_mode = lampeheuremode / 100;
        minute_mode *= 100;
        minute_mode = lampeheuremode - minute_mode;
        lcd.setCursor(0, 1);
        lcd.print(F("heure:    "));
        delay(200);
      }
      if (digitalRead(validate) == LOW && modify_h == 2)
      {
        modify_h = 3;
        lcd.setCursor(0, 1);
        lcd.print(F("Minute:  "));
        delay(200);
      }
      if (digitalRead(validate) == LOW && modify_h == 4)
      {
        lampeheuremode = ((heure_mode * 100) + minute_mode);
        modify_h = 0;
        level--;
        heure_mode = 0;
        minute_mode = 0;
     
        selecteur = fonction_menu;
     
        lcd.clear();
        delay(200);
      }
     
      if (modify_h == 1)
      {
        if (previousCompteur < selecteur)  {
          heure_mode = heure_mode + 1;
        }
        if (previousCompteur > selecteur)  {
          heure_mode = heure_mode - 1;
        }
        if (heure_mode > 23)
        {
          heure_mode = 00;
        }
     
        if (heure_mode < 00)
        {
          heure_mode = 23;
        }
        if (digitalRead(validate) == LOW)
        {
          modify_h = 2;
        }
        previousCompteur = selecteur;
      }
     
     
      if (modify_h == 3)
      {
        if (previousCompteur < selecteur)  {
          minute_mode = minute_mode + 1;
        }
        if (previousCompteur > selecteur)  {
          minute_mode = minute_mode - 1;
        }
     
        if (minute_mode > 59)
        {
          minute_mode = 00;
        }
        if (minute_mode < 00)
        {
          minute_mode = 59;
        }
     
        if (digitalRead(validate) == LOW)
        {
          modify_h = 4;
        }
        previousCompteur = selecteur;
      }
      lcd.setCursor(10, 1);
      lcd.print("          ");
      lcd.setCursor(0, 2);
      lcd.print("       ");
      lcd.setCursor(7, 2);
      if ( heure_mode < 10) {
        lcd.print(0);
      }
      lcd.print( heure_mode);
      lcd.print(F("H"));
      lcd.setCursor(10, 2);
      if ( minute_mode < 10) {
        lcd.print(0);
      }
      lcd.print( minute_mode);
      lcd.print(F("mn"));
      lcd.setCursor(14, 2);
      lcd.print(F("      "));
      lcd.setCursor(0, 3);
      lcd.print(chainevide20);
      return lampeheuremode;
    }
     
    //"################################Fin de reglage de l'heure d'allumage ou d'extinction####################################################################
     
    void modifyonoff(boolean *onoff ) //fonction ok
    {
     
      lcd.setCursor(14, 2);
      if (*onoff == 1) {
        lcd.print(F(" on  "));
      }
      else  {
        lcd.print(F(" off "));
      }
     
      if ( modify_onoff == 0)
      {
        modify_onoff = 1;
        delay(200);
        previousCompteur = selecteur;
      }
      if ( modify_onoff == 2)
      {
        Serial.println("coucou");
        level = level - 1;
        modify_onoff = 0;
        setSelecteur(fonction_menu);
        lcd.clear();
        delay(200);
        fonction_menu = 0;
      }
      if (modify_onoff == 1) //minute
      {
     
        if (previousCompteur != selecteur)
        {
     
          if (*onoff == 1)
          {
            *onoff = 0;
          }
          else {
            *onoff = 1;
     
          }
        }
     
        if (digitalRead(validate) == LOW )
        {
          modify_onoff = 2;
          delay(200);
        }
        previousCompteur = selecteur;
      }
    }
     
    unsigned long modifytempspompe(unsigned long tempspompemode)//fonction ok
    {
      if ( modify_pompe == 0)
      {
        previousCompteur = selecteur;
        modify_pompe = 1;
     
        int tempspompe = tempspompemode / 1000;
     
        if (tempspompe >= 3600)
        {
          heurepompe = tempspompe / 3600;
        }
        else
        {
          heurepompe = 0;
        }
        if (tempspompe > 59 )
        {
          minutepompe = heurepompe * 3600;
          minutepompe = tempspompe - minutepompe;
          minutepompe /= 60;
        }
        else
        {
          minutepompe = 0;
        }
        if (tempspompemode > 0 )
        {
          heurepompe *= 3600;
          minutepompe *= 60;
          secondepompe = (tempspompe - ((heurepompe) + (minutepompe))) ;
          minutepompe /= 60;
          heurepompe /= 3600;
          delay(200);
        }
        else
        {
          secondepompe = 0;
          delay(200);
        }
     
        lcd.setCursor(0, 1);
        lcd.print(F("heure:              "));
        delay(200);
      }
      lcd.setCursor(0, 2);
      lcd.print(F("    "));
      if (heurepompe < 10 ) {
        lcd.print(0);
      }
      lcd.print(heurepompe);
      lcd.print(F("h"));
      if (minutepompe < 10) {
        lcd.print(0);
      }
      lcd.print(minutepompe);
      lcd.print(F("mn"));
      if (secondepompe < 10) {
        lcd.print(0);
      }
      lcd.print(secondepompe);
      lcd.print(F("s"));
      lcd.print(F("     "));
      lcd.setCursor(0, 3);
      lcd.print(chainevide20);
     
      if (modify_pompe == 2)
      {
        modify_pompe = 3;
        lcd.setCursor(0, 1);
        lcd.print(F("Minute:             "));
        delay(200);
      }
      if (modify_pompe == 4)
      {
        modify_pompe = 5;
        lcd.setCursor(0, 1);
        lcd.print(F("seconde:            "));
        delay(200);
      }
      if (digitalRead(validate) == LOW && modify_pompe == 6)
      {
        unsigned long Hpompe = (( heurepompe * 3600) * 1000);
        unsigned long Mpompe = ((minutepompe * 60) * 1000);
        unsigned long Spompe = (secondepompe * 1000 ) ;
        tempspompemode =  Hpompe + Mpompe + Spompe;
        modify_pompe = 0;
        level = level - 1;
        heurepompe = 0;
        minutepompe = 0;
        secondepompe = 0;
        setSelecteur(fonction_menu);
        delay(200);
      }
      if (modify_pompe == 1)
      {
        if ( previousCompteur < selecteur) {
          heurepompe = heurepompe + 1;
        }
        if ( previousCompteur > selecteur)  {
          heurepompe = heurepompe - 1;
        }
        if (heurepompe > 23) {
          heurepompe = 00;
        }
        if (heurepompe < 00) {
          heurepompe = 23;
        }
        if (digitalRead(validate) == LOW)
        {
          modify_pompe = 2;
        }
      }
      if (modify_pompe == 3) //minute
      {
        if (previousCompteur < selecteur)  {
          minutepompe = minutepompe + 1;
        }
        if ( previousCompteur > selecteur)  {
          minutepompe = minutepompe - 1;
        }
        if (minutepompe > 59) {
          minutepompe = 00;
        }
        if (minutepompe < 00) {
          minutepompe = 59;
        }
        if (digitalRead(validate) == LOW)
        {
          modify_pompe = 4;
        }
      }
      if ( modify_pompe == 5) //seconde
      {
        if (previousCompteur < selecteur)  {
          secondepompe = secondepompe + 1;
        }
        if ( previousCompteur > selecteur) {
          secondepompe = secondepompe - 1;
        }
        if (secondepompe > 59) {
          secondepompe = 00;
        }
        if (secondepompe < 00) {
          secondepompe = 59;
        }
        if (digitalRead(validate) == LOW) {
          modify_pompe = 6;
        }
      }
      previousCompteur = selecteur;
      return tempspompemode;
    }
     
     
     
    // gere l'affichage du  et du menu selectionner
     
    void selecteurmenu(byte nombremenu)
    {
      if (selecteur > nombremenu)
      {
        setSelecteur(1);
      }
      else if (selecteur < 1)
      {
        setSelecteur(nombremenu);
      }
     
      if (selecteur == 1 or selecteur == 4 or selecteur == 7 or selecteur == 10 or selecteur == 13 or selecteur == 16 or selecteur == 19 or selecteur == 22 or selecteur == 25 or selecteur == 28)
      {
        lcd.setCursor(0, 1);
        lcd.print((char)35);
        lcd.setCursor(0, 2);
        lcd.print((char)32);
        lcd.setCursor(0, 3);
        lcd.print((char)32);
      }
      else if (selecteur == 2 or selecteur == 5 or selecteur == 8 or selecteur == 11 or selecteur == 14 or selecteur == 17 or selecteur == 20 or selecteur == 23 or selecteur == 26 or selecteur == 29)
      {
        lcd.setCursor(0, 1);
        lcd.print((char)32);
        lcd.setCursor(0, 2);
        lcd.print((char)35);
        lcd.setCursor(0, 3);
        lcd.print((char)32);
      }
      else if (selecteur == 3 or selecteur == 6 or selecteur == 9 or selecteur == 12 or selecteur == 15 or selecteur == 18 or selecteur == 21 or selecteur == 24 or selecteur == 27 or selecteur == 30)
      {
        lcd.setCursor(0, 1);
        lcd.print((char)32);
        lcd.setCursor(0, 2);
        lcd.print((char)32);
        lcd.setCursor(0, 3);
        lcd.print((char)35);
      }
     
      if (selecteur > 0 && selecteur < 4)
      {
        pages = 1;
      }
      else if (selecteur >= 4 && selecteur < 7)
      {
        pages = 2;
      }
      else if (selecteur >= 7 && selecteur < 10)
      {
        pages = 3;
      }
     
      else if (selecteur >= 10 && selecteur < 13)
      {
        pages = 4;
      }
      else if (selecteur >= 13 && selecteur < 16)
      {
        pages = 5;
      }
      else if (selecteur >= 16 && selecteur < 19)
      {
        pages = 6;
      }
      else if (selecteur >= 19 && selecteur < 22)
      {
        pages = 7;
      }
      else if (selecteur >= 22 && selecteur < 25)
      {
        pages = 8;
      }
      else if (selecteur >= 25 && selecteur < 28)
      {
        pages = 9;
      }
      else if (selecteur >= 28 && selecteur < 31)
      {
        pages = 10;
      }
    }
    et un grand merci avoir de vrais correction fais toujours du bien surtout quand on a pas été à l'écoles pour apprendre

  4. #4
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    j'ai fait les modifs préconiser viré compteur et passé les autres variable en volatile repris votre code pour l'encodeur rotatif mais le problème reste le même
    OK - mais avez vous testé le code complet tel que je vous ai donné ? présente-t-il le même problème ?

    j'ai réussi a stopper le phénomènes en découpant mes switch dans le level2 avec des if et des else if avec la variable pages
    ce n'est pas vraiment satisfaisant... Vous avez dû planquer le bug sous le tapis, un grand switch ne devrait pas poser de problèmes.

    Sans vouloir me justifier je pensait bien faire en séparant mon code,
    Le concept de modularité est bon, mais on n'utilise pas les include comme cela. On met dans des fichiers séparés ce qui concerne un groupe de fonctions s'occupant d'un même sujet par exemple, ou une classe etc, pas des morceaux de code afin de raccourcir la longueur d'un fichier.

    En faite ce qu'il ce passait si je rentre dans le sous menu croissance et que je sélectionne le premier paramètres par exemple heures lampe on l'arduino redémarre par contre si je descend sur pompe on jour la j'ai access au réglage "heure lampe on " alors que la valeur de mon sélecteur est correcte
    ça ressemble à un bug sur l'index, il y a un décalage qui se fait quelque part. Il faudrait suivre toutes les modifications du sélecteur.

  5. #5
    Membre averti
    Femme Profil pro
    devellopement sur temps libre
    Inscrit en
    Mars 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : devellopement sur temps libre
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 27
    Par défaut
    Citation Envoyé par Jay M Voir le message
    OK - mais avez vous testé le code complet tel que je vous ai donné ? présente-t-il le même problème ?
    cela est compliqué a dire il manque la moitié de mon menu et je n'est plus les fonctions le truc c'est que c'est quand j'essaye d'acceder au fonction depuis certain menu que ca plante
    Dans le menu croissance par exemple ou floraison 2 mais comme je l'ai dit ce que je trouve bizarre c'est que cela fonctionne bien sans aucune modif pour floraison 1 et la seule différence entre les 2menus ce sont les titres

    Citation Envoyé par Jay M Voir le message
    ce n'est pas vraiment satisfaisant... Vous avez dû planquer le bug sous le tapis, un grand switch ne devrait pas poser de problèmes.
    j'en suis bien conscient mais j'ai beau relire, simplifié, re-ranger mon code j'ai même réécrit mes conditions(exemple dans le niveau 1 je me suis rendu conte que mes condition pour quitter le menu ce répétait 3 fois pour rien ou encore que la gestion du return en fin de code ne sert strictement à rien) mais le problème reste le même sur ce dernier niveau sauf si je découpe mes switch dans des if et else

    Citation Envoyé par Jay M Voir le message
    Le concept de modularité est bon, mais on n'utilise pas les include comme cela. On met dans des fichiers séparés ce qui concerne un groupe de fonctions s'occupant d'un même sujet par exemple, ou une classe etc, pas des morceaux de code afin de raccourcir la longueur d'un fichier.
    ok donc dans mon programmes si je suis votre logique mes deux fichier contenant que des fonction (le fichier des fonction du menu et celle de gestion des divers appareil ) sont bien dans des fichiers séparer mais le code centrale doit ce retrouver dans un seul et même fichiers

    Citation Envoyé par Jay M Voir le message
    ça ressemble à un bug sur l'index, il y a un décalage qui se fait quelque part. Il faudrait suivre toutes les modifications du sélecteur.
    [/QUOTE]

    j'ai déja vérifier à plusieurs reprise mon sélecteur mais je vais recommencer je suis peut être passer a coter de quelques chose même si je trouve sa bizarre car certain menu fonctionne bien

  6. #6
    Membre averti
    Femme Profil pro
    devellopement sur temps libre
    Inscrit en
    Mars 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : devellopement sur temps libre
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 27
    Par défaut
    Bon j'ai revérifier mon selecteur et apremière vu ce n'est pas le problème par contre je viens d'avoir un nouveau problème avec switch quand je transforme ce code:

    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
     
    unsigned long modifytempspompe(unsigned long tempspompemode)//fonction ok
    {
      if ( modify_pompe == 0)
      {
        previousCompteur = selecteur;
        modify_pompe = 1;
     
        int tempspompe = tempspompemode / 1000;
     
        if (tempspompe >= 3600)
        {
          heurepompe = tempspompe / 3600;
        }
        else
        {
          heurepompe = 0;
        }
        if (tempspompe > 59 )
        {
          minutepompe = heurepompe * 3600;
          minutepompe = tempspompe - minutepompe;
          minutepompe /= 60;
        }
        else
        {
          minutepompe = 0;
        }
        if (tempspompemode > 0 )
        {
          heurepompe *= 3600;
          minutepompe *= 60;
          secondepompe = (tempspompe - ((heurepompe) + (minutepompe))) ;
          minutepompe /= 60;
          heurepompe /= 3600;
          delay(200);
        }
        else
        {
          secondepompe = 0;
          delay(200);
        }
     
        lcd.setCursor(0, 1);
        lcd.print(F("heure:              "));
        delay(200);
      }
      else if (modify_pompe == 1)
      {
        if ( previousCompteur < selecteur) {
          heurepompe = heurepompe + 1;
        }
        if ( previousCompteur > selecteur)  {
          heurepompe = heurepompe - 1;
        }
        if (heurepompe > 23) {
          heurepompe = 00;
        }
        if (heurepompe < 00) {
          heurepompe = 23;
        }
        if (digitalRead(validate) == LOW)
        {
          modify_pompe = 2;
        }
      }
      else if (modify_pompe == 2)
      {
        modify_pompe = 3;
        lcd.setCursor(0, 1);
        lcd.print(F("Minute:             "));
        delay(200);
      }
     else if (modify_pompe == 3) //minute
      {
        if (previousCompteur < selecteur)  {
          minutepompe = minutepompe + 1;
        }
        if ( previousCompteur > selecteur)  {
          minutepompe = minutepompe - 1;
        }
        if (minutepompe > 59) {
          minutepompe = 00;
        }
        if (minutepompe < 00) {
          minutepompe = 59;
        }
        if (digitalRead(validate) == LOW)
        {
          modify_pompe = 4;
        }
      }
     else if (modify_pompe == 4)
      {
        modify_pompe = 5;
        lcd.setCursor(0, 1);
        lcd.print(F("seconde:            "));
        delay(200);
      }
     else  if ( modify_pompe == 5) //seconde
      {
        if (previousCompteur < selecteur)  {
          secondepompe = secondepompe + 1;
        }
        if ( previousCompteur > selecteur) {
          secondepompe = secondepompe - 1;
        }
        if (secondepompe > 59) {
          secondepompe = 00;
        }
        if (secondepompe < 00) {
          secondepompe = 59;
        }
        if (digitalRead(validate) == LOW) {
          modify_pompe = 6;
        }
      }
      else if (modify_pompe == 6)
      {
        unsigned long Hpompe = (( heurepompe * 3600) * 1000);
        unsigned long Mpompe = ((minutepompe * 60) * 1000);
        unsigned long Spompe = (secondepompe * 1000 ) ;
        tempspompemode =  Hpompe + Mpompe + Spompe;
        modify_pompe = 0;
        level = level - 1;
        heurepompe = 0;
        minutepompe = 0;
        secondepompe = 0;
        setSelecteur(fonction_menu);
        delay(200);
      }
     
       lcd.setCursor(0, 2);
      lcd.print(F("    "));
      if (heurepompe < 10 ) {
        lcd.print(0);
      }
      lcd.print(heurepompe);
      lcd.print(F("h"));
      if (minutepompe < 10) {
        lcd.print(0);
      }
      lcd.print(minutepompe);
      lcd.print(F("mn"));
      if (secondepompe < 10) {
        lcd.print(0);
      }
      lcd.print(secondepompe);
      lcd.print(F("s"));
      lcd.print(F("     "));
      lcd.setCursor(0, 3);
      lcd.print(chainevide20);
     
      previousCompteur = selecteur;
      return tempspompemode;
    }
    En ça:
    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
     
    unsigned long modifytempspompe(unsigned long tempspompemode)//fonction ok
    {
      switch(modify_pompe)
      {
      case 0:
     
        previousCompteur = selecteur;
        modify_pompe = 1;
     
        int tempspompe = tempspompemode / 1000;
     
        if (tempspompe >= 3600)
        {
          heurepompe = tempspompe / 3600;
        }
        else
        {
          heurepompe = 0;
        }
        if (tempspompe > 59 )
        {
          minutepompe = heurepompe * 3600;
          minutepompe = tempspompe - minutepompe;
          minutepompe /= 60;
        }
        else
        {
          minutepompe = 0;
        }
        if (tempspompemode > 0 )
        {
          heurepompe *= 3600;
          minutepompe *= 60;
          secondepompe = (tempspompe - ((heurepompe) + (minutepompe))) ;
          minutepompe /= 60;
          heurepompe /= 3600;
          delay(200);
        }
        else
        {
          secondepompe = 0;
          delay(200);
        }
     
        lcd.setCursor(0, 1);
        lcd.print(F("heure:              "));
        delay(200);
     
       break;
      case 1:
     
        if ( previousCompteur < selecteur) {
          heurepompe = heurepompe + 1;
        }
        if ( previousCompteur > selecteur)  {
          heurepompe = heurepompe - 1;
        }
        if (heurepompe > 23) {
          heurepompe = 00;
        }
        if (heurepompe < 00) {
          heurepompe = 23;
        }
        if (digitalRead(validate) == LOW)
        {
          modify_pompe = 2;
        }
     
      break;
     case 2:
     
        modify_pompe = 3;
        lcd.setCursor(0, 1);
        lcd.print(F("Minute:             "));
        delay(200);
     
      break;
    case 3: //minute
     
        if (previousCompteur < selecteur)  {
          minutepompe = minutepompe + 1;
        }
        if ( previousCompteur > selecteur)  {
          minutepompe = minutepompe - 1;
        }
        if (minutepompe > 59) {
          minutepompe = 00;
        }
        if (minutepompe < 00) {
          minutepompe = 59;
        }
        if (digitalRead(validate) == LOW)
        {
          modify_pompe = 4;
        }
     
      break;
    case 4:
     
        modify_pompe = 5;
        lcd.setCursor(0, 1);
        lcd.print(F("seconde:            "));
        delay(200);
     
      break;
     case 5: //seconde
     
        if (previousCompteur < selecteur)  {
          secondepompe = secondepompe + 1;
        }
        if ( previousCompteur > selecteur) {
          secondepompe = secondepompe - 1;
        }
        if (secondepompe > 59) {
          secondepompe = 00;
        }
        if (secondepompe < 00) {
          secondepompe = 59;
        }
        if (digitalRead(validate) == LOW) {
          modify_pompe = 6;
        }
     
      break;
      case 6:
     
        unsigned long Hpompe = (( heurepompe * 3600) * 1000);
        unsigned long Mpompe = ((minutepompe * 60) * 1000);
        unsigned long Spompe = (secondepompe * 1000 ) ;
        tempspompemode =  Hpompe + Mpompe + Spompe;
        modify_pompe = 0;
        level = level - 1;
        heurepompe = 0;
        minutepompe = 0;
        secondepompe = 0;
        setSelecteur(fonction_menu);
        delay(200);
     
     break;
      }
       lcd.setCursor(0, 2);
      lcd.print(F("    "));
      if (heurepompe < 10 ) {
        lcd.print(0);
      }
      lcd.print(heurepompe);
      lcd.print(F("h"));
      if (minutepompe < 10) {
        lcd.print(0);
      }
      lcd.print(minutepompe);
      lcd.print(F("mn"));
      if (secondepompe < 10) {
        lcd.print(0);
      }
      lcd.print(secondepompe);
      lcd.print(F("s"));
      lcd.print(F("     "));
      lcd.setCursor(0, 3);
      lcd.print(chainevide20);
     
      previousCompteur = selecteur;
      return tempspompemode;
    }
    le code ne fonctionne plus

  7. #7
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    par contre je viens d'avoir un nouveau problème avec switch quand je transforme ce code...
    Oui là je pense qu'il y a une explication
    Vous avez un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        int tempspompe = tempspompemode / 1000;
    dans un des case.
    ==> Vous ne pouvez pas déclarer de variable locales dans un case sans mettre le bloc du case entre accolades.

    Essayez avec
    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
      switch(modify_pompe)
      {
      case 0: 
      {
          previousCompteur = selecteur;
          modify_pompe = 1;
     
          int tempspompe = tempspompemode / 1000;
     
          if (tempspompe >= 3600)
          {
            heurepompe = tempspompe / 3600;
          }
          else
          {
            heurepompe = 0;
          }
          if (tempspompe > 59 )
          {
            minutepompe = heurepompe * 3600;
            minutepompe = tempspompe - minutepompe;
            minutepompe /= 60;
          }
          else
          {
            minutepompe = 0;
          }
          if (tempspompemode > 0 )
          {
            heurepompe *= 3600;
            minutepompe *= 60;
            secondepompe = (tempspompe - ((heurepompe) + (minutepompe))) ;
            minutepompe /= 60;
            heurepompe /= 3600;
            delay(200);
          }
          else
          {
            secondepompe = 0;
            delay(200);
          }
       
          lcd.setCursor(0, 1);
          lcd.print(F("heure:              "));
          delay(200);
      ]
       break;
      case 1:
    j'avais pas lu en super détail l'autre code mais il ne me semblait pas qu'il y avait de déclarations similaires.

  8. #8
    Membre averti
    Femme Profil pro
    devellopement sur temps libre
    Inscrit en
    Mars 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : devellopement sur temps libre
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 27
    Par défaut
    Citation Envoyé par Jay M Voir le message
    Oui là je pense qu'il y a une explication
    Vous avez un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        int tempspompe = tempspompemode / 1000;
    dans un des case.
    ==> Vous ne pouvez pas déclarer de variable locales dans un case sans mettre le bloc du case entre accolades.

    J'avais pas lu en super détail l'autre code mais il ne me semblait pas qu'il y avait de déclarations similaires.
    Au top cela marche , et non je n'est pas ce genre de chose dans le reste de mon code

    Merci pour l'info!!!

    je continue a chercher d'ou pourrait venir mon probleme principale

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/09/2006, 15h48
  2. [Dates] Problème avec date (heure qui varie)
    Par Death83 dans le forum Langage
    Réponses: 10
    Dernier message: 05/08/2006, 02h19
  3. Problème avec un div qui n'est pas pris en compte
    Par boss_gama dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 25/07/2006, 16h32
  4. Réponses: 3
    Dernier message: 16/09/2005, 10h01
  5. [Tableaux] Problème avec Switch case
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2005, 16h37

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