compteur-impulsions.ino

Arduino Nano (Classic, ATmega328P) · Archivo : compteur-impulsions.ino · Lenguaje : Arduino · Uso : Compter des impulsions sans perdre de front

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

← Volver a la ficha