faire une moyenne de la temperature ...

bonjour,

j'utilise mon arduino pour la gestion de mon aquarium. avec l'arriver des beau jour :zipper_mouth_face: j'ai decouvert un probleme avec ma gestion de temperature. un ventilateur se met en route selon la temperature trouvé mais celle ci varie entre chaque loop de 0.5° se qui fait allumer/eteintre tout le temps. voici la partie du code pour recumerer ma temperature

   //Récupération de la température du LM35 ***************************************************************************************

 int reading = analogRead(sensorPin);  
  float voltage = reading * 5.52 / 1024;
  int temp = voltage * 100 ;

je voudrait savoir comment faire pour avoir une moyene de la temperature sur 10 loop (par exemple).

merci

Tu peux faire une détection à hystérésis.

bonjour,

je ne suis pas sur de comprendre.
Pouvez-vous me donner le code modifié pour obtenir le résultat voulu svp.
Merci

Tu fais un seuil qui enclenche ton ventilo quand la température passe au dessus de 20° et un seuil qui éteint ton ventilo quand la température passe en dessous de 18°.

Je me permet d'intervenir, mais 2° d'écart sur un bac avec des poissons sensible peut dans certain cas être néfaste.

Ou alors 19° et 21°, peut être que là ce serait ok.

bonjour, +1 pour le degré d'écart, même soucis sur la couveuse si je mets au 0.5C près.

sinon pour ta moyenne, tu fais une boucle en incrémentant un compteur de temp et tu divise par ton nombre de la boucle. en prenant la temp toutes les 30s, cela suffit à mon sens, ca ne baissera pas de 10C à moins de le mettre dans le congélo :)

Déjà améliore la précision de la mesure.

20°C représentent 200mV en sortie du LM35. Si comme je le présume la carte Arduino est utilisée basiquement tu as encore la référence de tension du convertisseur analogique/numérique à 5V.
Passe sur la référence interne à 1,1 V et cela améliorera la précision de la mesure.

Découple correctement l’alim du LM35 avec des condensateurs (100µF chimique + 100nF céramique) tu éliminera du bruit.

Et si c’est toujours insuffisant fait une moyenne.
On commence toujours par réduire le défaut avant de le masquer.

bonjour?

effectivement infobarquee je déclenche a 0.5° de différence (a partir de 26.5°) a 26.5° allumer a 10% a 27° allumer a 30% a 27.5° allumer a 50% a 28° allumer a 80% a 28.5° allumer a 100%

j'ai déjà un condo (chimiqu emais je ne sait plus de copmbien) sur le lm35 et il est alimenter par du 12v.

peut tu me donner le code pour faire un compteur de temps stp

Je me permet d'intervenir, mais 2° d'écart sur un bac avec des poissons sensible peut dans certain cas être néfaste.

Les valeurs que j'ai donné été pour l'exemple...

Pas de soucis

infobarquee: bonjour, +1 pour le degré d'écart, même soucis sur la couveuse si je mets au 0.5C près.

sinon pour ta moyenne, tu fais une boucle en incrémentant un compteur de temp et tu divise par ton nombre de la boucle. en prenant la temp toutes les 30s, cela suffit à mon sens, ca ne baissera pas de 10C à moins de le mettre dans le congélo :)

Bonjour infobarquee

c'est une bonne methode pour moyenner mais il faut régulièrement "solder" l'addition et le facteur de division (risque de débordement) l'utilisation d'un modulo est simple dans les applis de mesure de T° (et autres process à évolution "lente" ) , j'ai pour habitude de rejecter dans le calcul de la moyenne les valeurs acquises min,max

alors les coincs de l'année ? déjà cuits au micro-onde ? :grin:

salut Artouste, ben pas terrible cette année, pas mal de casse chez les parents ]:D et vu le temps, ca démarre très doucement.

pour en revenir au pb, effectivement, j'avais pas pensé au débordement, mais il y a moyen de moyenner. mais faire des déclenchement par tranche de 0.5C, c'est hard, à 1C ca sera plus stable et plus fiable. sinon l'autre solution, serait de faire varier les % directement en utilisant le pwm par rapport à la temp, un peu comme la led qui varie d'intensité avec la lumière.

bonsoir messieurs,

je vois que le débat vous intéresse lol
mais moi en temps que novice, j’aimerais bien que vous me proposiez un code correspondant a vos discourt svp.
“faire varier les % directement en utilisant le pwm par rapport à la temp” moi je suis ok (si tu me donne le code correspondant :P)
concernant la tranche de 0.5°, j’ai un aquarium récifal et je ne peut pas laisser la température varier d’1° sans que le “refroidissement” augmente.

un ti peu de lecture
http://www.siteduzero.com/sciences/tutoriels/arduino-pour-bien-commencer-en-electronique-et-en-programmation/la-pwm-de-l-arduino
sinon une recherche pwm sur le forum va te donner des pistes :wink:

