thermostat couveuse


bonjour,
je suis actuellement entrain de crée un thermostat pour couveuse
j'ai donc une lcd 2*16 et une sonde de température " pour commencer"
<<les temperature afficher sont sur mon proto >>>
est ce normal que la temperature affiche soir ex: 27.46°c et passe sans que rien ne soit fait directement 28.32°c

je souhaiterai que sa monte au fur et mesure et non par tranche " est ce faisable "?

au final la t° doit etre entre 37.7 et  38.2°c

sonde utiliser lm35dz

merci par avance




code ci dessous :


code: [select]

#include "liquidcrystal.h"

const int inputsensor = a0;       // on nomme la broche a0 connectée au capteur
const int inputsensor2 = a1;       // on nomme la broche a0 connectée au capteur

const int buttonpin = 7;
const int buttonpin_2 = 6;
const int buttonpin_3 = 5;

int buttonstate = 0;
int buttonstate_2 = 0;
int buttonstate_3 = 0;

const int led1 = 3;              // on nomme la broche 12 connectée à la led blanc
const int led2 = 2;              // on nomme la broche 13 connectée à la led bleue
const int led3 = 4;              // on nomme la broche 13 connectée à la led rouge

float temp_min = 27.0 ; //37.7
float temp_max = 30.2 ; //38.2
float hysteresis = 1 ;

liquidcrystal lcd(8,9,10,11,12,13);  // les pins utilisés par le lcd

int menu =0 ;


void setup(){

  pinmode(inputsensor, input);  // déclaration du capteur en entrée
  pinmode(inputsensor2, input);  // déclaration du capteur en entrée
 
  pinmode(buttonpin, input);
  pinmode(buttonpin_2, input);
 
  pinmode(led1, output);        // déclaration de la led bleue en entrée
  pinmode(led2, output);        // déclaration de la led verte en entrée
  pinmode(led3, output);        // déclaration de la led verte en entrée

  lcd.begin(16, 2);
  serial.begin(9600);
  lcd.clear();
  lcd.setcursor(0,0);
  lcd.print("thermostat v 1.0" );
  delay(3000);
lcd.clear();
}
void loop(){
   serial.println(menu);
  buttonstate = digitalread(buttonpin);
 
    if (buttonstate == high) {
   menu ++;
   delay(500);
   
      }

 

if (menu == 0) {
  resistance();
  }
if (menu == 1) {
  menu_1();
  }
if (menu == 2) {
  menu_2();
  }
if (menu == 3) {
  menu_3();
  } 

if (menu == 4) {
  menu = 0;
  }   
//fonction resistance 



   


}

void resistance(){
lcd.clear();
  //int degres2 = analogread(inputsensor2);  //test hygro
  //float floathygro = degres2*0.49; //test hygro
  int degres = analogread(inputsensor);  //degres récupère la valeur analogique du capteur
  float floatdegres = degres*0.49;      //la valeur est ici convertie en degrés
   
    lcd.setcursor(0,0);
    lcd.print("temp:   " ); lcd.print(floatdegres); lcd.print((char)223); lcd.print("c" );
    //lcd.setcursor(0,1); //affiche sur la seconde ligne
    //lcd.print("v2 :" ); lcd.print(floathygro); //test hygro
   
    delay(500);


  if (floatdegres < temp_min + hysteresis){
  digitalwrite (led1, high); //chauffe
  digitalwrite (led2, low); //temp ok
  digitalwrite (led3, low); //erreur
  }
  else if (floatdegres > temp_min && floatdegres < temp_max ){
    digitalwrite (led1, low); //chauffe
    digitalwrite (led2, high); //temps ok
    digitalwrite (led3, low); //erreur
  }
  else if (floatdegres > temp_max ){
    digitalwrite (led1, low); //chauffe
    digitalwrite (led2, low); //temp ok
    digitalwrite (led3, high); //erreur
  }

}





void menu_1(){
 
    buttonstate_2 = digitalread(buttonpin_2);
   
      if (buttonstate_2 == high) {
         temp_min = temp_min + 0.1;
         delay(200);
      }
    buttonstate_3 = digitalread(buttonpin_3);
   
      if (buttonstate_3 == high) {
         temp_min = temp_min - 0.1;
         delay(200);
      }
     
     lcd.clear();
     lcd.setcursor(0,0);
     lcd.print(" reglage t-min");
     lcd.setcursor(4,1);
     lcd.print(temp_min); lcd.print((char)223); lcd.print("c" );
       delay(100);
   
}







