Clignotement de led

Salut ,
Je galere un peut parce que je dois faire un code pour un systeme d'appel malade sur une carte arduino. Il consiste a avoir 3 boutons poussoir (vert,jaune et rouge) et 3 leds (vert,jaune et rouge) et :
-Le bouton rouge allume la led rouge
-Le bouton jaune allume la rouge et la jaune
-Le bouton vert allume le vert et eteind les deux autres
-Si la led verte est allumer et j'appuye sur le bouton rouge la led rouge doit clignoter
-Si la led verte est allumer et j'appuye sur le bouton jaune la led rouge et jaune doit clignoter
Mon probleme est que j'ai mit un delay pour faire clignoter mais quand j'appuye une fois sur le bouton vert pour eteindre la led rouge ou rouge et jaune qui clignote je dois rester appuyer longtemps a cause du delay . Voici mon code :

int LRED = 4;
int LYELLOW = 3;
int LGREEN = 2;
int BRED = A0;
int BYELLOW = A1;
int BGREEN = A2;
bool greenLedState = false;
bool previousGreenButtonState = HIGH;

void setup() {
  pinMode(LRED, OUTPUT);
  pinMode(LYELLOW, OUTPUT);
  pinMode(LGREEN, OUTPUT);
  pinMode(BRED, INPUT_PULLUP);
  pinMode(BYELLOW, INPUT_PULLUP);
  pinMode(BGREEN, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  if (digitalRead(BRED) == HIGH) { 
    digitalWrite(LRED, HIGH);
  } else if (digitalRead(BYELLOW) == HIGH) { 
    digitalWrite(LRED, HIGH);
    digitalWrite(LYELLOW, HIGH);
  } else if (digitalRead(BGREEN) == HIGH) {
    digitalWrite(LGREEN, HIGH);
    digitalWrite(LRED, LOW);
    digitalWrite(LYELLOW, LOW);
  }
  
  bool currentGreenButtonState = digitalRead(BGREEN);
  if (currentGreenButtonState == LOW && previousGreenButtonState == HIGH) {
    greenLedState = !greenLedState; 
    digitalWrite(LGREEN, greenLedState);
  }
  previousGreenButtonState = currentGreenButtonState;

  if (digitalRead(LGREEN) == HIGH && digitalRead(BRED) == HIGH) {
    while (digitalRead(BGREEN) ==LOW) {
      digitalWrite(LRED, HIGH);
      delay(500);
      digitalWrite(LRED, LOW);
      delay(500);
      }
    }
  if (digitalRead(LGREEN) == HIGH && digitalRead(BYELLOW) == HIGH) {
    while (digitalRead(BGREEN) ==LOW) {
      digitalWrite(LRED, HIGH);
      digitalWrite(LYELLOW, HIGH);
      delay(500);
      digitalWrite(LRED, LOW);
      digitalWrite(LYELLOW, LOW);
      delay(500);
      }
    }
  if (digitalRead(LGREEN) == HIGH && digitalRead(BGREEN) == HIGH) {
    digitalWrite(LGREEN, LOW);
    digitalWrite(LRED, LOW);
    digitalWrite(LYELLOW, LOW);
  }
}

Bonjour lalbi_91
Est-ce-que tes boutons sont câblés d'un côté à GND ?
Ce devrait être ainsi du fait que tu les initialises PULLUP.
Dans ce cas quand le bouton est pressé, tu dois lire == LOW et non pas == HIGH.

Cordialement
jpbbricole

Votre code dit "pendant que vous appuyez sur BGREEN... (1) iight LRED et LYEL (2) ne font rien pendant 0,5 seconde (3) éteignent LRED et LYEL (4) ne font rien pendant 0,5 seconde... répéter." Vous devez « définir un drapeau » qui dit « SI BGREEN a été enfoncé, démarrez une minuterie, si la minuterie a atteint 0,5 seconde, allumez LRED et LYEL, démarrez la minuterie, si la minuterie a atteint 0,5 seconde, éteignez LRED et LYEL. » Lisez « Cligner des yeux sans délai »

https://docs.arduino.cc/built-in-examples/digital/BlinkWithoutDelay/

Bonjour,

Dans ce genre d'application, les delay() sont une calamité. C'est un programme qui se prête bien à l'utilisation d'une machine à état.
Voir ici: