Afficher une valeur moyenne tout les X valeurs

Bonjour,

Voici ma problématique :

J utilise des thermocouple avec module MAX6675 , J'ai testé mon programme qui m affiche une valeur de temperature toute les 500ms.

Le probleme c est que les valeurs indiquées ne sont pas vraiment stables, j'aimerais donc afficher une valeur moyenne toute les 3s par exemple pour une meilleure précision.

#include "max6675.h"  //La librairie du MAX6675

int thermoSO = 4;  // Data Out Port SPI sur 4-5-6
int thermoSCK = 6;  //Clock
int thermoCS1 = 5;  //Chip Select
int thermoCS2 = 7;  //Chip Select

// Déclarer les pins utilisées
MAX6675 thermocouple1(thermoSCK, thermoCS1, thermoSO);
MAX6675 thermocouple2(thermoSCK, thermoCS2, thermoSO);

void setup() {
  Serial.begin(9600);  //Pour afficher à l'écran du PC
 
  Serial.println("Thermocouple et MAX6675");
  delay(500);   //Attendre l'initialisation du module MAX
}

void loop() {
  //  Boucle de mesure de la température 
  
   Serial.print("C1 = "); 
   Serial.println(thermocouple1.readCelsius());
   Serial.print("C2 = "); 
   Serial.println(thermocouple2.readCelsius());
   delay(500);  //1 mesure par seconde
}

J'ai essayé de chercher sur le forum et certains parlent de'' détection à hystérésis '' mais n'existe t il pas une fonction simple qui puisse afficher la moyenne directement ?

Bonjour,

Tu remplis une table de 6 floats à chaque mesure et quand la table est pleine (au bout de 3s) tu fais la moyenne et tu l'affiches.
Tu peux aussi faire une moyenne glissante en décalant les valeurs de la table pour ranger la nouvelle valeur et en faisant la moyenne.

Bonjour,

Par là: moyenne glissante site:http://forum.arduino.cc - Google Search

Il faut que tu calcules ta moyenne toi-même : tu as 2 mesures par seconde, si tu veux une moyenne sur 3 secondes, il te faut 6 mesures.

Pour chaque thermocouple, tu sommes les 6 dernières valeurs mesurées. Chaque 6 mesures, tu calcules la moyenne des valeurs mesurées. Ça donnerait un truc comme ça (pas testé) :

#include "max6675.h"  //La librairie du MAX6675

int thermoSO   = 4;  // Data Out Port SPI sur 4-5-6
int thermoSCK = 6;  //Clock
int thermoCS1 = 5;  //Chip Select
int thermoCS2 = 7;  //Chip Select

// Déclarer les pins utilisées
MAX6675 thermocouple1(thermoSCK, thermoCS1, thermoSO);
MAX6675 thermocouple2(thermoSCK, thermoCS2, thermoSO);

void setup() {
  Serial.begin(115200);  //Pour afficher à l'écran du PC

  Serial.println("Thermocouple et MAX6675");
  delay(500);   //Attendre l'initialisation du module MAX
}

void loop() {
  int Somme1 = 0;
  int Somme2 = 0;
  int n = 0;
  while (n < 6) {
    //  Boucle de mesure de la température
    Serial.print("Mesure numéro ");
    Serial.print(n);
    Serial.print("\tC1 = ");
    int C1 = thermocouple1.readCelsius();
    Serial.print(C1);
    Serial.print("\tC2 = ");
    int C2 = thermocouple2.readCelsius();
    Serial.println(C2);
    delay(500);  //2 mesures par seconde
    Somme1 += C1;
    Somme2 += C2;
    n++;
  }
  float Moyenne1 = Somme1 / 6.0;
  float Moyenne2 = Somme2 / 6.0;
  Serial.print("Moyenne Capteur 1 = ");
  Serial.println(Moyenne1,1);
  Serial.print("Moyenne Capteur 2 = ");
  Serial.println(Moyenne2,1);
}

J’ai forcé l’affichage de la moyenne à un chiffre après la virgule, ce qui me semble suffisant. Et j’ai réglé la console à 115200 bauds.

DAMNED : grillé par kamill et fdufnews !! :slight_smile:

kamill:
Bonjour,

Tu remplis une table de 6 floats à chaque mesure et quand la table est pleine (au bout de 3s) tu fais la moyenne et tu l'affiches.
Tu peux aussi faire une moyenne glissante en décalant les valeurs de la table pour ranger la nouvelle valeur et en faisant la moyenne.

  1. Excusez mon incompétence mais qu'est ce qu'un "float " c'est une mesure ?

  2. Quand vous dites "faire la valeure moyenne " vous parlez de cette fonction : float dbm = somme / nb de valeur dans le tableau ?