void menu_2(){
      buttonstate_2 = digitalread(buttonpin_2);
      if (buttonstate_2 == high) {
         temp_max = temp_max + 0.1;
         delay(200);
      }
       buttonstate_3 = digitalread(buttonpin_3);
      if (buttonstate_3 == high) {
         temp_max = temp_max - 0.1;
         delay(200);
      }
 
     lcd.clear();
     lcd.setcursor(0,0);
     lcd.print(" reglage t-max");
     lcd.setcursor(4,1);
     lcd.print(temp_max); lcd.print((char)223); lcd.print("c" );
       delay(100);
   
}








void menu_3(){
 
      buttonstate_2 = digitalread(buttonpin_2);
     
      if (buttonstate_2 == high) {
         hysteresis = hysteresis + 0.1;
         delay(200);
      }
     
      buttonstate_3 = digitalread(buttonpin_3);
     
      if (buttonstate_3 == high) {
         hysteresis = hysteresis - 0.1;
         delay(200);
      }
     
     lcd.clear();
     lcd.setcursor(0,0);
     lcd.print("reglage decalage");
     lcd.setcursor(4,1);
     lcd.print(hysteresis); lcd.print((char)223); lcd.print("c" );
       delay(100);
   
}


est ce normal que la temperature affiche soir ex: 27.46°c et passe sans que rien ne soit fait directement 28.32°c
je souhaiterai que sa monte au fur et mesure et non par tranche " est ce faisable "?
au final la t° doit etre entre 37.7 et  38.2°c
sonde utiliser lm35dz

on peut faire des mesures très stables avec un lm35 condition de bien s'en servir.

as tu vérifié sur la datasheet que le lm35z répond bien à ton besoin de précision.
si la précision absolue est insuffisante il faut soit faire un étalonnage soit utiliser un lm335 qui peut être calibré.

dans ce qu'on appelle généralement précision il y plusieurs notions :
a) la précision absolue  --> 25,1 °c à +/-0,05% --> domaine du laboratoire.
b) la discrimination  --> on peut discriminer deux mesures différentes de 0,1°c mais on n'est pas sûr de la valeur absolue.
example : on est capable de détecter que mes2 est supérieur à mes1 de 0,1°c mais on n'est pas sur que mes1 et mes2 ne soient pas connus à +/-1 °c près
c) la répétabilité : dans des conditions identiques de température  la sonde donnera le même résultat
d) la fidélité : dans des conditions identiques de température  la sonde donnera le même résultat même s'il s'est écoulé plusieurs semaines entre les mesures.

câblage du lm35
ne pas mélanger le fil de 0v (la masse) avec d'autres composants qui pourrait induire du bruit . ne pas oublier que 10mv/°c c'est tout petit.
les fils de connexion doivent être courts. s'ils sont longs voir la solution dans la datasheet du lm35.
nb : le lm335 n'est pas sensible à la longueur des fils comme le lm35.

condition sur le microcontroleur.
datasheet à lire svp.
atmel recommande ne ne pas conserver la première mesure qui est souvent fausse. perso avant de faire la vraie mesure je fais un boucle de 5 mesures que je ne conserve pas.
en principe les librairies arduino font des réglages  par défaut du convertisseur analogique/digital satisfaisants, mais sache qu'il est possible de les modifier, mais en dernier ressort quand tout le reste aura déjà été peaufiné.

condition sur la carte.
eh oui les cartes arduino ne sont pas terribles pour les mesures analogiques.
si tu utilises une uno il faut souder un condo de 100 nf au verso directement sur les pins du support entre aref(du micro) et gnd
sur les cartes équipées de micro en boîtier cms il n'y rien d'autre à faire que de moyenner les mesures pour éliminer le bruit.

ps : fait une recherche sur "couveuse" (ou les "coincs"  :smiley-mr-green: ) et tu trouvera une réalisation déjà faite par "infobarquee"


Arduino Forum > International > Français (Moderators: jfs, Snootlab) > thermostat couveuse


arduino

Comments

Popular posts from this blog

opencv3, tbb and rasp pi 2 - Raspberry Pi Forums

small ethernet problem - Raspberry Pi Forums

Multithumb configuration params not working? - Joomla! Forum - community, help and support