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
- Ordinateur
- Arduino UNO
- Câble USB A Mâle/B Mâle
- Un capteur analogique
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:
- le tableau met un certain temps à se remplir. Il y a, donc, un délai à l’établissement de la moyenne. Attention, à le prendre en compte au démarrage du microcontrôleur
- la variation de la mesure sera plus lente, il sera donc impossible de détecter des phénomènes « rapides ». Vérifiez bien le comportement de ce que vous souhaitez mesurer
- le tableau prend plus de place en mémoire et demande du temps de gestion
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
- Filtrage de mesure
- Réduire le bruit sur la mesure d’une température
Sources
- Le filtrage en électronique
- https://www.aranacorp.com/fr/donnez-des-sens-a-votre-robot/
- https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie
Bonjour,
j’utilise un écran LCD et non un affichage série. Comment faire pour écrire la moyenne sur un LCD avec ce programme ?
Merci
Si c’est un écran LCD 16×2, vous pouvez suivre ce tutoriel et ajouter les fonctions d’écriture dans le code.