newbie led inter code tortueux

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
    }