BUG dans le programme de TACHYMETRE

Bonjour,
J'ai trouvé un programme pour faire un TACHYMETRE.
Il fonctionne très bien quand il y a des signaux, mais à l'arrêt
le programme me donne un nombre long et aberrant et toujours le meme.
Je pense que c'est parcequ'on divise par la periode et comme elle est nul à l'arret, diviser par 0
doit faire buger le programme.
Comment puis-je faire?
Car j'aurais besoin plus tard de mesurer l'acceleration et la deceleration
Merci pour votre aide

Voici le programme
/**

  • Tachymétre minimaliste avec une carte Arduino
    */

/* constantes pour la broche de mesure */
const byte PIN_SIGNAL = 2;

/** Fonction setup() */
void setup() {

/* Initialise le port série */
Serial.begin(9600);

/* Met la broche en entrée */
pinMode(PIN_SIGNAL, INPUT_PULLUP);
}

/** Fonction loop() */
void loop() {

/* Mesure la durée de la (demi) période */
unsigned long periode = pulseInCycle(PIN_SIGNAL, HIGH, 1000000);

/* Affiche le résultat de la mesure en RPM

// avec juste un signal par tour */
// Serial.println(1000000 / periode * 60);

// avec 40 signaux par tour car
// disque de 20 trous soit 202 =40 etat/tour)/

Serial.print ("tourparmin");
Serial.println ( 1000/periode4060);
//exemple lire 55700 comme 55,7 tours/min

/* Affiche le résultat mesure en RPS tours/s /
Serial.print ("tourparsec");
Serial.println ( 1000/periode
40);
//lire 55700 comme 55,7 tours/s

delay(1000);
}

unsigned long pulseInCycle(byte pin, byte startState, unsigned long timeout) {

/* Compute low-level bitmask and port for direct I/O reading /
byte bitmask = digitalPinToBitMask(pin);
volatile byte
port = portInputRegister(digitalPinToPort(pin));
byte mask = startState ? bitmask : 0;

/* Get the starting time (for the timeout handling) */
unsigned long startMicros = micros();

/* Wait the end of the current starting state (avoid partial measure) */
while ((*port & bitmask) == mask) {
if (micros() - startMicros > timeout)
return 0;
}

/* Wait for the next starting state */
while ((*port & bitmask) != mask) {
if (micros() - startMicros > timeout)
return 0;
}

/* Start the counter */
unsigned long start = micros();

/* Measure the starting state duration */
while ((*port & bitmask) == mask) {
if (micros() - startMicros > timeout)
return 0;
}

/* Measure the ending state duration */
while ((*port & bitmask) != mask) {
if (micros() - startMicros > timeout)
return 0;
}

/* Compute the total duration */
return micros() - start;
}

En effet, la fonction pulseInCycle renvoie 0 si le temps de mesure dépasse le timeout que tu lui indiques (1000000).

Pour éviter de diviser par 0,tu peux faire un test sur la valeur de periode

pulseInCycle(PIN_SIGNAL, HIGH, 1000000);
if (periode == 0) {
  serial.println ("vitesse nulle") ;
} else {
// - - > ton code ici
}