Compteur de cycle est décallé de un sur l'afficheur par rapport au compteur

Bonjour.

Mon programme fonctionne comme il se doit sauf sur une chose. Lorsque le temps en secondes est atteint (temps entre deux cycles de lubrification), j’ai un compteur de cycles de lubrification qui débute selon le nombre de compte demandé (N). Le compte est bon sauf que mon affichage du compte (N2) est décalé de 1. Donc lorsqu’un premier cycle est fait N2 affiche toujours 0, lorsque le deuxième compte est fait, N2 affiche 1 et ainsi de suite. J’ai fait plusieurs essais sans succès. Si je demande 6 cycles, la sortie 13 fait ses 6 cycles sauf que N2 affiche 5 max.

Auriez vous une idée de ce qui ne fonctionne pas dans mon code ?

Je l’ai commenté passablement. J’espère pas trop. Vous me donnerez votre avis svp.

#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd(0x27,16,2);

int D,N,S,N2;
int secondes = 0;
unsigned long millisecondes = 1000;
unsigned long temp = 0;
int ZERO = 1;

void setup() {

  lcd.begin(16,2);
  pinMode(7,INPUT);   //entreé planeur en marche
  pinMode(8,INPUT);   //entrée enregistrement des nouvelles valeurs
  pinMode(9,INPUT);   //entrées - délai (D)
  pinMode(10,INPUT);  //entrée + délai (D)
  pinMode(11,INPUT);  //entrées - nombres (N)
  pinMode(12,INPUT);  //entrée + nombre (N)
  pinMode(6,OUTPUT);  //sortie tempon
  pinMode(13,OUTPUT); //sortie pour cylindre pneumatique
   
  D=0;
  N=0;
  N2=0;
  S=0;
  secondes = 0;
 
  lcd.clear();                //effacer l'écran    
  lcd.backlight();            //Allumer le rétro-éclairage

  EEPROM.get(0,D);            //Lire mémoire de D a l'initialisation
  EEPROM.get(4,N);            //Lire mémoire de N à l'initialisation
}  

void loop() {

  if (digitalRead(8)==HIGH){  //si l'entrée 8 est activée (high), on enregistre les nouvelles valeurs
    EEPROM.put(0,D);          //enregistrement de la valeur D
    EEPROM.put(4,N);          //enregistrement de la valeur N
    delay(20);                //délai filtre pour rebond de l'interrupteur
    }
   
  lcd.setCursor(0,0);     //positionnement du curseur de la première ligne pour affichage du mot Délai:
  lcd.print("Delai:");    //afficher le mot Délai: a la position 0,0 (première ligne)
  lcd.setCursor(6,0);     //positionnement du curseur pour afficher la valeur de D sur la première ligne
  lcd.print(D);           //affichage de la valeur de D a la position 6,0
  lcd.setCursor(10,0);    //positionnement du curseur de la première ligne pour afficher le mot Cnt:
  lcd.print("Cnt:");      //affichage du mot Cnt a la position 10,0
  lcd.setCursor(0,1);     //positionnement du curseur de la seconde ligne pour affichage du mot Nombres:
  lcd.print("Nombres:");  //afficher le mot Nombres: a la position 0,1 (seconde ligne)
  lcd.setCursor(9,1);     //positionnement du curseur pour afficher la valeur de N sur la première ligne
  lcd.print(N);           //affichage de la valeur de N a la position 9,1
  lcd.setCursor(14,0);    //positionnement du curseur afficher valeur de minutes sur la première ligne
  lcd.print(secondes);    //affichage de la valeur de minutes a la position 14,0
  lcd.setCursor(14,1);    //positionnement du curseur pour afficher la valeur du compteur sur la seconde ligne
  lcd.print(N2);          //affichage de la valeur de minutes a la position 14,1  
  

  //MODIFICATION DE LA VALEUR CORRESPONDANT AU DÉLAI//

  if ((digitalRead(11)==HIGH)&&(D>=0)&&(D<60)){                         //si l'entrée 11 est high et que la valeur de D est entre 0 et 60 secondes                                                                   
    D++;                                                                //on additionne 1 a la valeur de D
    lcd.setCursor(6,0);                                                 //on affiche la valeur de D à la position 6,0 (première ligne)
    lcd.print(D);                                                       //affichage de la valeur de la variable D
    lcd.print(" ");                                                     ///effacement des valeurs non voulues
    delay(250);}                                                        //délai filtre pour rebond de l'interrupteur sur l'entrée 11  
  
  if ((digitalRead(12)==HIGH)&&(D>0)&&(D<=60)){                         //si l'entrée 12 est high et que la valeur de D est entre 0 et 60 secondes                                                                    
    D--;                                                                //on soustrait 1 a la valeur de D   
    lcd.setCursor(6,0);                                                 //on affiche la valeur de D à la position 6,0 (première ligne)
    lcd.print(D);                                                       //affichage de la valeur de la variable D
    lcd.print(" ");                                                     ///effacement des valeurs non voulues
    delay(250);}                                                        //délai filtre pour rebond de l'interrupteur sur l'entrée 12
    

    //MODIFICATION DE LA VALEUR CORRESPONDANT AU NOMBRE//

   if ((digitalRead(9)==HIGH)&&(N>=0)&&(N<60)){                         //si l'entrée 9 est high et que la valeur de N est entre 0 et 60 secondes
    N++;                                                                //on additionne 1 a la valeur de N
    lcd.setCursor(9,1);                                                 //on affiche la valeur de N à la position 9,1 (seconde ligne)
    lcd.print(N);                                                       //affichage de la valeur de la variable N
    lcd.print(" ");                                                     ///effacement des valeurs non voulues
    delay(250);}                                                        //délai filtre pour rebond de l'interrupteur sur l'entrée 9    
  
  if ((digitalRead(10) ==HIGH)&&(N>0)&&(N<=60)){                        //si l'entrée 10 est high et que la valeur de D est entre 0 et 60 secondes
    N--;                                                                //on soustrait 1 a la valeur de N
    lcd.setCursor(9,1);                                                 //on affiche la valeur de N à la position 9,1 (seconde ligne)
    lcd.print(N);                                                       //affichage de la valeur de la variable N
    lcd.print(" ");                                                     //effacement des valeurs non voulues
    delay(250);}                                                        //délai filtre pour rebond de l'interrupteur sur l'entrée 10

     //COMPTEUR CYCLES DE LUBRIFICATION 0-10 CYCLES//

   while ((secondes == D)&&(N2<N)){                                     //si secondes=D et que N2 (nombres atteint) est plus petit que N (nombres de cycles demandés (1-10 cycles)) 
     digitalWrite(6, HIGH);                                             //sortie 6 devient HIGH jusqu'a la fin du cycle
     digitalWrite(13, HIGH);                                            //sortie 13 a HIGH (sortie cylindre pneumatique pour lubrification)
     delay(1500);                                                       //délai sortie 13 a HIGH
     digitalWrite(13, LOW);                                             //sortie 13 a LOW (sortie cylindre pneumatique pour lubrification)
     N2++;                                                              //on additionne 1 a N2
     delay(1500);                                                       //délai sortie 13 a LOW    
     lcd.setCursor(14,1);                                               //positionnement du curseur à la position 14 de la ligne 2
     lcd.print(N2);                                                     //affichage de la valeur de la variable N2 (nombres de cycles demandés (1-10 cycles))
     lcd.print("");                                                     //effacement des valeurs non voulues
     } 

   if (N2 == N){                                                        //après le cycle de lubrification, on remet la sortie 6 a LOW
      digitalWrite(6, LOW);
      }


     //COMPTEUR DU DÉLAI ENTRE LES CYCLES DE LUBRIFICATION (0-60 SECONDES)

  if ((digitalRead(7)==HIGH) && (digitalRead(6) == LOW) && (millis() > temp + millisecondes)){ //Condition pour comptage
     N2 = 0;                                                           //remise a zéro de N2     
     temp = millis();
     secondes++;}

  if (secondes > D){     //remise a zéro de "secondes" lorsque le setpoint est atteint
    secondes = ZERO;}

    lcd.setCursor(14,0);
    lcd.print(secondes);
    lcd.print(" ");
    lcd.setCursor(14,1);
    lcd.print(N2);
    lcd.print(" ");     

}