merci infobarquee,

mais mon code fonctionne deja a se niveau (pwm pour la gestion de la ventilation) mon seul souci est le déclenchement/arrêt répétitif lorsque la température vacille entre 26° et 26.5°. je veut juste que l'on me donne le code a appliquer pour avoir une moyenne de la température sur plusieurs loop svp ;). (ou toute autre méthode qui pourrait palier a mon problème)

merci

essaye déjà de faire un code qui ressemble à nos suggestions :wink:

sinon je viens de penser à une chose, tu peux incrémenter un compteur quand la temp atteint 26.5C sachant que tu relève la temp toutes les X millis, au bout de 10s si le compteur est >10 tu déclenche le ventilo, sinon compteur =0

la je comprend rien. jsuis pas un expert ... pour que vous voyer bien je vais vous coller mon code entier se soir. je ne vois pas se que je pourait modifier pour le momment par rapport a se que vous m'avez dit :blush:

djbouns: la je comprend rien. jsuis pas un expert ... pour que vous voyer bien je vais vous coller mon code entier se soir. je ne vois pas se que je pourait modifier pour le momment par rapport a se que vous m'avez dit :blush:

bonjour bon déjà un code qui moyenne simplement une entree analogique

int Vact = 0;  // variable valeur instantanée
int Fd=20; // facteur de division de la moyenne = moyenne toutes les FD boucles ici 20
long Accm=0; // accumulateur pour moyenne
int Vmoy=0; // variable valeur moyenne
int Nbcl=0; // compteur de boucles
void setup() {
 Serial.begin(9600);  
}

void loop() {
  // read the value from the sensor:
Vact = analogRead(A0);    
 Accm=Accm+Vact;
Nbcl ++;
 Serial.print("V INSTANT = ");
  Serial.println(Vact);


  if (Nbcl == Fd) { 
  Vmoy = Accm / Fd ;
  Accm=0 ;
  Nbcl=0;
  Serial.print("V MOYENNE = ");
  Serial.println(Vmoy);
  Serial.println();
 delay(500); //juste pour affichage 
}                             
     
}

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

#include "LiquidCrystal.h"
#include "WProgram.h"
#include "Wire.h"
#include "DS1307.h"

/*
 sorti /entre Arduino
 Analog Pin 0 = Température Sensor
 Analog Pin 4 = SDA pour ds1307
 Analog Pin 5 = SCL pour ds1307
 Digital Pin 2 = LCD
 Digital Pin 3 = LCD
 Digital Pin 4 = LCD
 Digital Pin 5 = LCD
 Digital Pin 6 = LCD
 Digital Pin 7 = LCD
 Digital Pin 8 = pompe niveau
 Digital Pin 10 = ventilateur
 Digital pin 9 = led soleil
 Digital pin 11 = led avant 
 Digital Pin 12 = relais led 10w
 Digital Pin 13 = niveau
 */

//Configuration des Pin de cablage**********************
LiquidCrystal lcd(7, 2, 3, 4, 5, 6);
float sensorPin;
int pompe = 8;
int ventilateur = 10;
int soleil = 9;
int led = 12;
int rampeled = 11;
int niveau = 13;
int timerPWM = 0;
int valeurPWM = 0;
float PWMStep = 0;
int minut;
int heure;
int time;
int seconde;
int Vact = 0;  // variable valeur instantanée
int Fd = 10; // facteur de division de la moyenne = moyenne toutes les FD boucles ici 20
long Accm = 0; // accumulateur pour moyenne
int temp = 0; // variable valeur moyenne
int Nbcl = 0; // compteur de boucles
int Vmoy = 0;


void setup() {
  /*
  RTC.stop();
  RTC.set(DS1307_SEC,30);           //réglage secondes
  RTC.set(DS1307_MIN,33);              //réglage minutes
  RTC.set(DS1307_HR,9);               //réglage heures
  RTC.set(DS1307_DOW,5);               //réglage jour de la semaine
  RTC.set(DS1307_DATE,25);             //réglage date
  RTC.set(DS1307_MTH,1);               //réglage mois
  RTC.set(DS1307_YR,13);                 //réglage année
  RTC.start();
  */
  
 //Configuration des entrées/sorties********************** 
  
  pinMode(pompe, OUTPUT);  
  pinMode(ventilateur, OUTPUT);  
  pinMode(soleil, OUTPUT);  
  pinMode(led, OUTPUT);  
  pinMode(rampeled, OUTPUT); 
  pinMode(niveau, INPUT);

lcd.begin(16,2);
Serial.begin(9600);  

}

