Pareil, le Barbudor s'est fourvoyé.
- Une erreur de frappe : digitalWrite( last_pressed, LOW ); au lieu de digitalWrite( broche_led[last_pressed], LOW );
qui empéchait les leds de s'éteindre - Une erreur de logique : j'ai oublié de rallumer la led si c'est la meme et qu'elle est éteinte
Donc une version qui marche et qui reste simple à lire (toujours sans 2eme boucle)
byte last_pressed = 0;
byte last_state = 0;
void setup() {
for(byte i = 0; i < sizeof(broche_bp); ++i) {
pinMode(broche_bp[i], INPUT);
pinMode(broche_led[i], OUTPUT);
}
}
void loop()
{
for(byte i = 0; i < sizeof(broche_bp); ++i) { // On scan chaque boutons
if( digitalRead(broche_bp[i]) == HIGH ) { // Si le boutons est appuyé
digitalWrite( broche_led[last_pressed], LOW ); // on éteint la LED précédente, marche aussi si la précédente est la même que la courante
if ( (i != last_pressed) || !last_state ) { // on allume la led si différente de la précédente OU si le précédent état est éteint
digitalWrite( broche_led[i], HIGH );
last_state = true; // on mémorise l'état allumé (au moins une led)
}
else
last_state = false; // on mémorise l'état eteint (toutes les leds)
last_pressed = i; // on mémorise la dernière led qui a changé
while ( digitalRead(broche_bp[i]) == HIGH ); // on attend le relaché
break; // on sort du for
}
}
}
Et une version plus compacte mais peut être moins lisible (juste le code central qui change)
if( digitalRead(broche_bp[i]) == HIGH ) { // Si le boutons est appuyé
digitalWrite( broche_led[last_pressed], LOW ); // on éteint la LED précédente, marche aussi si la précédente est la même que la courante
last_state = (i != last_pressed) || !last_state;
if ( last_state ) // on allume la led si différente de la précédente OU si le précédent état est éteint
digitalWrite( broche_led[i], HIGH );
last_pressed = i; // on mémorise la dernière led qui a changé
while ( digitalRead(broche_bp[i]) == HIGH ); // on attend le relaché
break; // on sort du for
}