Merci

Jacques3012

Bonjour.

A force d’essayer et de chercher j’ai trouvé la solution. J’ai tout simplement déplacer quelque lignes de codes et tout semble ok. Il se fait plus simple? Vous en pensez quoi ?

   while ((secondes == D)&&(N2<N)){
     N2++;
     lcd.setCursor(14,1);                                              
     lcd.print(N2);                                                     
     lcd.print("");                                     
     digitalWrite(6, HIGH);                                             
     digitalWrite(13, HIGH);                                            
     delay(1500);                                                                                                                     
     digitalWrite(13, LOW);                                                                  
     delay(1500);                                                         
                                                          
     }

Jacques3012

Jacques3012:
Vous en pensez quoi ?

Bonjour

J’en pense que ça semble bien compliqué avec tous ces délais, que le while dans votre second post teste la variable secondes qui n’est pas mise à jour dans cette boucle et que je ne sais pas trop ce que vous cherchez à faire avec ce code bloquant alors que vous avez des boutons à gérer..

Il me semble que Ce programme se prête bien à la programmation par machine à états (cf mon tuto éventuellement) et Pour simplifier votre gestion des boutons, éventuellement utilisez la librairie de @bricoleau

Bonjour.

Les boutons que j'utilise ne servent pratiquement jamais, seulement pour ajuster les deux points de consigne. Deux pour monter ou descendre le délai entre les cycles, deux pour monter et descendre le nombres de cycles, un pour enregistrer les valeurs dans le EEPROM et une autre entrée qui détecte si la machine fonctionne. Donc une seule entrée est utilisée régulièrement, les autres peut-être une fois par jour, pas plus car un coup réglé, c'est réglé pour longtemps.

Je n'ai pas trouvé une autre façon de faire rouler une partie du programme pas autre chose qu'un WHILE.
Cette partie ne dure qu'environ 20 secondes. Si vous avez des suggestions, je suis preneurs.

Je vais aller regarder les sites que vous me suggérez.

Merci !

Jacques3012

Jacques3012:
Je n'ai pas trouvé une autre façon de faire rouler une partie du programme pas autre chose qu'un WHILE.
Cette partie ne dure qu'environ 20 secondes. Si vous avez des suggestions, je suis preneurs.

Ok - pendant ce temps là les boutons ne fonctionnent plus, mais si ça vous convient, pourquoi pas

Une autre façon c’est d’utiliser millis()