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
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);
}
}
super, merci beaucoup, je crois que cette page va bien m'aider
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