adc-filtre.ino

Arduino Nano Every · Fichier : adc-filtre.ino · Langage : Arduino · Usage : ADC 10 bits filtré par moyenne glissante

Le convertisseur analogique du Nano Every reste du 10 bits mais gagne des références internes 1,024/2,048 V, précieuses pour les petits signaux. Ce filtre exponentiel lisse le potentiomètre sans buffer et ne sort que si la valeur bouge vraiment.

Matériel requis

Un Arduino Nano Every (ATmega4809 à 20 MHz, brochage identique au Nano, USB micro-B, convertisseur UART séparé, broches 5 V, pile de compatibilité avec le Nano classique). Nano Every, source analogique 0-5 V sur A0 (potentiomètre pour tester).

Câblage

Signale sur A0, GND commun ; ne jamais dépasser VCC (5 V) sur une broche du 4809.

Fonctionnement

La moyenne exponentielle (alpha=0.1) pondère chaque lecture : constante de temps ~200 ms à 50 Hz. Le seuil de 2 points évite le remplissage du moniteur par du bruit de fond.

Exécution

Installez le package Arduino megaAVR Boards dans l'IDE, sélectionnez Arduino Nano Every, téléversez. Le Serial USB est séparé du Serial1 matériel (broches RX/TX) : le code série classique fonctionne tel quel.

Variantes

Passez analogReference(INTERNAL) pour un capteur 0-1 V sans amplificateur, ou augmentez ALPHA si la réactivité prime sur le bruit.

adc-filtre.ino

// ADC du 4809 : 10 bits comme le 328P, mais reference configurable.
// Filtre exponentiel + seuil de changement pour le moniteur serie.
const int CANAL = A0;
const float ALPHA = 0.1; // poids de la nouvelle mesure

float valeur = 0;
bool init = false;
unsigned long dernier = 0;

void setup() {
  Serial.begin(115200);
  analogReadResolution(10); // 0..1023 (par defaut sur Every)
  analogReference(DEFAULT); // 5 V ; INTERNAL = 1.024 V ou 2.048 V
}

void loop() {
  if (millis() - dernier < 20) return; // 50 Hz
  dernier = millis();
  float brut = analogRead(CANAL);
  if (!init) { valeur = brut; init = true; }
  // moyenne exponentielle : reactivite sans buffer de 16 mesures
  valeur = valeur * (1 - ALPHA) + brut * ALPHA;

  static float derniereSortie = -10;
  if (abs(valeur - derniereSortie) >= 2) { // mort d'affichage
    derniereSortie = valeur;
    Serial.print(F("brut="));
    Serial.print(valeur, 1);
    Serial.print(F(" V="));
    Serial.println(valeur * (5.0 / 1023.0), 3);
  }
}

← Retour à la fiche