Barre de chargement

Bonjour,
J’ai fait un petit programme pour un projet de checkpoint pour airsoft.
Le programme fonctionne mais j’ai juste un petit soucis avec une barre de chargement qui apparait lorsque quelqu’un a appuyé sur un des 4 boutons de couleurs.
Celle-ci s’affiche bien seulement je pense que dans mon fonctionnement je ne m’y suis pas pris correctement.
Dans le programme une personne entre un temps de capture du checkpoint (de 0 à … ) en minutes.
Dans le programme la variable est un simple entier. Dans le code je le multiplie par 60 afin d’avoir un entier en seconde.
Ensuite je le divise par 16 car il y a 16 caractères possible sur mon écran 1602 ce qui donne un résultat x et donc tous les x fois un caractères s’affiche. Sauf que entre le temps du timer et le nombre de caractère affiche cela ne coïncide pas car le résultat du timer /16 devrait donner un float et pour la gestion de mon timer j’utilise un delay(1000).
JE vous donne le code afin que vous puissiez comprendre mieux ce que je veux dire.
PREMIERE PAGE:

#include <LiquidCrystal_I2C.h>

#include <Wire.h>

LiquidCrystal_I2C lcd(0x3F,16,2) ;

// Positions des éléments sur les pattes
    const int led_PinW = 4;      
    const int led_PinY = 5;       
    const int led_PinR = 6;       
    const int led_PinB = 7;      
    const int BP_PinW = 8;    
    const int BP_PinY = 9;    
    const int BP_PinR = 10;   
    const int BP_PinB = 11;    
    const int buzz_Pin = 2;     
    
// Variables générales

    int etat_boutonW;
    int etat_boutonY;
    int etat_boutonR;
    int etat_boutonB; 
    int etat_ledW = LOW;
    int etat_ledY = LOW;
    int etat_ledR = LOW;
    int etat_ledB = LOW;
    int blanc;
    int jaune;
    int rouge;
    int bleu;
    int jeu = 0;
    int color = 0;
    int s = 0;        // s = variable barre*t     temps capture / 16 * t
    int t = 1;        // t = variable pour l'incrémentation pour afficher les carac sur l'écran lcd donc max 16      
    int x = 0;
    int y = 0;
    int z = 0;
    float temp_capture_flag=10;
    String etat_base;
    int barre = 0;  // temps capture / 16
    float barre_float = 0;


void setup() 
{

// Déclaration des E/S
    pinMode(led_PinW, OUTPUT);      
    pinMode(BP_PinW, INPUT);
    pinMode(led_PinY, OUTPUT);      
    pinMode(BP_PinY, INPUT);
    pinMode(led_PinR, OUTPUT);      
    pinMode(BP_PinR, INPUT);
    pinMode(led_PinB, OUTPUT);      
    pinMode(BP_PinB, INPUT);
    pinMode(buzz_Pin, OUTPUT);

// Intro écran
    digitalWrite(led_PinW, HIGH);  
    digitalWrite(led_PinY, HIGH); 
    digitalWrite(led_PinR, HIGH); 
    digitalWrite(led_PinB, HIGH); 
    delay(2000); // attendre 2 seconde
    Serial.begin(115200);   
    lcd.begin();
    lcd.clear();
    lcd.setCursor(3, 0 );
    lcd.print( "Checkpoint" );
    delay(600);
    lcd.setCursor( 4, 1 );
    lcd.print( "xxxxxxxx" );
    delay(2000);
    lcd.clear();
    lcd.setCursor(0, 1 );
    digitalWrite(led_PinW, LOW);  
    digitalWrite(led_PinY, LOW); 
    digitalWrite(led_PinR, LOW); 
    digitalWrite(led_PinB, LOW);

    // Appel menu jeu
    menu();
}

void loop()
{  
    if (jeu == 1){flag();}
    //if (jeu == 2){bombe();}
}

DEUXIEME PAGE:

