compteur-impulsions.ino

Arduino Nano (Classic, ATmega328P) · Fichier : compteur-impulsions.ino · Langage : Arduino · Usage : Compter des impulsions sans perdre de front

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

← Retour à la fiche