Bonjour à toutes et à tous,
Problème qui semble enfantin mais s'avère désespérant pour le débutant que je suis : x boutons poussoirs, autant de led, chaque bouton en mode interrupteur commande une led. Jusqu'ici, tout va bien. Lorsque j'appuie sur le bouton 1, la led 1 s'allume, lorsque j'appuie à nouveau, elle s'éteint, et il en va de même pour les autres.
Là où ça coince, c'est que je voudrais que chaque changement de bouton provoque non seulement l'allumage de la led correspondante, mais également qu'il éteigne la led précédemment allumée, c'est-à-dire qu'il agisse comme un commutateur. J'appuie sur le bouton 1, la led 1 s'allume, j'appuie sur le bouton 2, la led 2 s'allume ET la led 1 s'éteint, j'appuie sur le bouton 5, la led 5 s'allume ET la led 2 s'éteint.
Entre autres solutions (naïves, foireuses et vouées à l'échec), j'ai pensé affecter une valeur à la dernière led allumée, (PIN_newLed dans mon code), mais ça ne fonctionne pas, les led restent allumées et refusent obstinément de s'éteindre.
// déclaration des variables
int PIN_led1 = 10;
int PIN_led2 = 11;
int PIN_led3 = 12;
int PIN_bp1 = 2;
int PIN_bp2 = 3;
int PIN_bp3 = 4;
int PIN_newLed;
void setup() {
pinMode(PIN_led1, OUTPUT);
pinMode(PIN_led2, OUTPUT);
pinMode(PIN_led3, OUTPUT);
pinMode(PIN_bp1, INPUT_PULLUP);
pinMode(PIN_bp2, INPUT_PULLUP);
pinMode(PIN_bp3, INPUT_PULLUP);
}
void loop() {
// on determine la position des boutons
static uint8_t dernierBp1 = HIGH;
static uint8_t dernierBp2 = HIGH;
static uint8_t dernierBp3 = HIGH;
uint8_t PIN_bp1 = digitalRead(2);
uint8_t PIN_bp2 = digitalRead(3);
uint8_t PIN_bp3 = digitalRead(4);
// premier bouton
if ((dernierBp1 != PIN_bp1) && (PIN_bp1 == LOW)) // detection d'un changement d'état du bouton
{
delay(20); // rebond
digitalWrite(PIN_led1, !digitalRead(PIN_led1)); // on allume la led 1
digitalWrite(PIN_newLed, !PIN_newLed); // on éteint la dernière led allumée
PIN_led1 = PIN_newLed; // la led1 devient newLed
}
// deuxième bouton
if ((dernierBp2 != PIN_bp2) && (PIN_bp2 == LOW)) //détection d'un changement d'état du bouton
{
delay(20); // rebond
digitalWrite(PIN_led2, !digitalRead(PIN_led2)); // on allume la led 2
digitalWrite(PIN_newLed, !digitalRead(PIN_newLed)); // on éteint la dernière led allumée
PIN_led2 = PIN_newLed; // la led 2 devient newLed
}
// troisième bouton
if ((dernierBp3 != PIN_bp3) && (PIN_bp3 == LOW)) // détection d'un changement d'état du bouton
{
delay(20); // rebond
digitalWrite(PIN_led3, !digitalRead(PIN_led3)); // on allume la led 3
digitalWrite(PIN_newLed, !digitalRead(PIN_newLed)); // on éteint la dernière led allumée
PIN_led3 = PIN_newLed; // la led 3 devient newLed
}
}
Il y a évidemment une erreur de codage, peut-être une erreur de raisonnement (ce qui serait plus grave), peut-être la fonction if... else est mal choisie, peut-être...
Merci pour vos remarques et vos solutions.
Cordialement.