[Conseil] Afficheur multiple et dynamique !

Bonjour je me présente je m'appelle lucas et c'est mon premiers post sur ce forum :slight_smile: .
Je suis étudiant en BTS SNIR (la descendant du BTS IRIS) et la je suis en deuxième année et je dois faire un projet.
Je vous passe les détails du projet (sauf si vous voulez vraiment le savoir ) et je vais vous parler plus précisement de mon problème

J'ai comme matériaux un arduino uno et également un afficheur LCD "Sparkfun Color LCD shield" qui m'est confié avec sa bibliothèque qui est sur ce site :

c'est donc un écran composé de 3 boutons poussoirs et je veux créer 3 affichages différents pour chaque boutons.

chaque écran contiendra un rectangles ou un carré (c'est déja fait sur mon code ).

et ces rectangles auront une sorte de remplissage fluide et en dynamique et progressif (si vous ne visualisez pas trop , mon affichage aura la même tête qu'une barre de chargement , avec la barre qui se remplie petit a petit ).

Pour le moment je m'occupe seulement de la fonction "collectif()".

De base le dessin du rectangle qui se trouve dans le setup() se trouver de base dans la fonction collectif() cependant le programme était bien trop lent et mettait du temps a ré afficher fluidement le remplissage du rectangle.
Donc j'ai décidé de mettre le dessin du rectangle dans le setup et le remplissage dans le loop , dans la fonction "collectif()".

Cela me convient bien , cependant un nouveau problème se pose ...
Comment je vais pouvoir faire quand j'aurais les 3 écran different a afficher avec leurs 3 boutons correspondant. Je ne pourrais plus mettre le dessin du rectangle dans le setup car il devra pouvoir être effacer puis remplacer par le nouveau rectangle choisie d'un des trois boutons :frowning: ...

Je vous passe mon code arduino , si vous avez des questions ou des remarque , n'hésitez pas !

Merci d'avance :slight_smile: !

#include <SparkFunColorLCDShield.h>
#include <stdio.h> 

#define BACKGROUND BLACK 
#define RECT_COLOR BLUE
#define CROSS      RED

LCDShield lcd;

int buttonPins[3] = {3, 4, 5};
boolean buttonEtat[3] = {false, false, false};
int x = -32768;
int count;
char timeChar[12];

void setup()
{
  
 lcd.init(PHILIPS); 
 lcd.contrast(63); // sets LCD contrast (value between 0~63)
 Serial.begin(9600);
 lcd.clear(BACKGROUND);


 lcd.setRect(50,15,79,113 ,40, RECT_COLOR);      
 lcd.setRect(51,15,80,113 ,40, RECT_COLOR);        
 lcd.setRect(50,16,79,114 ,40, RECT_COLOR);      

 
 //float test = (/*joyReport.axis[3] + */  3000)/468.75 + 5.50 ;
 //Serial.print(test,2);
 // menu();
 
}

void loop()
{
  if(x >= 32000)
  {
    count += 1;
  }
   x = x+1000;
   etatBouton();
   collectif();
  
}

 void menu(){
  // lcd.clear(BACKGROUND);
   lcd.setStr("   SELECTION :", 15,2, WHITE, BACKGROUND);
   lcd.setStr("B1:Rt Cyclique", 45,2, WHITE, BACKGROUND);
   lcd.setStr("B2:Rt Generique", 75,2, WHITE, BACKGROUND);
   lcd.setStr("B3:Rt Arriere", 105,2, WHITE, BACKGROUND);
} 

void cyclique(){
  //  lcd.clear(BACKGROUND);
    lcd.setRect(24,24,104,104 ,40, RECT_COLOR);
    lcd.setRect(25,25,105,105 ,40, RECT_COLOR);
    lcd.setLine(61,66,71,66,CROSS);
    lcd.setLine(66,61,66,71,CROSS);	
}

void collectif(){
   // lcd.clear(BACKGROUND);
   // lcd.setRect(50,15,79,113 ,40, RECT_COLOR);       //setup
   // lcd.setRect(51,15,80,113 ,40, RECT_COLOR);       //setup
   // lcd.setRect(50,16,79,114 ,40, RECT_COLOR);       //setup
   
      int c = map(x,-32768 ,32767, 16, 114);  
   
      lcd.setRline(50,c+1,79,114,0,RECT_COLOR);
      lcd.setRline(50,c,79,114,0, RECT_COLOR);
  
      Serial.println(x);
      Serial.println('\t');
      Serial.println(count);

}

void pallonier(){
  // lcd.clear(BACKGROUND);
   lcd.setRect(50,15,79,113 ,40, RECT_COLOR);
   lcd.setRect(51,15,80,113 ,40, RECT_COLOR);
   lcd.setLine(50,66,79,66,RECT_COLOR);
   lcd.setRect(50,16,79,114 ,40, RECT_COLOR);	
}

void affiche_commande(){


}

void etatBouton(){
	if (!digitalRead(buttonPins[0])){
		buttonEtat[0] = true ;
		buttonEtat[1] = false ;
		buttonEtat[2] = false ;
	}

	if (!digitalRead(buttonPins[1])){
		buttonEtat[0] = false ;
		buttonEtat[1] = true ;
		buttonEtat[2] = false ;
	}

	if (!digitalRead(buttonPins[2])){
		buttonEtat[0] = false ;
		buttonEtat[1] = false ;
		buttonEtat[2] = true ;
	}
}

Je ferais une fonction spécialement dédiée au dessin de ton rectangle , une autre pour son effacement , et tu les appelles dans ton loop suivant le bouton que tu utilises ..

Pareil pour les autres formes souhaitées .

Le problème c'est que même en ayant des fonctions dédiées pour l'effacement et le dessin du rectangle, si je les appelle dans le loop elle se répéteront indéfiniment et ralentiront donc le programme qui a besoin d'être réactif :frowning: ...

coucoumelle:
Le problème c'est que même en ayant des fonctions dédiées pour l'effacement et le dessin du rectangle, si je les appelle dans le loop elle se répéteront indéfiniment et ralentiront donc le programme qui a besoin d'être réactif :frowning: ...

Bah oui et non , il suffit de mettre une condition avec un type bool par exemple pour appeler une seule fois la fonction ..

Quand tu veux utiliser ta fonction "DessinRectangle" , avec un "if" tu ajoute un boolean Rectangle == true , et dans ta fonction "DessinRectangle" tu repasses le boolean Rectangle en false ! Ce qui fait que le rectangle est dessiné une seule fois ...jusqu'à ce que tu décides de remettre le boolean Rectangle à true !

Ya surement d'autres façons de faire mais celle là fonctionne parfaitement :wink: !

void loop()
{
...
bool Rectangle = true;  // ou boolean je sais jamais ^^ 

if(Rectangle == true)
{
DessinRectangle(); // ta fonction de dessin du rectangle
Rectangle = false;
}
...
// si tu remets Rectangle = true , ton rectangle sera redessinée , à toi de choisir où le faire ;) !
}