void menu()
{
  
    // CHOIX JEU

    lcd.clear();
    lcd.setCursor(6, 0 );
    lcd.print("MENU");
    delay (1500);
    lcd.clear(); 
    Serial.println("menu");
    while (1) 
    { 
        lcd.setCursor(0, 0 );lcd.print("(B)-CHECKPOINT");
        lcd.setCursor(0, 1 );lcd.print("(R)-BOMBE");
        etat_boutonB = digitalRead(BP_PinB);
        etat_boutonR = digitalRead(BP_PinR);
        
        if (etat_boutonB == HIGH ) 
        {
            Serial.print("BP_B = ");Serial.print(etat_boutonB);Serial.print(" pour choix checkpoint ");Serial.print("x = ");Serial.println(x);
            etat_boutonB=LOW;
            delay(300);
            jeu = 1;
        }
        if (etat_boutonR == HIGH ) 
        {
            Serial.print("BP_R = ");Serial.print(etat_boutonR);Serial.print("  pour choix Bombe ");Serial.print("x = ");Serial.println(x);
            etat_boutonR=LOW;
            delay(300);
            jeu = 2;
        }    
        if (jeu > 0){break;}
    }
    lcd.clear();
}

TROISIEME PAGE:

 // JEU CAPTURE DE DRAPEAUX

void flag()
{
    jeu=0;
    if (digitalRead(BP_PinB)){x = 0;}
    while (x == 0)
    {
       //lecture de l'état des boutons

            etat_boutonW = digitalRead(BP_PinW);
            etat_boutonY = digitalRead(BP_PinY);  

            //choix du temps de capture de base
            
            lcd.setCursor (1,0);
            lcd.print("Temps capture:");
            lcd.setCursor (6,1);
            lcd.print(temp_capture_flag);
            if (etat_boutonY==HIGH)
            {
                Serial.print("BP_Y = pour choix temps + = ");Serial.print(etat_boutonY);Serial.print("  x = ");Serial.println(x);         
                etat_boutonY=LOW;
                delay(200);
                temp_capture_flag++;
                lcd.setCursor (6,1);
                lcd.print (temp_capture_flag);
            }
            if (etat_boutonW==HIGH)
            {
                Serial.print("BP_W = pour choix temps - = ");Serial.print(etat_boutonW);Serial.print("  x = ");Serial.println(x);
                etat_boutonW=LOW;
                delay(200);
                if(temp_capture_flag>=1)
                {
                  delay(200);
                  temp_capture_flag--;                
                  lcd.setCursor (6,1);
                  lcd.print (temp_capture_flag);
                }
                else
                {
                  lcd.setCursor (6,1);
                  lcd.print (temp_capture_flag);
                }
            }
            
            etat_boutonR = digitalRead(BP_PinR);
            etat_boutonB = digitalRead(BP_PinB);
            
            if (etat_boutonR==HIGH)
            {
                Serial.print("BP_R = pour choix menu  = ");Serial.print(etat_boutonR);Serial.print("  x = ");Serial.println(x);
                etat_boutonR=LOW;
                temp_capture_flag=10;
                delay(200);
                menu();
            }
            if (etat_boutonB==HIGH)
            {
                Serial.print("BP_B = pour choix x=1   = ");Serial.print(etat_boutonB);Serial.print("  x = ");Serial.println(x);
                etat_boutonB=LOW;
                lcd.clear();
                delay(200);
                x=1;
            }
    delay(200);
    } //end while 

  //2eme boucle
  Serial.println("attente relachement des BP puis d'une pression sur bleu ou rouge");

  while (digitalRead(BP_PinR)==LOW and digitalRead(BP_PinB)==LOW)  { 
  
        lcd.setCursor(6,0);
        lcd.print(temp_capture_flag);
        lcd.setCursor(1,1);
        lcd.print("V BLEU X ROUGE");
        Serial.print("BP_B pour choix game   = ");Serial.print(etat_boutonB);Serial.print("  x = ");Serial.println(x);
        Serial.print("BP_R pour choix x=0    = ");Serial.print(etat_boutonR);Serial.print("  x = ");Serial.println(x);
        etat_boutonR = digitalRead(BP_PinR);
        etat_boutonB = digitalRead(BP_PinB);   
        if (etat_boutonB == HIGH)
        {
            Serial.print("BP_B pour choix game   = ");Serial.print(etat_boutonB);Serial.print("  x = ");Serial.println(x);
            etat_boutonB=LOW;
            lcd.clear();
            delay(1000);
            game();
        } //end if 
        if (etat_boutonR == HIGH)
        {
            Serial.print("BP_R pour choix x=0    = ");Serial.print(etat_boutonR);Serial.print("  x = ");Serial.println(x);      
            etat_boutonR=LOW;
            lcd.clear();
            delay(1000);
            x=0;
            flag();
        } //end if 
    }; 
} // End Void FLAG  
                
