Probleme programme arduino encodeur rotatif

Bonjours ! Je suis nouveaux sur le forum. J’aimerais un peu d’aide s’il vous plait. Je suis sur une projet qui consiste a afficher l’heure sur un lcd avec un encodeur rotatif. J’arrive a incrémenter l’heure mais pour les minute j’ai un soucis.
Voici mon programme :

 #include <LiquidCrystal.h>
int heure = 0;
int minute = 0 ;
int jours = 0;

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()  {
 
Serial.begin(9600);
lcd.begin(16, 2);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(11,INPUT_PULLUP);
  attachInterrupt(0, nAnalyse, FALLING);
  lcd.setCursor(2,0);
  lcd.print(":");
  lcd.setCursor(3,0);
  lcd.print(minute);
  lcd.setCursor(0,1);
  lcd.print(jours);
  
              }
              
void loop(){
  
  if(digitalRead(11) == 1 )
    {
    heure=0;
    }

    // affichage heure 
 if (heure<10)
  { // si inférieur à 10, on affiche un 0 devant
   
  lcd.setCursor(0,0);
lcd.print("0");
lcd.print(heure);
  }
  
  else 
  {// sinon affiche directement la valeur
    lcd.print(heure);
    if (heure>23)
    {
      heure=0;
    }

    
  //affichage minute
  lcd.setCursor(3,0);  
    afficheminute();
    
    if (minute<10)
    
  { // si inférieur à 10, on affiche un 0 devant
    
    lcd.setCursor(3,0);  
 
    lcd.print("0");

    lcd.print(minute);

 }
  
  else 
  { // sinon affiche directement la valeur
   lcd.print(minute);
   
   if (minute>59)
    {
    
      minute=0;
    }
   
  }
  }
  
lcd.setCursor(0,0);
 delay(100);
 
         }

         
void nAnalyse() {
 if(digitalRead(2)== digitalRead(3))
    {
    heure++; 
    }   
 else 
    {
    heure--;
    }    
               }


void afficheminute() // début fonction d'affichage de l'heure
{
   //-- affichage de l'heure --
  if(digitalRead(2)== digitalRead(3))
    {
     lcd.setCursor(3,0);   
    minute++; 
    }   
 else 
    {
      lcd.setCursor(3,0);  
    minute--;
    }    
  }

Merci d’avance pour votre aide

Bonjour,
TU LIS CECI
et tu poses ta question ensuite

D'accord j'avais pas lu c'est la premiere fois que je poste une question sur le forum

Mets ton code entre balises comme indiqué

Merci j'ai reussie a le mettre entre les balises

Comment tu passes de la modification de l'heure a la modification des minutes?
Dans ton interruption tu devrais incrémenter/décrémenter une valeur et ensuite suivant que tu est en modification de l'heure tu utilises cette valeur soit pour l'heure soit pour la minute

En faite c'est pour faire ceci que je bloque. Je souhaiterais lorsque j'appuie sur le boutton je passe sur la programmation des minute

Tu peux utiliser une variable pour indiquer si tu incrémente l’heure ou le minutes et qui change d’état quand tu appuies sur le bouton.
Comme ceci:

#include <LiquidCrystal.h>
volatile int heure = 0;
volatile int minute = 0 ;
int jours = 0;

volatile bool bInputHeure = false;

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()  {

  Serial.begin(9600);
  lcd.begin(16, 2);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(11, INPUT_PULLUP);
  attachInterrupt(0, nAnalyse, FALLING);
  lcd.setCursor(2, 0);
  lcd.print(":");
  lcd.setCursor(3, 0);
  lcd.print(minute);
  lcd.setCursor(0, 1);
  lcd.print(jours);

}

void loop() {
  static int etatBoutonPrec = HIGH;
  int etatBouton = digitalRead(11);
  if (etatBouton == LOW && etatBoutonPrec == HIGH)
  {
    // on vient d'appuyer sur le bouton on change heure/minure
    bInputHeure = !bInputHeure;
  }
  etatBoutonPrec=etatBouton;

  // affichage heure minute
  char buf[21];     // buffer d'affichage
  sprintf(buf, "%2d:%02d", heure, minute);
  lcd.setCursor(0, 0);
  lcd.print(buf);
  
  delay(100);

}


