faire une moyenne de la temperature ...

ok j'essaie merci

Bonjour Je ne suis pas tout à fait d'accord avec ce calcul de la valeur moyenne, tous les 20 mesures la valeur moyenne est égale à la valeur mesurée. un vrai calcul de moyenne serait de faire un tableau de 20 éléments, indexé par un compteur allant de 0 à 19, à chaque mesure on inscrit sa valeur dans le tableau à l'adresse désignée par le compteur index ensuite on incrémente ce compteur. Après on fait la somme de tous les éléments du tableau que l'on divise par 20 on a ainsi la moyenne des 20 dernières mesures. A+

Précision: quand le compteur index arrive à 20 il est remis à 0. A+

djbouns: Merci Artouste

sa marche nikel. juste un petit problème que je n'est pas reussi a solutionner. avant ma temperature etait afficher "25°50" une fois la moyenne faite il ne m'affiche que 25°. sait tu comment faire pour avoir les decimal ?

merci

bonjour pour les decimales utilise du float comme indiqué par infobarquee mais je ne comprend pas ce qu fais dans ton code si tu veux utiliser la valeur moyenne, il ne faut pas en dehors du calcule de la moyenne, remplacer cette moyenne par la valeur instantanée la ta valeur temp est la valeur instantanée 9 fois sur 10 et la valeur moyenne 1 fois sur 10, ça ne sert pas à grand chose 8)

bonsoir,

artouste, je ne comprend pas pourquoi tu me dit sa. quelle parti de mon code ne vas pas et fait se que tu dit ? ccomment toi tu modifirais le code pour avoir la moyene tout le temp ?

djbouns: ccomment toi tu modifirais le code pour avoir la moyene tout le temp ?

lve123 t'a donné la solution.

