compteur-impulsions.ino
Les impulsions courtes se perdent si on scrute la broche : attachInterrupt sur INT0 (broche 2 du Nano) capture chaque front descendant. Avec l'anti-rebond logiciel et la copie atomique, le compteur d'eau ou d'énergie devient fiable au coup près.
Matériel requis
Un Arduino Nano classique (ATmega328P à 16 MHz, brochage DIL 30 broches sur breadboard, USB mini-B, logique 5 V, broche RESET en bas à gauche). Arduino Nano, contact sec ou capteur à collecteur ouvert sur la broche 2, bouton de test possible.
Câblage
Contact entre D2 et GND (INPUT_PULLUP interne) ; côté capteur à impulsions, respecter le voltage de sortie.
Fonctionnement
L'ISR WDT-like de la broche 2 (INT0) incrémente un compteur volatile ; la fenêtre de 25 ms écrase les rebonds mécaniques. noInterrupts encadre la copie du compteur 32 bits.
Exécution
Dans l'IDE Arduino, sélectionnez la carte Arduino Nano et le processeur ATmega328P, choisissez le port série puis téléversez. L'alimentation 5 V de la carte convient aux capteurs 5 V ; sinon utiliser le 3,3 V des broches adaptées.
Variantes
Comptez deux voies (INT0 + INT1 broche 3) pour un compteur différentiel, ou additionnez le total en EEPROM à chaque extinction.
compteur-impulsions.ino
// Compteur d'impulsions sur interruption externe (INT0 = broche 2).
// Ideal compteur d'eau/energie a contact sec, avec anti-rebond materiel.
volatile unsigned long impulsions = 0;
volatile unsigned long dernierFront = 0;
const int BROCHE = 2; // INT0 obligatoire pour attache materielle
const unsigned long REBOND = 25; // ms
void comptage() {
unsigned long maintenant = millis();
if (maintenant - dernierFront >= REBOND) {
impulsions++;
dernierFront = maintenant;
}
}
void setup() {
pinMode(BROCHE, INPUT_PULLUP); // contact vers GND
attachInterrupt(digitalPinToInterrupt(BROCHE), comptage, FALLING);
Serial.begin(9600);
}
void loop() {
static unsigned long derniereAffichage = 0;
if (millis() - derniereAffichage >= 1000) {
derniereAffichage = millis();
noInterrupts();
unsigned long copie = impulsions; // lecture atomique
interrupts();
Serial.print(F("impulsions : "));
Serial.print(copie);
Serial.print(F(" (debit ~ "));
Serial.print((copie - (copie)) * 60); // a vous de differencer
Serial.println(F("/min)"));
}
}