void game()
{
  temp_capture_flag=temp_capture_flag*60;
  Serial.println("BP Bleu donc game");
  lcd.setCursor(3,0);
  lcd.print("Base neutre");
  while ( y == 0)
  {
      Serial.println(y);
       etat_boutonB = digitalRead(BP_PinB);       
       if(etat_boutonB==HIGH)
       {
           Serial.println("BP Bleu");
           color = 1;
           Serial.println(color);
           etat_boutonR=LOW;
           etat_boutonY=LOW;
           etat_boutonW=LOW;
           tempo();
       }
       etat_boutonR = digitalRead(BP_PinR);
       if(etat_boutonR==HIGH)
       {
          Serial.println("BP Rouge");
          color = 2;
          Serial.println(color);
          etat_boutonB=LOW;
          etat_boutonY=LOW;
          etat_boutonW=LOW;
          tempo();
       }
       etat_boutonY = digitalRead(BP_PinY);
       if(etat_boutonY==HIGH)
       {
          Serial.println("BP Jaune");
          color = 3;
          Serial.println(color);
          etat_boutonB=LOW;
          etat_boutonR=LOW;
          etat_boutonW=LOW;
          tempo();
       }
       etat_boutonW = digitalRead(BP_PinW);
       if(etat_boutonW==HIGH)
       {
          Serial.println("BP Blanc");
          color = 4;
          Serial.println(color);
          etat_boutonB=LOW;
          etat_boutonR=LOW;
          etat_boutonY=LOW;
          tempo();
       }
       if(etat_base=="Base blanche")
       {
         lcd.setCursor(2,0);
         lcd.print(etat_base);
       }
       else
       {
         lcd.setCursor(3,0);
         lcd.print(etat_base); 
       }
       if (digitalRead(BP_PinR)==HIGH and digitalRead(BP_PinB)==HIGH) 
       {
          y =1;
          etat_boutonB=LOW;
          etat_boutonR=LOW;
       }
  }
  if ( y == 1)
  {
    lcd.clear();
    while (digitalRead(BP_PinR)==LOW)
    {
       lcd.setCursor(0,0);
       lcd.print("R retour au menu");
       if  (digitalRead(BP_PinR)==HIGH)
       {
          menu();
       }
    }
    delay(2000);
  }
}       


