deux fonction avec un bouton poussoir

Bonjour,

Mon professeur m'a demander de représenter le principe du "gache" (fermeture magnétique) d'une porte.
Pour ce faire, je dois utiliser un bouton poussoir, 4 leds rouges ( qui représentent un décompte et s'éteignent une à une en 4 secondes) et une led verte (qui s'allume quand la porte est ouverte).

A la base, la porte est fermée (4 leds rouges allumées et la led verte éteinte), en appuyant sur le bouton poussoir, les leds rouges s’éteignent une à une en 4 secondes. Ce temps passé, la led verte s'allume pour une durée de 5 secondes puis la porte se referme et les leds se remettent en position initiale (rouges allumées et verte éteinte).

Pour cela, tout fonctionne, mon problème se trouve ici: en appuyant à nouveau sur le bouton poussoir pendant la phase d'ouverte (décompte des leds rouges), la porte est censé se refermée immédiatement et donc les leds retourner à leur état de base.

J'ai commencé mon programme en donnant un statut=0 à une variable
Lorsque le statut=0 les leds sont dans leur position initiale.
Lorsqu'il passe à statut=1 la séquence d'ouverture se lance
Le fait d'appuyer sur le bouton poussoir active une fonction : statut=1-statut
Ainsi, a chaque appuis, le statut change de valeur.

cette fonction statut=1-statut est également présente à la fin de ma séquence afin de retourner à statut=0

Mon problème est que lorsque j’appuie à nouveau pendant la phase d'ouverte, le séquence se termine normalement et en recommence une nouvelle ai lieu de directement se remettre en position initiale.

Pouvez vous m'aider à trouver ce qui cloche?
merci d'avance ^^

bonjour,
un code a présenter?
il faut passer par une interruption et éviter les delays

Tout d'abord, merci pour la rapidité de réponse :slight_smile:
Voici ce que j'ai fais pour l'instant:

int BP=2;
volatile int statut=0;

int buz=12;

int rouge1=3;
int rouge2=4;
int rouge3=5;
int rouge4=6;
int vert=7;

void Bp_interrupt() {
statut = 1-statut;
}
void setup() {

pinMode (BP,INPUT);
pinMode (rouge1,OUTPUT);
pinMode (rouge2,OUTPUT);
pinMode (rouge3,OUTPUT);
pinMode (rouge4,OUTPUT);
pinMode (vert,OUTPUT);
digitalWrite (rouge1,HIGH);
digitalWrite (rouge2,HIGH);
digitalWrite (rouge3,HIGH);
digitalWrite (rouge4,HIGH);
digitalWrite (vert,LOW);

attachInterrupt (0,Bp_interrupt,RISING);
}

void loop() {

if (statut == 1) {
digitalWrite (rouge1,LOW);
delay (1000);
digitalWrite (rouge2,LOW);
delay (1000);
digitalWrite (rouge3,LOW);
delay (1000);
digitalWrite (rouge4,LOW);
digitalWrite (vert,HIGH);
delay (5000);
Bp_interrupt();
}
else {
digitalWrite (rouge1,HIGH);
digitalWrite (rouge2,HIGH);
digitalWrite (rouge3,HIGH);
digitalWrite (rouge4,HIGH);
digitalWrite (vert,LOW);
delay (1000);
}
}

code entre balise code </>
merci

int BP=2;
volatile int statut=0;

int buz=12;

int rouge1=3;
int rouge2=4;
int rouge3=5;
int rouge4=6;
int vert=7;

void Bp_interrupt() {
  statut = 1-statut;
}
void setup() {

pinMode (BP,INPUT);
pinMode (rouge1,OUTPUT);
pinMode (rouge2,OUTPUT);
pinMode (rouge3,OUTPUT);
pinMode (rouge4,OUTPUT);
pinMode (vert,OUTPUT);
digitalWrite (rouge1,HIGH);
digitalWrite (rouge2,HIGH);
digitalWrite (rouge3,HIGH);
digitalWrite (rouge4,HIGH);
digitalWrite (vert,LOW);

attachInterrupt (0,Bp_interrupt,RISING);
}

void loop() {
 
  if (statut == 1) {
    digitalWrite (rouge1,LOW);
    delay (1000);
    digitalWrite (rouge2,LOW);
    delay (1000);
    digitalWrite (rouge3,LOW);
    delay (1000);   
    digitalWrite (rouge4,LOW);
    digitalWrite (vert,HIGH);
    delay (5000);
    Bp_interrupt();
  }
  else {
digitalWrite (rouge1,HIGH);
digitalWrite (rouge2,HIGH);
digitalWrite (rouge3,HIGH);
digitalWrite (rouge4,HIGH);
digitalWrite (vert,LOW);
delay (1000);
  }
}

jètes un oeil ICI

super, merci beaucoup, je crois que cette page va bien m'aider :slight_smile:

mon problème est toujours là, lorsque j'appuie sue le bouton poussoir peandant la séquence d'ouverture, la valeur de mon statut change correctement au beau milieu de la séquence, mais celle-ci continue quand même et ne s'interrompt pas :-/

as tu modifié ton code en fonction du lien?
vires les delay bloquants