Go Down

Topic: deux fonction avec un bouton poussoir (Read 547 times) previous topic - next topic

rapaces1992

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 ^^

infobarquee

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

rapaces1992

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);
  }
}

infobarquee

AUCUNE AIDE PAR MP

rapaces1992

Code: [Select]

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);
  }
}

infobarquee

AUCUNE AIDE PAR MP

rapaces1992

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

rapaces1992

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 :-/

infobarquee

as tu modifié ton code en fonction du lien?
vires les delay bloquants
AUCUNE AIDE PAR MP

Go Up