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"
<>>
est ce normal que la temperature affiche soir ex: 27.46°C et passe sans que rien ne soit fait directement a 28.32°C

je souhaiterai que sa monte au fur et a 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 :

#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); 
    
}

neomega:
est ce normal que la temperature affiche soir ex: 27.46°C et passe sans que rien ne soit fait directement a 28.32°C
je souhaiterai que sa monte au fur et a 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 a 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 a 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 a rien d'autre à faire que de moyenner les mesures pour éliminer le bruit.

PS : fait une recherche sur "couveuse" (ou les "coincs" :grin: ) et tu trouvera une réalisation déjà faite par "Infobarquee"

bonsoir
et j'ajouterais à l'explication de 68tjs que outre un bon conditionnement du LM35
la valeur acquise par un arduino basique est codée sur 10 bits et est tributaire de la reference de tension du convertisseur A/D

Exact je l'avais oublié celle là.
L'adc découpe la valeur de la référence en 1024 pas (10 bits) et renvoi un nombre compris entre 0 et 1023.

La référence joue sur 2 tableaux:

  1. si la référence fluctue la mesure fluctuera de même.
  2. Plus la référence sera élevée moins la mesure sera précise.
  3. les références dispo sont :
    A) par defaut le Vcc. Pour info celui de l'USB est donné à +/- 5%.
    B) la reférence interne de 1,1 V. Elle est donné à +/-10% mais pour un individu donné elle est fixe. Elle peut être mesurée précisément.
    C) une référence externe connectée sur AREF. Il existe de CI spécialisés ultra précis.

Avec un LM35 il tout à fait envisageable d'utiliser soit la ref interne (1,1V) soit des références externe de 1,25V.
Si Ref = Vcc le pas de mesure vaut environ 5mV soit 0,5°C , si Ref = 1,1 V le pas de mesure vaut environ 1 mV soit 0,1°C.