Merci d'avance.
void tempo ()
{ 
  barre_float=(temp_capture_flag/16);
  if(barre_float<(barre+0,5))
  {
    barre=(temp_capture_flag/16)+1;
  }
  else
  {
    barre=(temp_capture_flag/16);
  }
  t=0;
  Serial.print("barre float ");Serial.print(barre_float);Serial.print("       ");Serial.print("barre");Serial.print(barre);
  if(color==1)
  {
      while( z<temp_capture_flag and digitalRead(BP_PinR)== LOW and digitalRead(BP_PinY)== LOW and digitalRead(BP_PinW)== LOW) //condition de sortie qui ne fonctionne pas lorsqu'on appiue sur un autre bouton.
      {
          lcd.setCursor(0,0);
          lcd.print("Capture en cours");
          s= barre*t;
          Serial.print("barre ");Serial.print(barre);Serial.print("       ");Serial.print("t ");Serial.print(t); Serial.print("       ");Serial.print("s ");Serial.print(s);Serial.print("       ");
          if(s==z) // barre= entier du timer / par 16 le nbr de carac du lcd         
          {
              if (s>0)
              {
                  lcd.setCursor((t-1),1);
                  lcd.print((char)255);
                  Serial.print(t);
              }
              t=t+1;
          }
          z=z+1;
          delay(1000);
      }
      if (z=temp_capture_flag)
      {
          digitalWrite(led_PinW, LOW);  
          digitalWrite(led_PinY, LOW); 
          digitalWrite(led_PinR, LOW); 
          buzzer();
          digitalWrite(led_PinB, HIGH);  
          lcd.clear();
          etat_base="Base bleu"; 
      }
  }
  if(color==2)
  {
      while( z<temp_capture_flag and (digitalRead(BP_PinB)== LOW or digitalRead(BP_PinY)== LOW or digitalRead(BP_PinW)== LOW))
      {
          Serial.print(" Couleur = ");Serial.print(color);Serial.print("    "); Serial.print(z);Serial.print("    ");
          lcd.setCursor(0,0);
          lcd.print("Capture en cours");
          s= barre*t;
          if(s==z) // barre= entier du timer / par 16 le nbr de carac du lcd         
          {
            lcd.setCursor(t,1);
            lcd.print((char)255);
            t=t+1;
          }
          z=z+1;
          delay(1000);
      }
      if (z=temp_capture_flag)
      {
          digitalWrite(led_PinB, LOW);  
          digitalWrite(led_PinY, LOW); 
          digitalWrite(led_PinW, LOW); 
          buzzer();
          digitalWrite(led_PinR, HIGH);  
          lcd.clear();
          etat_base="Base rouge"; 
      }
  }
  if(color==3)
  {
      while( z<temp_capture_flag and (digitalRead(BP_PinB)== LOW or digitalRead(BP_PinR)== LOW or digitalRead(BP_PinW)== LOW))
      {
          Serial.print(" Couleur = ");Serial.print(color);Serial.print("    "); Serial.print(z);Serial.print("    ");
          lcd.setCursor(0,0);
          lcd.print("Capture en cours");
          s= barre*t;
         if(s==z) // barre= entier du timer / par 16 le nbr de carac du lcd         
          {
            lcd.setCursor(t,1);
            lcd.print((char)255);
            t=t+1;
          }
          z=z+1;
          delay(1000);
      }
      if (z=temp_capture_flag)
      {
          digitalWrite(led_PinW, LOW);  
          digitalWrite(led_PinB, LOW); 
          digitalWrite(led_PinR, LOW); 
          buzzer();
          digitalWrite(led_PinY, HIGH);  
          lcd.clear();
          etat_base="Base jaune"; 
      }
  }
  if(color==4)
  {
      while( z<temp_capture_flag and (digitalRead(BP_PinB)== LOW or digitalRead(BP_PinR)== LOW or digitalRead(BP_PinY)== LOW))
      {
          Serial.print(" Couleur = ");Serial.print(color);Serial.print("    "); Serial.print(z);Serial.print("    ");
          lcd.setCursor(0,0);
          lcd.print("Capture en cours");
          s= barre*t;
          if(s==z) // barre= entier du timer / par 16 le nbr de carac du lcd         
          {
            lcd.setCursor(t,1);
            lcd.print((char)255);
            t=t+1;
          }
          z=z+1;
          delay(1000);
      }
      if (z=temp_capture_flag)
      {
          digitalWrite(led_PinB, LOW);  
          digitalWrite(led_PinY, LOW); 
          digitalWrite(led_PinR, LOW); 
          buzzer();
          digitalWrite(led_PinW, HIGH);  
          lcd.clear();
          etat_base="Base blanche"; 
      }
  }
  color=0;
  z=0;
}

void buzzer ()
{
  tone(buzz_Pin,300);
  delay(150);
  tone(buzz_Pin,400);
  delay(150);
  tone(buzz_Pin,500);
  delay(150);
  tone(buzz_Pin,600);
  delay(150);
  tone(buzz_Pin,700,150);
}

Pourriez vous me dire comment ma barre de chargement pourrait coller au mieux au temps effectif? Y a t il une fonction que je ne connais pas qui me permettrait de faire cela?*

