Gestion d'un signal carré

Bonjour,
J'ai essayé de travailler sur le code, j'ai quelque chose qui fonctionne mais avec quelques bugs...
Je n'ai pas essayé la fonction "modulo".

J'ai fais une "maquette" de fonctionnement, dans le code:

  • j'ai remplacé le signal de l'optocoupleur par un bouton poussoir relié en int0 (j'ai rajouté une led en sortie 8 qui s'allume lors d'un passage de niveau haut, ce, juste pour visualiser ces derniers)

-j'ai remplacé la sortie de commande du transistor par une sortie (9) pilotant une led normalement alimentée (pour un visuel sur le fonctionnement)

Lorsque je simule le "mode4", j'incrémente bien mes interruptions, à la 4eme je coupe momentanément l'alimention de la led en 9 et je réinitialise ma séquence, l'interruption suivante reppart en 1.
Mais voilà, lorsque j'appuie rapidement sur l'interrupteur, l'incrémentation se fait mais ne se réinitialise pas à la 4eme impulsion et passe à 5, puis 6, etc... et là, ça ne fonctionne plus...

Je m'essaie à l'arduino que depuis quelques jours, il y a surement pleins d'erreurs dans le code mais je ne vois pas où...


const int buttonPin = 2;                        //assigne le bouton à la pin2
const int ledPin = 8;                           //assigne la led 1 à la pin8
const int ledPin2 = 9;                          //assigne la led 2 à la pin9

int buttonstate = 0;                            //le bouton est initialement à l'état bas

volatile int comptageImpulsion=0;               //le compteur d'impulsions est initialement à 0


void setup(){
pinMode(buttonPin,INPUT);                       //entree numérique  2 
pinMode(ledPin,OUTPUT);                         //sortie numérique  8 
pinMode(ledPin2,OUTPUT);                        //sortie numérique  9
 
Serial.begin(115200); 
attachInterrupt(0, gestionINT0, RISING);        // attache l'interruption externe n°0 à la fonction gestionINT0()

}


void loop(){

buttonstate = digitalRead(buttonPin);

if (buttonstate == HIGH)                        //si le bouton est à l'état haut
{
digitalWrite(ledPin,HIGH);                      //le courant est envoyé sur la borne 2, la LED  s’allume
}
else 
{
digitalWrite(ledPin,LOW);
}
if (comptageImpulsion == 4)                     //si le comptage d'impulsion est à 4
{
digitalWrite(ledPin2,LOW);                      //le courant est coupé sur la borne 9, la LED  s’éteind
delay (500);                                    //pendant 500ms pour visualiser la coupure
}
if (comptageImpulsion == 4)
{
  (comptageImpulsion = 0);                      //le compteur se réinitialise à 0
}
else 
{
digitalWrite(ledPin2,HIGH);                     //le courant est envoyé sur la borne 9, la LED  s’allume
}

}

void gestionINT0()                              //la fonction appelée par l'interruption externe n°0
{
comptageImpulsion=comptageImpulsion+1;          //incrémente la variable de comptage
Serial.print("Nombre impulsions = ");
Serial.println(comptageImpulsion);              //permet de visualiser le nombre d'impulsion sur le moniteur série
}