void loop(){
  
   //Récupération de la température du LM35 ***************************************************************************************
sensorPin = analogRead(0);
Vact = sensorPin;
Accm=Accm+Vact;
Nbcl ++;

if (Nbcl == Fd) { 
  Vmoy = Accm / Fd ;
  Accm=0 ;
  Nbcl=0;
  temp = (Vmoy*0.5)+1.5;
  } 
  else 
  temp = (Vact*0.5)+1.5;

  //Récupération de l'heure du DS1307**********************************************************************************************
  heure = RTC.get(DS1307_HR,true);  
  minut = RTC.get(DS1307_MIN,true);
  seconde = RTC.get(DS1307_SEC,true);
  time = (heure * 100) + minut; 

  
    //Affichage ******************************************************************************************
 lcd.setCursor(0,0);
   lcd.print ("  AQUA GESTION  ");
   lcd.setCursor(0,1);
   lcd.print("     ");
  if (heure < 10)
  {
    lcd.print("0");
  }
  lcd.print(heure);
  lcd.print("H");
  if (minut < 10)
  {
    lcd.print("0");
  }
  lcd.print(minut);
lcd.print("     ");
  delay (5000);
lcd.setCursor(0,1);
lcd.print("     ");
  lcd.print(temp);
  lcd.print((char)223);
  lcd.print("     ");
  delay (5000);
  
    //*****Controle des sorties eclairage *********
 //***on-off***** soleil ***
  
 if ((heure == 10) && (minut >= 00)){ 
    PWMStep = 255 / 60;
    timerPWM = minut-60;
    valeurPWM = (int)(timerPWM * PWMStep);
    analogWrite (soleil, valeurPWM);
lcd.setCursor(0,1);
    lcd.print(" + + soleil + + ");
    delay(5000);
  }
 else if ((heure == 22) && (minut >= 30)){  
    PWMStep = 255 / 29;
    timerPWM = 30-minut;
    valeurPWM = (int)(timerPWM * PWMStep);
    analogWrite (soleil, valeurPWM); 
lcd.setCursor(0,1);
    lcd.print(" - - soleil - - ");
    delay(5000);
  }   
  else if ((time >= 1100 ) && (time < 2230)) {
    analogWrite(soleil, 255);
  }
else {
    analogWrite(soleil, 0);
      lcd.setCursor(0,0);
    lcd.print("   BONNE NUIT   ");
    delay(5000);
}


//***on-off*****led 1w***
     if((time >= 1030) && (time < 2235)){
    digitalWrite(led, HIGH);
   }
  else{
    digitalWrite(led, LOW);
   }
    
    
//***on-off***** rampe led ***
if((time >= 1045) && (time < 2230)){
    digitalWrite(rampeled, HIGH);
   }
  else{
    digitalWrite(rampeled, LOW);
   }

//***on-off***** ventilateur  ***
if (temp < 26.5){
  analogWrite(ventilateur, 0);
 lcd.setCursor(0,0);
    lcd.print("ventilateur  OFF");
    delay(5000);
}
else if ((temp >= 26.5) && (temp < 27)){
  analogWrite(ventilateur, 30);
    lcd.setCursor(0,0);
    lcd.print("ventilateur  10%");
    delay(5000);
}
else if ((temp >= 27) && (temp < 27.5)){
  analogWrite(ventilateur, 60);
    lcd.setCursor(0,0);
    lcd.print("ventilateur  30%");
    delay(5000);
}
else if ((temp >= 27.5) && (temp < 28)){
  analogWrite(ventilateur, 150);
    lcd.setCursor(0,0);
    lcd.print("ventilateur  60%");
    delay(5000);
}
else if (temp >= 28){
  analogWrite(ventilateur, 255);
    lcd.setCursor(0,0);
    lcd.print("ventilateur 100%");
    delay(5000);
}

//***on-off***** pompe ***
if (digitalRead (niveau) == HIGH)
{
   lcd.setCursor(0,0);
    lcd.print("niveau d'eau BAS");
    delay(5000);
  
if (minut == 01){
    digitalWrite(pompe, HIGH);
    delay (1000);
    digitalWrite(pompe, LOW);
    delay (5000);
}
    else if (minut == 11){
    digitalWrite(pompe, HIGH);
    delay (1000);
    digitalWrite(pompe, LOW);
    delay (5000);
}
    else if (minut == 21){
    digitalWrite(pompe, HIGH);
    delay (1000);
    digitalWrite(pompe, LOW);
    delay (5000);
}
    else if (minut == 31){
    digitalWrite(pompe, HIGH);
    delay (100);
    digitalWrite(pompe, LOW);
    delay (5000);
}
    else if (minut == 41){
    digitalWrite(pompe, HIGH);
    delay (1000);
    digitalWrite(pompe, LOW);
    delay (5000);
}
    else if (minut == 51){
    digitalWrite(pompe, HIGH);
    delay (1000);
    digitalWrite(pompe, LOW);
    delay (5000);
}
}
 else if (digitalRead (niveau) == LOW){
      lcd.setCursor(0,0);
    lcd.print("niveau d'eau  OK");
    delay(5000);
 digitalWrite(pompe, LOW);
} 

 }

utilise float au lieu de int