hello

tu as plusieurs fois la même erreur

if (z**=**temp_capture_flag)

il faut

if (z**==**temp_capture_flag)

autrement, tu restes dans tempo() tant que le temps n'est pas terminé ?

Effectivement j'ai oublié le 2eme = j'ai fait la modif. Par contre cela fonctionnait quand même très bien avant.
LE soucis que j'ai se situe sur la barre de chargement.
Je ne savais pas trop comment procéder du coup j'ai fait comme ça.
Pour utiliser la gestion du temps j'ai faity une boucle avec un delay de une seconde le nombre de fois qu'il faut pour atteindre le timer rentrer par l'utilisateur.
Mais lorsque je fais ma barre de chargement, ayant que 16 caractères, j'ai du diviser celui ci par 16 et cela me donne très rarement un chiffre entier ce qui est logique.
Par exemple si l'on rentre 1minute, cela fait 60 sec que je divise ensuite par 16 ce qui fait 3.75.
Afin d'essayer de coller au plus près j'ai fait un test si le float de cette division est supérieur au int de celle ci + 0.5 alors la variable barre recevra le int de cette division +1 ce qui fera non pas 3 mais 4 et ci celle ci est inférieur au int +0.5 alors barre sera égale à 3.
Et c'est là que le problème se fait c'est que lorsque le timer se termine dans un cas comme dans l'autre c'est que les caractères de la barre de chargement s'affiche un poil trop vite ou un poil trop long et la base passe de la couleur approprié et le son se fait entendre alors que la barre n'est pas à fond.
z est un entier donc il ne pourra jamais être égale à 3.75 comme dans mon exemple du coup j'ai arrondi au chiffre du dessus mais du coup 416=64 du coup mon dernier caractère de la barre s'afficherait normalement à la 64eme seconde et non à la 60eme et inversement si j'arrondis au chiffre en dessous en l'occurence 3 cela fait 163=48 du coup elle s'affichera trop vite !
C'est un peu compliqué à comprendre mais c'est parce que je m'y suis mal pris dès le début. Je ne savais pas du tout comment faire alors je suis parti là dessus. Cela fonctionne mais il y a un léger décalage donc pas très esthétique mdr.

hello
regarde ce bout de code ( non testé), teste le et adapte au reste du prg si c’est ok

void tempo ()
{ 
  barre_float=(temp_capture_flag/16);//pour avoir le temps en millisecondes que représente un caractere sur le LCD
  if(barre_float<(barre+0,5))
  {
    barre=(temp_capture_flag/16)+1;
  }
  else
  {
    barre=(temp_capture_flag/16);
  }
  temporisation=millis();Serial.print("barre float ");Serial.print(barre_float);Serial.print("       ");Serial.print("barre");Serial.print(barre);
  if(color==1)
  {
    t=16;
    while(((millis()-temporisation)< temp_capture_flag) and (digitalRead(BP_PinR)== LOW) and (digitalRead(BP_PinY)== LOW) and (digitalRead(BP_PinW)== LOW)) //condition de sortie qui ne fonctionne pas lorsqu'on appiue sur un autre bouton.
      {
          lcd.setCursor(0,0);
          lcd.print("Capture en cours");
          s= millis();Serial.print("barre ");Serial.print(barre);Serial.print("       ");Serial.print("t ");Serial.print(t); Serial.print("       ");Serial.print("s ");Serial.print(s);Serial.print("       ");
          if(s>=(temporisation+(barre*(17-t)))) // barre= entier du timer / par 16 le nbr de carac du lcd         
              {
              lcd.setCursor((16-t),1);
              lcd.print((char)255);//****************************************************************************************
              t=--;
              Serial.print(t);
              }
      }
          digitalWrite(led_PinW, LOW);  
          digitalWrite(led_PinY, LOW); 
          digitalWrite(led_PinR, LOW); 
          buzzer();
          digitalWrite(led_PinB, HIGH);  
          lcd.clear();
          etat_base="Base bleu"; 
}