Merci de ton retour !
Voilà mon code :
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
int numLed = 1;
int oldLedPort = 9;
unsigned long ledStartupTime = 0;
const unsigned long ledDuration = 1000;
unsigned long blinkStartupTime = 0;
const unsigned long blinkDuration = 2000;
bool blinkOn = false;
int blinkingLed = 0;
bool isBlinking = false;
int typeMateriel = 0;
int nombreVis = 0;
int nombreClous = 0;
int nombreBieres = 0;
int nombreAbrasifs = 0;
const unsigned long dureeAffichage = 3000;
unsigned long departAffichage = 0;
void setup() {
// put your setup code here, to run once:
lcd.init(); // initialisation de l'afficheur
pinMode (A0, INPUT);
pinMode (A1, INPUT);
pinMode (A2, INPUT);
pinMode (A3, INPUT);
pinMode (6, OUTPUT);
pinMode (7, OUTPUT);
pinMode (8, OUTPUT);
pinMode (9, OUTPUT);
pinMode (10, OUTPUT);
pinMode (11, INPUT_PULLUP);
pinMode (12, OUTPUT);
digitalWrite (10, HIGH);
shutDownLeds();
Serial.begin (9600);
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("BOITE A DONS 1.0");
delay (500);
lcd.clear();
}
void loop() {
for (int i = 1; i < 5; i ++) {
if (check(i)) //check chaque boite l'une après l'autre. Exemple : si check (1) est true, c'est que c'est la boite 1 qui est active
{
Serial.println (i); //indique quelle boite est active
blinkingLed = i; //indique quelle Led doit blinker
typeMateriel = i;
isBlinking = true; //indique qu'on passe en mode blink
blinkStartupTime = millis(); //initialise le temps de départ du blink
departAffichage = millis();
shutDownLeds(); //eteint les Leds
digitalWrite(10, LOW);
lcd.clear();
}
}
if (!isBlinking) { //si le mode blink n'est pas actif
boucleLed(); //faire la boucle led standard
affichageStandard();
digitalWrite(10, LOW);
} else {
blinkLed(blinkingLed); //sinon, blinker la Led grâce à la fonction blinkLed
afficherMessage (typeMateriel);
}
delay (20);//attendre x millisecondes
}
bool check(int boite) //fonction qui verifie si une piece est inseree dans une boite donnée et renvoie true ou false
{
int port; //initalise la variable port
switch (boite) { //si boite = 1, donne la valeur 2 à la variable port, etc...
case 1:
port = A0;
break;
case 2:
port = A1;
break;
case 3:
port = A2;
break;
case 4:
port = A3;
break;
default:
return false;
}
if (analogRead(port) > 300) //si l'interrupteur qui a le numero de Pin de la variable port précédemment changée est à 0 (donc est appuyé)
{
return true; //envoyer true pour la boite correspondante
} else {
return false; //sinon, renvoyer false
}
}
void boucleLed () { //fonction qui fait tourner les leds quand la boite ne détecte pas de pièce
int port; //initialise variable port
unsigned long currentTime = millis(); //assigne à la variable currenttime la valeur millis (cad temps écoulé depuis le début)
if (currentTime - ledStartupTime > ledDuration) { //si l'intervalle entre le temps présent et le temps de départ de la led est supérieur à l'intervall défini
ledStartupTime = currentTime; //le temps de départ de la led est maintenant le temps présent
port = getLedPort(numLed); //le port est celui de la led active
if (port != 0) { //si une led est bien active
digitalWrite(oldLedPort, LOW); //le port de la dernière led active s'éteint
digitalWrite(port, HIGH); //le port de la led présente s'allume
oldLedPort = port; //le port de la led présente devient l'ancien port
numLed++; //le numero de la led augmente
if (numLed > 4) { //au bout de la 4ème Led, on recommence à 1
numLed = 1;
}
}
}
}
void blinkLed(int led) { //fonction qui fait clignoter la led quand la pièce est détectée
int port = getLedPort(led); //on prend le port de la led
unsigned long currentTime = millis(); //on définit le temps présent
if (port != 0) { //si un port est actif
if (currentTime - blinkStartupTime < blinkDuration) { //et si l'intervalle de blink n'est pas dépassé
if (blinkOn) { //et si le mode Blinkon est actif
digitalWrite(port, LOW);//éteindre la led
digitalWrite(10, HIGH);
blinkOn = false; //mode blinkon désactivé
} else { //sinon, allumer la led et mode blinkon est activé
digitalWrite(port, HIGH);
digitalWrite(10, LOW);
blinkOn = true;
}
} else {//si l'intervalle de blink est dépassé
isBlinking = false; //mode isblinking désactivé
shutDownLeds(); //on éteint les leds
incrementerCompteur (typeMateriel);
}
}
}
int getLedPort(int boite) { //fonction qui prend le port de la led selon la boite activée
int port;
switch (boite) {
case 1 :
port = 6;
break;
case 2 :
port = 7;
break;
case 3 :
port = 8;
break;
case 4:
port = 9;
break;
default:
return 0;
}
return port;
}
void affichageStandard () {
lcd.setCursor(0, 0);
lcd.print (nombreVis);
lcd.setCursor(12, 0);
lcd.print ("VIS");
lcd.setCursor(0, 1);
lcd.print (nombreClous);
lcd.setCursor(12, 1);
lcd.print ("CLOUS");
lcd.setCursor(0, 2);
lcd.print (nombreBieres);
lcd.setCursor(12, 2);
lcd.print ("BIERES");
lcd.setCursor(0, 3);
lcd.print (nombreAbrasifs);
lcd.setCursor(12, 3);
lcd.print ("ABRASIFS");
}
int incrementerCompteur (int materiel) {
switch (materiel) {
case 1:
nombreVis = nombreVis + 10;
return nombreVis;
break;
case 2:
nombreClous = nombreClous + 50;
return nombreClous;
break;
case 3:
nombreBieres = nombreBieres + 3;
return nombreBieres;
break;
case 4:
nombreAbrasifs = nombreAbrasifs + 5;
return nombreAbrasifs;
break;
}
}
void afficherMessage (int materiel) {
unsigned long currentTime = millis(); //on définit le temps présent
if (currentTime - departAffichage < dureeAffichage) {
switch (materiel) {
case 1 :
lcd.setCursor (0, 0);
lcd.print ("+ 10 vis !");
lcd.setCursor (0, 1);
lcd.print (" Une vis avertie en vaut 2 !");
break;
case 2 :
lcd.setCursor (0, 0);
lcd.print ("+ 50 clous !");
lcd.setCursor (0, 1);
lcd.print (" Tu es le clou du spectacle !");
break;
case 3 :
lcd.setCursor (0, 0);
lcd.print ("+ 3 bieres !");
lcd.setCursor (0, 1);
lcd.print ("#YOLO");
break;
case 4 :
lcd.setCursor (0, 0);
lcd.print ("+ 5 abrasifs !");
lcd.setCursor (0, 1);
lcd.print ("Poncer avec modération");
break;
}
}
}
void shutDownLeds() {
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
Du coup, j'ai enlevé toutes mes instructions lcd.clear() inutiles, pour en ajouter une seule au debut après l'initialisation, et une autre au début de la loop après le premier if. Comme attendu, l'écran ne grésille plus pendant l'affichage du message, mais en revanche quand la phase de clignotage/affichage du message se termine, l'affichage standard conserve les caractères liés à l'affichage du message. J'ai essayé d'ajouter lcd.clear() à plusieurs endroits, sans succès : soit ça ne fait rien, soit ça fait rafraîchir mon affichage standard à chaque loop.
Pourtant, il me semble que si je concluais ma fonction afficherMessage par un lcd clear, une fois que l'intervalle est dépassé, ça devrait fonctionner...
Bref, je tatonne un peu, as-tu des conseils ?
Merci
léo