INTERRUPTION

Bonjour,
je voudrais par l’appui sur un BP (interruption), allumer une led pendant 1s.
Le petit programme joint fonctionne si l’appui sur le BP est < à 1s,
si l’appui sur le BP et > à 1s le temps de l’allumage de la led est < à 1s,

Si je change
attachInterrupt(0, Appel_Interruption, LOW);
par
attachInterrupt(0, Appel_Interruption, FALLING);
là led led s’allume 1s et se rallume 1s si je lâche le BP après 1s.

Quelqu’un as-t-il une explication?
Merci.
Marc.

int led = 13;
volatile int Interruption = HIGH; 
volatile unsigned long debut_temps_BP = 0;
volatile unsigned long fin_temps_BP = 0;
int anti_rebond = 250; // anti-rebond en ms
//**************************************** 
void setup()
{
  Serial.begin(115200); //Vitesse du port serie 
  pinMode(led, OUTPUT);
  attachInterrupt(0, Appel_Interruption, FALLING); // Bouton poussoir
  //LOW:état BAS, CHANGE:change état
  //RISING:Front montant, FALLING:Front descendant
}
//****************************************
void loop()
{
  if (Interruption==LOW)
  {   
    digitalWrite(led, HIGH); 
    delay(1000);
  }
  Interruption=HIGH;
  digitalWrite(led, LOW);
}
//******************FONCTIONS***********
void Appel_Interruption() 
{
  debut_temps_BP = millis();
  if (debut_temps_BP - fin_temps_BP > anti_rebond)
  {
    Interruption = LOW; 
    fin_temps_BP = debut_temps_BP;
  }
}

Salut,

Effet de rebond :wink: Quand tu relâches ton bouton il rebondit, ça se voit évidemment pas à l’oeil nu mais électriquement ça se voit très bien.

La parade dans ton cas consiste à desactiver l’interruption quand elle est levé, et de la réactiver un certains temps (genre 50 ms) après le relâchement (une fois que la “tempête” est passée quoi).

De plus ton code n’est pas très rigoureux. Il faut réaliser le moins de chose possible dans une interruption, la temporisation n’a rien à y faire.

Ou juste mettre un condensateur de 100 nF en parallele sur le bouton !
Sans se prendre la tête à modifier le code.
Les choses simples sont toujours les meilleures.

Néanmoins, quand on regarde son code de près, j’avoue que les symptômes décrits semblent assez inexplicables.

Rebond ou pas, fonction de associée à l’interruption trop longue ou pas, je ne vois pas comment

  if (Interruption==LOW)
  {   
    digitalWrite(led, HIGH); 
    delay(1000);
  }
  Interruption=HIGH;
  digitalWrite(led, LOW);

pourrait conduire à une led qui s’allume pendant moins d’une seconde.

Le delay pourrait être réduit s’il est trop interrompu ?
Je croyais que c’était le contraire.
Ou alors c’est le fait d’appeler une fois la fonction millis() dans la routine d’interruption qui fiche la grouille?

NB : les deux dernières lignes seraient mieux à l’intérieur du bloc associé au if

Avec vos remarques j'ai corrigé.

int led = 13;
volatile int Interruption = HIGH; 
//**************************************** 
void setup()
{
  Serial.begin(115200); //Vitesse du port serie 
  pinMode(led, OUTPUT);
  attachInterrupt(0, Appel_Interruption, FALLING); 
  // Bouton poussoir Pin3 : entrée numérique 2
}
//****************************************
void loop()
{
  if (Interruption==LOW)
  {   
    digitalWrite(led, HIGH); 
    delay(1000);
    Interruption=HIGH;
  }
  else
  {
    digitalWrite(led, LOW);
  }
}
//******************FONCTIONS***********
void Appel_Interruption() 
{
  //condensateur 100nF en // sur BP  
  Interruption = LOW;   
}

J'ai toujours avec
Appel_Interruption, FALLING);
là led s'allume 1s et s'éteind se rallume 1s et s'éteind si BP est relaché après 1s.
ce qui est étonnant c'est que je puisse avoir une interruption par front montant alors
que j'ai programmé le front descendant!!!!!!!!!.
J'en déduit que l'interruption doit être inférieur au temps de la fonction loop!!!!!!!!!!!!!

Pour moi cela signifie qu'il y a un truc louche sur ton montage
Et que quand tu relâches le bouton, il reste des rebonds qui déclenchent le FALLING

Voir ce lien

HHHuummmmm .... Il est branché comment ton bouton ?

Mon BP est câblé comme sur le lien de "Bricolo", j'ai refait le montage, sans succès, j'ai fini par changer le BP et maintenant c'est OK. Dans le montage définitif j'utiliserai un lecteur optique à fourche, en plus il n'y a pas de rebon sur ce matériel et pas de mécanique.
Je vous remercie vous avez été très patient.