void nAnalyse() {
  if (digitalRead(2) == digitalRead(3))
  {
    if (bInputHeure)
    {
      if (heure < 23)
        heure++;
    }
    else
    {
      // décrémente minutes
      if (minute < 59)
        minute++;
    }
  }
  else
  {
    if (bInputHeure)
    {
      if (heure > 0)
        heure--;
    }
    else
    {
      // incrémente minutes
      if (minute > 0)
        minute--;
    }
  }
}

J’ai aussi simplifié l’affichage qui me paraissait un peu compliqué (bien qu’apparemment correct)

Merci beaucoup je test cela !

Je viens de réussir a tester le programme car j'ai reçu l'encodeur rotatif avec validation mais lorsque je teste j'arrive a changer les minute mais lorsque j'appuie je peux pas passer au heure. Merci de votre réponses

Tu appuies sur quoi?
Sur le bouton relié en 11?
Ca devrait fonctionner

J'appuie sur mon encodeur rotatif relié a la broche 11 de l'Arduino

Voici mon schema de simulation

Je ne comprend pas ton schema, il ne correspond pas a ton programme.

Exact je l’ai refait

Sur ton schéma la broche 11 de l'arduino qui correspond à la pin 17 de l'atmega est reliée sur le lcd et non sur un switch.

Merci beaucoup sa fonctionne parfaitement ! Sur la labdec je n'avais pas mis la resistance de 10K a la masse des que j'ai fait ca sa a fonctionner

Content que ça fonctionne.
Après tu peux améliorer en indiquant quel nombre tu es en train de modifier

Oui je vais utiliser la fonction blink ou cursor pour ceci. Maintenant je veux aussi faire la meme chose pour la date j’ai fait ce code :

#include <LiquidCrystal.h>
volatile int heure = 0;
volatile int minute = 0 ;
volatile int seconde=0;
volatile int jour=1;
volatile int mois=1;
volatile int annee=2000;

volatile bool bInputHeure = false;

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()  {

  Serial.begin(9600);
  lcd.begin(16, 2);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(11, INPUT_PULLUP);
  attachInterrupt(0, nAnalyse, FALLING);
  
}

void loop() {
  static int etatBoutonPrec = HIGH;
  int etatBouton = digitalRead(11);
  if (etatBouton == LOW && etatBoutonPrec == HIGH)
  {
    // on vient d'appuyer sur le bouton on change heure/minure
    bInputHeure = !bInputHeure;
  }
  etatBoutonPrec=etatBouton;

  // affichage heure minute

  char buf[21];     // buffer d'affichage
  sprintf(buf, "%2d:%02d", heure, minute);
  lcd.setCursor(0, 0);
  lcd.print(buf);
  char buf2[21];
  sprintf(buf2, "%2d/%2d/%2d", jour, mois,annee);
  lcd.setCursor(0, 1);
  lcd.print(buf2);
  delay(100);

}


void nAnalyse() {
  if (digitalRead(2) == digitalRead(3))
  {
    if (bInputHeure)
    {
      if (heure < 23)
        heure++;
    }
    else
    {
      // décrémente minutes
      if (minute < 59)
        minute++;
    }
    if (jour <31)
       jour++;
    else 
    {
    if(mois<12)
    mois++;
    }
       }
     
     if (annee <2100)
     annee++;
     
  else
  {
    if (bInputHeure)
    {
      if (heure > 0)
        heure--;
    }
    else
    {
      // incrémente minutes
      if (minute > 0)
        minute--;
    }
    if (jour > 0)
        jour--;
 
    else
    {
      // incrémente minutes
      if (mois > 0)
        mois--;
    }
    if(annee > 0)
     annee--;
  }
}

Mais je n’ai pas compris comment passer des minutes au jours. Merci d’avance de ta réponse

Au lieu d'utiliser un flag bInputHeure qui prend deux états tu utilise un octet qui prend 5 états.
Tu l'incrémente quand tu appuie sur le bouton
Dans la routine d'interruption tu testes la valeur

byte saisie;
saisie==0 -> saisie minute
saisie==1 -> saisie heure
saisie==2 -> saisie jour
saisie==3 -> saisie mois
saisie==4 -> saisie année