j'ai compris se qu'il voulais dire mais je ne connait pas tout sa (jme suis lancer dans l'arduino pour mes poisson lol)

un vrai calcul de moyenne serait de faire un tableau de 20 éléments

je sait faire des tableau exel ... :P mais pas dans l'arduino ... :sweat_smile:

pour faire simple et éviter tes on/off de ventilo, je ferais carrément un truc comme ca, j’en ai parlé plus haut il me semble.
pourquoi faire comme ca?
1- plus simple
2- imagine que pour une raison X le thermo déconne et affiche 29C dans la boucle, ta moyenne sera fausse.

// au debut du code
int compteur0265 = 0; // tranche <26.5
int compteur265 = 0; // tranche 26.5 - 27
int compteur27 = 0; // tranche 27 - 27.5
int compteur275 = 0; // tranche 27.5 - 28
int compteur28 = 0; // tranche 28 et plus
int compteurmax = 10; // nb du compteur a ne pas dépasser
//on-off** ventilateur ***
if (temp < 26.5){
compteur0265++ ;
if (compteur0265 > compteurmax]{
analogWrite(ventilateur, 0);
lcd.setCursor(0,0);
lcd.print(“ventilateur OFF”);
compteur0265,compteur265,compteur27,compteur275,compteur28 = 0;
delay(5000);
}
}
else if ((temp >= 26.5) && (temp < 27)){
compteur265++ ;
if (compteur265 > compteurmax){
analogWrite(ventilateur, 30);
lcd.setCursor(0,0);
lcd.print(“ventilateur 10%”);
delay(5000);
compteur0265,compteur265,compteur27,compteur275,compteur28 = 0; // raz des compteurs
}

}
else if ((temp >= 27) && (temp < 27.5)){
compteur27++ ;
if (compteur27 > compteurmax){
analogWrite(ventilateur, 60);
lcd.setCursor(0,0);
lcd.print(“ventilateur 30%”);
delay(5000);
compteur0265,compteur265,compteur27,compteur275,compteur28 = 0; // raz des compteurs
}

}
else if ((temp >= 27.5) && (temp < 28)){
compteur275++ ;
if (compteur275 > compteurmax){
analogWrite(ventilateur, 150);
lcd.setCursor(0,0);
lcd.print(“ventilateur 60%”);
delay(5000);
compteur0265,compteur265,compteur27,compteur275,compteur28 = 0; // raz des compteurs
}

}
else if (temp >= 28){
compteur28++ ;
if (compteur28 > compteurmax){
analogWrite(ventilateur, 255);
lcd.setCursor(0,0);
lcd.print(“ventilateur 100%”);
delay(5000);
compteur0265,compteur265,compteur27,compteur275,compteur28 = 0; // raz des compteurs
}

}

djbouns: j'ai compris se qu'il voulais dire mais je ne connait pas tout sa (jme suis lancer dans l'arduino pour mes poisson lol)

un vrai calcul de moyenne serait de faire un tableau de 20 éléments

je sait faire des tableau exel ... :P mais pas dans l'arduino ... :sweat_smile:

bonjour accumuler des acquisitions et ensuite diviser la somme par un facteur X ou sommer les valeurs d'un tableau pour le diviser par le meme facteur X , ça revient strictement au même

dans ton cas il faut juste calculer la moyenne tous les X tours de boucles ET conserver cette valeur entre temps

Bonjour Ce n'est pas la même chose, avec le tableau on calcule la moyenne à chaque boucle. A chaque écriture dans le tableau on remplace la valeur 20 boucles auparavant et on recalcule la moyenne. On a donc la moyenne sur les 20 dernières mesures à chaque boucle. Je ferai une mesure toutes les 10 secondes, quoique avec tous les delay's ...

lve123: Bonjour Ce n'est pas la même chose, avec le tableau on calcule la moyenne à chaque boucle. A chaque écriture dans le tableau on remplace la valeur 20 boucles auparavant et on recalcule la moyenne. On a donc la moyenne sur les 20 dernières mesures à chaque boucle. Je ferai une mesure toutes les 10 secondes, quoique avec tous les delay's ...

ok approche différente pour obtenir et utiliser "une" moyenne chacune ayant ses avantages et ses inconvenients le thermometrie "lambda" là etant un processus à evolution lente le meilleur choix est fonction du taux d'acquisition.

Bonsoir, D'accord aussi. De toute façon je ne vois pas la nécessité de faire une moyenne pour la régulation sauf peut être voir la tendance de la variation de température soit faire la différence de deux moyennes consécutives, mais là on s'embarque... A+

bonjour

j'ai modifier mon code avec celui d'infobarquee je n'est pas compris le code en lui même mais sa a l'air de fonctionner donc merci.

de rien, fais vite fait comme ca, donc peut etre optimisé. le principe est simple : chaque fourchette de temp comporte un compteur si la temp est dans cette fourchette, on incrémente le compteur de cette fourchette et on met à zéro les autres. si le nb du compteur (compteurmax de mémoire ) est atteint on lance le ventilo à la valeur attribuée et on remet tous les compteurs à zéro. et ainsi de suite.

Ok c'est se que javais penser en le lisant mais sans conviction. je pence que c'est parfait pour solutionner mon probleme.

merci a tous

:sweat_smile: hier soir il faisait plus chaud que les jours précédent (24°) et du coup ... rebelote, a chaque boucle une fois a 26°5 et après 26° du coup ... le ventilo s'allume/s'éteins ... =( sa veut dire que le code marche pas correctement .... :disappointed_relieved: ]:D pouuuuuurquoiiiiiiiiiiiiii ]:D vas t'en petit démon du ventilateur :grin:

Bonjour,
Je pense que le ventilateur est trop puissant, pour peu qu’il tourne, la température descend trop vite.
Comment est-il installé, où est la sonde par rapport au ventilateur ?
A+

bonjour,

impossible que le ventilateur soit trop puissant (l'été dernier le bac montait a + de 28 ventilateur au max toute la journée dans que la pièce est a 25° en continue plusieurs jours) la sonde est dans la décante (meuble sous l'aquarium) si le code d'infobarquee est bon pourquoi j'ai les variation comme avant a la place d'une moyenne?

gnarfff, normal, comme quoi tu utilise les scripts sans les analyser :wink:
j’ai juste oublié de mettre un delay après chaque incrémentation, si bien que ton compteur s’incrémente toutes les millis, le temps de faire le loop.
mais bon, avec les temp, vu que ca varie en permanence, c’est normal aussi.
essaye ce code, ou sinon augmente le compteurmax=100

// au debut du code
int compteur0265 = 0; // tranche <26.5
int compteur265 = 0; // tranche 26.5 - 27
int compteur27 = 0; // tranche 27 - 27.5
int compteur275 = 0; // tranche 27.5 - 28
int compteur28 = 0; // tranche 28 et plus
int compteurmax = 10; // nb du compteur a ne pas dépasser
//on-off** ventilateur ***
if (temp < 26.5){
compteur265,compteur27,compteur275,compteur28 = 0;
compteur0265++ ;
delay(1000);
if (compteur0265 > compteurmax]{
analogWrite(ventilateur, 0);
lcd.setCursor(0,0);
lcd.print(“ventilateur OFF”);
compteur0265,compteur265,compteur27,compteur275,compteur28 = 0;
delay(5000);
}
}
else if ((temp >= 26.5) && (temp < 27)){
compteur0265,compteur27,compteur275,compteur28 = 0;
compteur265++ ;
delay(1000);
if (compteur265 > compteurmax){
analogWrite(ventilateur, 30);
lcd.setCursor(0,0);
lcd.print(“ventilateur 10%”);
lcd.print(“ventilateur ON”);
delay(5000);
compteur0265,compteur265,compteur27,compteur275,compteur28 = 0; // raz des compteurs
}

}
else if ((temp >= 27) && (temp < 27.5)){
compteur0265,compteur265,compteur275,compteur28 = 0;
compteur27++ ;
delay(1000);
if (compteur27 > compteurmax){
analogWrite(ventilateur, 60);
lcd.setCursor(0,0);
lcd.print(“ventilateur 30%”);
lcd.print(“ventilateur ON”);
delay(5000);
compteur0265,compteur265,compteur27,compteur275,compteur28 = 0; // raz des compteurs
}

}
else if ((temp >= 27.5) && (temp < 28)){
compteur0265,compteur265,compteur27,compteur28 = 0;
compteur275++ ;
delay(1000);
if (compteur275 > compteurmax){
analogWrite(ventilateur, 150);
lcd.setCursor(0,0);
lcd.print(“ventilateur 60%”);
lcd.print(“ventilateur ON”);
delay(5000);
compteur0265,compteur265,compteur27,compteur275,compteur28 = 0; // raz des compteurs
}

}
else if (temp >= 28){
compteur0265,compteur265,compteur27,compteur275 = 0;
compteur28++ ;
delay(1000);
if (compteur28 > compteurmax){
analogWrite(ventilateur, 255);
lcd.setCursor(0,0);
lcd.print(“ventilateur 100%”);
lcd.print(“ventilateur ON”);
delay(5000);
compteur0265,compteur265,compteur27,compteur275,compteur28 = 0; // raz des compteurs
}

}

j'ai pas retrouvé, mais tu utilise quoi comme sonde de temp? ca serait intéressant de le savoir pour voir si c'est au 1/10 ou 1/100 la précision.

EDIT : je pense à une chose, les autres confirmeront peut être. pourquoi ne pas utiliser simplement la fonction map, comme ca, le ventilo se mettra automatiquement à la bonne vitesse en fonctionne de la temp.