Interruption PIN2 lancée au démarrage de l'Arduino

Bonjour,

je réalise un projet perso : une veilleuse pour mes chouppettes, avec un ring led 24 et le but c’est de le faire passé en orange au bout de x heures pour donner le feu vert pour se lever le matin :slight_smile:

oui, la technologie va nous aider a dormir un peu plus longtemps (les filles sont d’accord sur le principe pour l’instant)

Je souhaite définir le nombre d’heures (ou de demi heure) en utilisant un bouton, relié sur la pin 2 pour déclencher une interruption, chaque fois que j’appuis sur le boutton je vais incrémenter un compteur, qui sera mon nombre d’heures.

Je remarque que mon bouton poussoir produit des rebonds et déclenche 3 ou 4 fois l’interruption par appuis

=> j’ai utilisé le mode pullUP sur la pin 2, et j’ai tenté les mode RISING et FALLING

en codant un “débounceur” je filtre bien les bounces, mais cependant…

au démarrage de l’Arduino nano, je remarque que l’interruption est lancé

 attachInterrupt(digitalPinToInterrupt(2), push_button , LOW ); //attache l'interruption externe n°0 (poin 2) à la fonction "push_button"

voici comment les grandes lignes du prog sont codées

#define PIXEL_COUNT 24 // On définit le nombre de LED compris sur le ring

void setup()
{
  strip.begin(); // Lance la connection
  strip.show(); // Initialise toute les led à 'off'
  Serial.begin(9600);
  
  pinMode(2, INPUT_PULLUP);

  anti_bounce_end();

}
...

int time2wakeUP;
int bounce = 1000;

unsigned long time;



void displayTime2wakeUp () //affiche le temps avant passage à l'heure de réveil
{
  for (int i = 0; i < time2wakeUP ; i++)
  {
    strip.setPixelColor(i, 0, 0, 255);
  }
  strip.show();
  delay(200);
}

void anti_bounce_start ()
{
  //avoid bounce of push button
  detachInterrupt(digitalPinToInterrupt(2));
}

void anti_bounce_end()
{
  //avoid bounce of push button
  delay(bounce);
  attachInterrupt(digitalPinToInterrupt(2), push_button , FALLING ); //attache l'interruption externe n°0 (poin 2) à la fonction "push_button"
}

void add_one_to_timer()
{
  if ( time2wakeUP < PIXEL_COUNT)
  { 
    time2wakeUP++;
  }
  else
  {
    time2wakeUP = 0;
  }
}

void  push_button ()
{
  Serial.println("push_button");
  
  anti_bounce_start();
  
  add_one_to_timer();

  displayTime2wakeUp();

  anti_bounce_end();
}

de temps en temps, l’interruption n’est pas lancée, mais la plus part du temps, dès que je relance l’instruction attachInterrupt, je déclenche l’interruption

je ne comprends pas pourquoi :frowning:

s’agit’il d’un comportement connu ?

un temps de charge d’une capa ?

thank’s for any help

Br,
FLYhooo

Mettez la PIN 2 en INPUT_PULLUP comme première instruction du setup() (plus par principe)

Vérifiez que votre bouton est bien câblé:
PIN 2 <<<---->>> BOUTON <<<----->>> GND

Le rebond est normal et attachInterrupt() n’efface pas les interruptions qui ont eu lieu “avant” la commande (il y a eu des demandes pour changer ce comportement) mais certaines librairies dépendent de ce comportement (pour de bonnes raisons) et donc ça a été conservé

vous pouvez effacer une interruption pré-existante en effaçant le drapeau associé juste après avoir attaché l’interruption par un

   EIFR |= (1 << INTF0);    // clear any outstanding interrupt 0
// OR
   EIFR |= (1 << INTF1);    // clear any outstanding interrupt 1

pour vous la pin 2 est l’interruption #0 donc uniquement le première ligne suffira.

En pratique vous ne devriez pas bloquer la loop et pas besoin des interruptions pour gérer un bouton.

Hello,

merci !

c’est effectivement résolu avec

EIFR |= (1 << INTF0); // clear any outstanding interrupt 0

en effet, suite à mes lectures sur les interruptions, c’est plus pour des événements de sécurité ou très précis,

mais je voulais “jouer” avec les interruptions, ça m’a rappeller mes anciens cours sur intel 8086

je vais revoir comment re-architecturer mon code, la programmation dans une boucle infinie n’est pas encore intuitive pour moi

c’est une architecture assez différente de ce que je fais d’habitude :slight_smile:

Merci encore,
FLYhooo

bonne nouvelle ! :slight_smile: