Site icon AranaCorp

Implémentation de la moyenne glissante dans Arduino

Un capteur analogique envoie un niveau de tension, généralement compris entre 0 et 5V, représentant une valeur physique. Cette tension peut être sujet à des bruits de mesure (interférence électronique, électromagnétique, précision de mesure, etc.). Dans certaines applications, vous aurez besoin d’une valeur assez stable pour faire vos calculs ou détecter les évènement qui vous intéresse. Une méthode simple à mettre en place est la méthode de la moyenne glissante qui permet de modifier la valeur lu en fonction de l’historique de la mesure.

Matériel

Principe de fonctionnement

Le principe de la moyenne glissante est d’enregistrer un certains nombre de mesure dans un tableau puis d’effectuer une moyenne de ces valeurs à chaque lecture. Il y a plusieurs défaut à cela:

Schéma

Une entrée analogique se branche de préférence sur une pin analogique du microcontrôleur. Il n’y a pas de branchement supplémentaire à effectuer pour faire fonctionner la moyenne glissante. C’est une solution purement algorithmique. Pour des résultats plus maitrisés, il est possible de mettre des filtres électroniques sur votre circuit de mesure.

Code

Nous allons créer une fonction qui va lire l’entrée analogique et gérer le tableau et le calcul de la moyenne. Dans ce code nous avons placer un delay() dans le loop, pour que l’affichage sur le moniteur série soit plus lent. Veillez à supprimer ce delay() pour des résultats plus cohérents.

//Parameters
const int aisPin  = A0;
const int numReadings  = 10;
int readings [numReadings];
int readIndex  = 0;
long total  = 0;

//Variables
int aisVal  = 0;

void setup() {
  //Init Serial USB
  Serial.begin(9600);
  Serial.println(F("Initialize System"));
  //Init AnalogSmooth
  pinMode(aisPin, INPUT);
}

void loop() {
  readAnalogSmooth();
  Serial.print(F("ais avg : ")); Serial.println(smooth());
  delay(200);
}

void readAnalogSmooth( ) { /* function readAnalogSmooth */
  ////Test routine for AnalogSmooth
  aisVal = analogRead(aisPin);
  Serial.print(F("ais val ")); Serial.println(aisVal);
}

long smooth() { /* function smooth */
  ////Perform average on sensor readings
  long average;
  // subtract the last reading:
  total = total - readings[readIndex];
  // read the sensor:
  readings[readIndex] = analogRead(aisPin);
  // add value to total:
  total = total + readings[readIndex];
  // handle index
  readIndex = readIndex + 1;
  if (readIndex >= numReadings) {
    readIndex = 0;
  }
  // calculate the average:
  average = total / numReadings;

  return average;
}




Résultat

Sur le moniteur série nous voyons que la valeur brute oscille entre 306 et 308 alors que la moyenne glissante reste stable à 305.

Applications

Sources

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

Quitter la version mobile