// 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");
}
}