lesept:
Il faut que tu calcules ta moyenne toi-même : tu as 2 mesures par seconde, si tu veux une moyenne sur 3 secondes, il te faut 6 mesures.

Pour chaque thermocouple, tu sommes les 6 dernières valeurs mesurées. Chaque 6 mesures, tu calcules la moyenne des valeurs mesurées. Ça donnerait un truc comme ça (pas testé) :

#include "max6675.h"  //La librairie du MAX6675

int thermoSO   = 4;  // Data Out Port SPI sur 4-5-6
int thermoSCK = 6;  //Clock
int thermoCS1 = 5;  //Chip Select
int thermoCS2 = 7;  //Chip Select

// Déclarer les pins utilisées
MAX6675 thermocouple1(thermoSCK, thermoCS1, thermoSO);
MAX6675 thermocouple2(thermoSCK, thermoCS2, thermoSO);

void setup() {
 Serial.begin(115200);  //Pour afficher à l’écran du PC

Serial.println(“Thermocouple et MAX6675”);
 delay(500);   //Attendre l’initialisation du module MAX
}

void loop() {
 int Somme1 = 0;
 int Somme2 = 0;
 int n = 0;
 while (n < 6) {
   //  Boucle de mesure de la température
   Serial.print("Mesure numéro “);
   Serial.print(n);
   Serial.print(”\tC1 = “);
   int C1 = thermocouple1.readCelsius();
   Serial.print(C1);
   Serial.print(”\tC2 = ");
   int C2 = thermocouple2.readCelsius();
   Serial.println(C2);
   delay(500);  //2 mesures par seconde
   Somme1 += C1;
   Somme2 += C2;
   n++;
 }
 float Moyenne1 = Somme1 / 6.0;
 float Moyenne2 = Somme2 / 6.0;
 Serial.print("Moyenne Capteur 1 = ");
 Serial.println(Moyenne1,1);
 Serial.print("Moyenne Capteur 2 = ");
 Serial.println(Moyenne2,1);
}



J'ai forcé l'affichage de la moyenne à un chiffre après la virgule, ce qui me semble suffisant. Et j'ai réglé la console à 115200 bauds.

DAMNED : grillé par kamill et fdufnews !! :)

Merci pour ta réponse aussi précise, je vais tenter ton programme et le modifier si besoin .

oui 1 chiffre apres la virgule et suffisant pour une temperature

j’ai aussi remarqué que j’avais oublié de modifier 500ms = 2 mesures par seconde et tu l’a modifiée merci

float c'est une représentation d'un nombre à virgule. Pour en savoir plus, lis ça, chapitre data types.

fdufnews:
Bonjour,

Par là: moyenne glissante site:http://forum.arduino.cc - Google Search

Merci :wink:

@lesept

J'ai testé ton programme et il ne fonctionne pas malheuresement

une fois en route il m'affiche une sucession de caractéres illisibles du style : ? ? ? ? ? ? ?, ? ? ? ? ? ?w ? ? ? ? ? ? ? ? ?

Pourquoi avoir réglé la console à 115200 bauds qu est ce que cela change ?

Le baudrate de la console (par exemple 9600, ou 115200) doit être dans le code le même que celui choisi dans l'interface sinon ça affiche des trucs illisibles.

En effet cela fonctionne beaucoup mieux lorsque je remet ma valeur initial c est a dire 9600

Merci :slight_smile:

Il suffit d’effacer ou de commenter les lignes qui font l’affichage que tu ne veux pas :

  while (n < 6) {
    //  Boucle de mesure de la température
    // Serial.print("Mesure numéro ");
    // Serial.print(n);
    // Serial.print("\tC1 = ");
    int C1 = thermocouple1.readCelsius();
    // Serial.print(C1);
    // Serial.print("\tC2 = ");
    int C2 = thermocouple2.readCelsius();
   //  Serial.println(C2);

lesept:
Il suffit d’effacer ou de commenter les lignes qui font l’affichage que tu ne veux pas :

  while (n < 6) {

//  Boucle de mesure de la température
   // Serial.print("Mesure numéro “);
   // Serial.print(n);
   // Serial.print(”\tC1 = “);
   int C1 = thermocouple1.readCelsius();
   // Serial.print(C1);
   // Serial.print(”\tC2 = ");
   int C2 = thermocouple2.readCelsius();
  //  Serial.println(C2);

Oui désole pour ma question un peu bete car je m’en suis rendu compte tout seul en faisant des tests.

J aurais du reflechir un peu plus avant de poser ma question

En tout cas merci beaucoup tu m’a éte d’une grande aide du début a la fin :slight_smile:

Le code actuel fait une moyenne sur une période de 3 secondes, puis recommence à zéro. C’est à dire que tu dois attendre 3 secondes pour avoir la moyenne suivante. Ce n’est pas ce qu’on appelle une moyenne glissante, c’est à dire qui se met à jour à chaque nouvelle mesure, en calculant à partir des 6 dernières mesures.

Si tu veux faire une moyenne glissante, il faudrait changer le code.

Bonjour;
J'accroche au sujet;
Je viens juste proposer cela sur un autre sujet.

Pour ce qui est de la moyenne ! Permettez moi une suggestion !!?

Étant donné que tu effectue X mesures utiles pour le calcule de ta moyenne...
Que -finalement - chaque valeurs de mesures chargées serra additionné à la précédente...
Pourquoi ne pas simplement les additionner à chaque relevés puis exécuter une division une fois le nombre X de mesure relevés.

Ce qui reviens en somme à effectuer l'addition et un comptage des relevés pour ensuite traiter la moyenne par calcul.
Plutôt que de les charger dans un tableau -qui occupera de l'espace mémoire- et demandera un phase de traitement supplémentaire.

Perso: L'utilisation d'un tableau est plutôt utile pour le traitement de donnée distinctes.

Salutations.

Si tu divises ta somme par un nombre de données constant, il faut que cette somme porte sur ce nombre de données. Disons 10 pour fixer les idées. Lorsque tu viens de faire ta division, tu fais une nouvelle mesure : si tu veux faire la nouvelle moyenne sur les 10 dernières mesures, il faut pouvoir soustraire de la somme la toute première mesure sinon ta somme portera sur 11 mesures. Il faut donc conserver cette première valeur en mémoire. Le coup suivant ce sera le tour de la seconde, etc. Donc au final tu dois conserver tes 10 valeurs en mémoire, d’où le tableau. C’est une moyenne glissante, car elle porte sur un ensemble de données “glissant”.

Maintenant si tu te contentes d’ajouter à la somme la mesure courante pour calculer la nouvelle moyenne en divisant cette somme par le nombre de données augmenté de 1, tu fais porter ta moyenne sur l’ensemble de toutes les mesures. Cela peut introduire un biais. Pour des températures, il peut faire pus froid la nuit que le jour et si ton ensemble de données contient les données de nuit et du jour, la moyenne n’a plus beaucoup de sens.

Au bout d’un très grand nombre de données, l’impact de la dernière mesure devient très faible et la moyenne devient invariable. Ça n’a plus d’intérêt, il faut recommencer à 0.

Non, le mieux c’est la moyenne glissante sur un intervalle de données qui a du sens (et ça, ça dépend de l’application : une moyenne de 10 températures sur un intervalle glissant d’une ms n’a pas de sens).

manumanu:
Bonjour;
J'accroche au sujet;
Je viens juste proposer cela sur un autre sujet.

Pour ce qui est de la moyenne ! Permettez moi une suggestion !!?

Étant donné que tu effectue X mesures utiles pour le calcule de ta moyenne...
Que -finalement - chaque valeurs de mesures chargées serra additionné à la précédente...
Pourquoi ne pas simplement les additionner à chaque relevés puis exécuter une division une fois le nombre X de mesure relevés.

Ce qui reviens en somme à effectuer l'addition et un comptage des relevés pour ensuite traiter la moyenne par calcul.
Plutôt que de les charger dans un tableau -qui occupera de l'espace mémoire- et demandera un phase de traitement supplémentaire.

Perso: L'utilisation d'un tableau est plutôt utile pour le traitement de donnée distinctes.

Salutations.

Bonjour,

Je suis comme qui dirait un 'Newbie' dans ce domaine je débute a peine.Toutes remarques ou suggestions sont donc bienvenues

Ta méthode a l'air simple et efficace, je ne vois pas pourquoi cela ne fonctionnerais pas et comme tu le dit cela evite certains traitement supllémentaire

La différence entre la moyenne glissante et une moyenne "classique" c'est:

  • La moyenne glissante donne une valeur filtrée à chaque échantillon
  • La moyenne "classique" ne fournit un résultat que toutes les N mesures
  • La moyenne glissante a besoin d' un tableau pour stocker N mesures afin faire le calcul
  • La moyenne "classique" n'a pas besoin d'un tableau
    Après c'est le besoin qui dicte le choix.