compteur-impulsions.ino
Los impulsos cortos se pierden si escudriñas el pin: attachInterrupt en INT0 (pin 2 del Nano) captura cada flanco de bajada. Con antirrebote de software y copia atómica, el contador de agua o energía fiable al impulso.
Hardware
Un Arduino Nano clásico (ATmega328P a 16 MHz, formato DIL de 30 patillas para breadboard, USB mini-B, lógica de 5 V, pin RESET abajo a la izquierda). Arduino Nano, contacto seco o sensor de colector abierto en el pin 2, botón de prueba opcional.
Cableado
Contacto entre D2 y GND (INPUT_PULLUP interno); con sensores de impulsos, respeta el voltaje de salida.
Funcionamiento
La rutina de interrupción del pin 2 (INT0) incrementa un contador volatile; la ventana de 25 ms aplasta los rebotes mecánicos. noInterrupts enmarca la copia del contador de 32 bits.
Ejecución
En el IDE de Arduino, selecciona la placa Arduino Nano y el procesador ATmega328P, elige el puerto serie y carga. El rail de 5 V de la placa conviene a sensores de 5 V; si no, usa 3,3 V en pines compatibles.
Variantes
Cuenta dos vías (INT0 + INT1 pin 3) para un contador diferencial, o suma el total en EEPROM en cada apagado.
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)"));
}
}