// Tachymètre avec capteur infrarouge
// Arduino Uno/Nano : interruption sur D2 ou D3

#include <Arduino.h>

const byte CAPTEUR_IR = 2;
const byte TOURS_PAR_IMPULSION = 1;

volatile unsigned long impulsions = 0;
volatile unsigned long derniereImpulsion = 0;

unsigned long derniereMesure = 0;
const unsigned long INTERVALLE_MESURE = 1000; // 1 seconde

void compterImpulsion() {
  unsigned long maintenant = micros();

  // Filtre anti-parasites : ignore les impulsions trop rapprochées
  if (maintenant - derniereImpulsion > 2000) {
    impulsions++;
    derniereImpulsion = maintenant;
  }
}

void setup() {
  Serial.begin(115200);

  // Beaucoup de modules IR ont une sortie active à LOW
  pinMode(CAPTEUR_IR, INPUT_PULLUP);

  attachInterrupt(
    digitalPinToInterrupt(CAPTEUR_IR),
    compterImpulsion,
    FALLING
  );

  Serial.println("Tachymetre pret");
}

void loop() {
  unsigned long maintenant = millis();

  if (maintenant - derniereMesure >= INTERVALLE_MESURE) {
    derniereMesure = maintenant;

    noInterrupts();
    unsigned long nombreImpulsions = impulsions;
    impulsions = 0;
    interrupts();

    // Comme la mesure dure 1 seconde :
    // RPM = impulsions par seconde x 60
    float rpm = (nombreImpulsions * 60000.0) /
                (INTERVALLE_MESURE * TOURS_PAR_IMPULSION);

    Serial.print("Vitesse : ");
    Serial.print(rpm);
    Serial.println(" tr/min");
  }
}
Éditer