probleme pour lire une sonde temperature lm335

salut à tous me voila tout nouveau sur votre forum(mon premier post) et j'ai besoin d'une tite aide s'il y a parmis vous une ame charitable pour regler mon probleme de capteur :-[
j'ai creé un programme qui fait plusieurs chose lire la temperature d'un capteur lm335z sur une arduino mega2560 sur l'entree analogique et envoi la temperature sur un ecran lcd. j'ai aussi mis en place deux boutons pour modifier une consigne un bouton pour l'augmenter et un pour la baisser or ceux ci fonctionnent avec la fonction delay d'arduino c'est a dire que si je met mon delay à 1 sec le temps de rafraichissement de la valeur temperature il faut rester appuyer 1 sec sur le bouton pour changer la valeur de plus la valeur de ma temperature n'est pas stable et est superieure de au moins 20°C :o
voila merci à tous et à bientot

oups j’oubliais le code

#include <LiquidCrystal.h>

int backLight = 13;    //declaration variable pin 13
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //declaration pin ecran lcd

const int led = 9; //declaration variable led pin 9

float consigne=28;          //variable pour une consigne initialisee à 25°C


boolean etat_dte=false; //variable etat bouton droite
boolean etat_gche = false; //variable etat bouton gauche
int btn_gche = 8;//variable bouton gauche pin8
int btn_dte = 7;//variable bouton gauche pin7

void setup (){
//initialisation des variables 
Serial.begin(9600);//ouverture du port serie et choix du debit com
lcd.begin(16, 2);//init ecran
lcd.clear();//init ecran
pinMode(led,OUTPUT);//init led en outpout
pinMode(btn_gche, INPUT);//init bouton gauche en input
pinMode(btn_dte, INPUT);//init bouton droite en input
pinMode(backLight, OUTPUT); //init ecran en output       
analogWrite(backLight, 150);//init contrast à 150 sur echelle 0à250
Serial.println("CLEARDATA");


}

void loop () 
{  
 temperature();//appelle fonction temperature
 
 //incrementation variable consigne sur appui du bouton gauche
 if ((digitalRead (btn_gche) == LOW) &&  (etat_gche == true))
   {
      consigne++;
   }   
  //decrementation variable consigne sur appui du bouton droite     
 if ((digitalRead (btn_dte) == LOW) && (etat_dte == true))
    {
       consigne--;
     }
     //reinitialisation des boutons et affichage consigne sur deuxieme ligne de l'ecran
     etat_gche = !etat_gche;
     etat_dte = !etat_dte;
     lcd.setCursor (0,1);
     lcd.print("Cons : ");
     lcd.print(consigne);
     lcd.print(" C");
     delay (1000);
}
  
void temperature()
{
  //transformation de la valeur analogique(mV) de la sonde en °C 
   if (analogRead(0)>0)
   {
     int val = analogRead(1);
      double voltage = (val*5.0/1024);
     double kelvin = (voltage * 100);
     double degres = kelvin - 273.15;
     //envoi les donnees vers port serial et recuperé sur openoffice
     Serial.println("LABEL,Time,consigne,degres,kelvin");
     Serial.print("DATA,TIME,");Serial.print(consigne);Serial.print(",");Serial.print(degres);Serial.print(",");Serial.println(kelvin);
   //si temperature > consigne allumer la led sinon l'eteindre
   if (double(degres) > float(consigne))
   {
      digitalWrite (led, HIGH);
    }
   else 
    {
      digitalWrite (led,LOW);
    }   
      //affichage de la temperature sur premiere ligne de l'ecran
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Temp : ");
      lcd.print(degres);
      lcd.print(" C"); 
      
 
   }
 
 }

Oups.... t'as oublié de mettre ton code entre les balises "code"

merci
ca doit etre mieux comme ca

Parfait.

A la place d'utiliser delay(), il faut utiliser millis()....

qui ne s'utilise pas de la même manière que delay().... c'est un peu plus tortueux pour les méninges :smiling_imp:

merci je vais voir ca et pour la sonde de temperature du coup la broche du milieu à une resistance et est branchée sur le 5v et l'entree analogique et la broche de droite sur le GND. le probleme aussi c'est que quand je tiens la sonde entre mes doigts la temperature ne change pas specialement
a+ :cold_sweat:

C'est un indication pour aller consulter un médecin..... :grin:

Plus sérieusement, je ne connais pas cette sonde et ne pourrais t'aider de ce coté.

je ne saurais tarder y aller vu le mal de tete que me donne cet arduino :cry:

du coup j’ai reussi à mettre la fonction millis mais je comprends pas pourquoi la premiere ligne sur mon afficheur a disparu
revoila le code avec fonction millis ()

#include <LiquidCrystal.h>

int backLight = 13;    //declaration variable pin 13
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //declaration pin ecran lcd

const int led = 9; //declaration variable led pin 9

float consigne=28;          //variable pour une consigne initialisee à 25°C


boolean etat_dte=false; //variable etat bouton droite
boolean etat_gche = false; //variable etat bouton gauche
int btn_gche = 8;//variable bouton gauche pin8
int btn_dte = 7;//variable bouton gauche pin7

long temps; //variable pour stocker la mesure temps

void temperature()
  {
    //transformation de la valeur analogique(mV) de la sonde en °C 
     if (analogRead(0)>0)
     {
       int val = analogRead(1);
        double voltage = (val*5.0/1024);
       double kelvin = (voltage * 100);
       double degres = kelvin - 273.15;
       //envoi les donnees vers port serial et recuperé sur openoffice
       Serial.println("LABEL,Time,consigne,degres,kelvin");
       Serial.print("DATA,TIME,");Serial.print(consigne);Serial.print(",");Serial.print(degres);Serial.print(",");Serial.println(kelvin);
     //si temperature > consigne allumer la led sinon l'eteindre
     if (double(degres) > float(consigne))
     {
        digitalWrite (led, HIGH);
      }
     else 
      {
        digitalWrite (led,LOW);
       }  
        if ((millis() - temps)>5000)
        {
        //affichage de la temperature sur premiere ligne de l'ecran
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Temp : ");
        lcd.print(degres);
        lcd.print(" C");
        temps=millis(); 
        }
       
   
     }
   
   }
  
void setup (){
  //initialisation des variables 
  Serial.begin(9600);//ouverture du port serie et choix du debit com
  lcd.begin(16, 2);//init ecran
  lcd.clear();//init ecran
  pinMode(led,OUTPUT);//init led en outpout
  pinMode(btn_gche, INPUT);//init bouton gauche en input
  pinMode(btn_dte, INPUT);//init bouton droite en input
  pinMode(backLight, OUTPUT); //init ecran en output       	
  analogWrite(backLight, 150);//init contrast à 150 sur echelle 0à250
  Serial.println("CLEARDATA");
  temps = millis();//init le temps
  
  }

 void loop () 
 {  
   temperature();//appelle fonction temperature
   
   //incrementation variable consigne sur appui du bouton gauche
   if ((digitalRead (btn_gche) == LOW) &&  (etat_gche == true))
     {
        consigne++;
     }   
    //decrementation variable consigne sur appui du bouton droite     
   if ((digitalRead (btn_dte) == LOW) && (etat_dte == true))
      {
         consigne--;
       }
       //reinitialisation des boutons et affichage consigne sur deuxieme ligne de l'ecran
       etat_gche = !etat_gche;
       etat_dte = !etat_dte;
       if ((millis() - temps)>30)
       {
       lcd.setCursor (0,1);
       lcd.print("Cons : ");
       lcd.print(consigne);
       lcd.print(" C");
       temps = millis();
       }
}

Fait ça différemment.

Sépare la fonction d’affichage et de mesure.

void temperature()
{
ton timer temperature avec millis()  // lance la mesure toutes les secondes
{
mesure de la température
}
}

void affichage()
{
ton timer affichage avec millis() // lance l'affichage toutes les 40 ms pour 25 fois par secondes
{
affichage
}
}

25 fois par seconde pour l’affichage te permet d’avoir un rafraîchissement sans l’impression que ça clignote, ainsi tu peux rajouter un menu ou une valeur de plus à afficher.

Edit j'ai dit une bétise :smiley:

merci à toi je vais voir ca j'ai pas eu le temps de voir tout ca annif de la petite avec plein de marmaille à la maison je te tiens au courant de l'evolution a+

bonjour,
il y a un petit truc qui m’echappe dans la fonction millis() j’arrive à afficher la temperature toutes les 5 secondes par exemples mais ma consigne d’une part raffraichit sans cesse et lorsque je met la fonction millis() quand j’appui sur mon bouton la consigne monte ou baisse de plusieurs unités
voila mon nouveau code

#include <LiquidCrystal.h>
int backLight = 13;    //declaration variable pin 13
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //declaration pin ecran lcd
const int led = 9; //declaration variable led pin 9
float consigne=28;
boolean etat_dte=false; //variable etat bouton droite
boolean etat_gche = false; //variable etat bouton gauche
int btn_gche = 8;//variable bouton gauche pin8
int btn_dte = 7;//variable bouton gauche pin7
float degres;
float kelvin;
float voltage;
long temps;

void setup() {
	//initialisation des variables
	Serial.begin(9600);//ouverture du port serie et choix du debit com
	lcd.begin(16, 2);//init ecran
	lcd.clear();//init ecran
	pinMode(led,OUTPUT);//init led en outpout
	pinMode(btn_gche, INPUT);//init bouton gauche en input
	pinMode(btn_dte, INPUT);//init bouton droite en input
	pinMode(backLight, OUTPUT); //init ecran en output
	analogWrite(backLight, 150);//init contrast à 150 sur echelle 0à250
	Serial.println("CLEARDATA");
        temps=millis();

}

void loop()
{
	temperature();
	bouton();
	affichage();
}


void temperature()
{
	if((millis() - temps) > 5000)
          {
        	//transformation de la valeur analogique(mV) de la sonde en °C
        	if (analogRead(0)>0)
        	{
        		int val = analogRead(1);
        		 voltage = (val*5.0/1024);
        		 kelvin = (voltage * 100);
        		 degres = kelvin - 273.15;
        		//envoi les donnees vers port serial et recuperé sur openoffice
        		Serial.println("LABEL,Time,consigne,degres,kelvin");
        		Serial.print("DATA,TIME,");Serial.print(consigne);Serial.print(",");Serial.print(degres);Serial.print(",");Serial.println(kelvin);
                        	
                }
        	
        	//si temperature > consigne allumer la led sinon l'eteindre
        	if ((degres) > (consigne))
        	{
        		digitalWrite (led, HIGH);
        	}
        	else
        	{
        		digitalWrite (led,LOW);
        	}
	      temps = millis();    
          }
}
void affichage()
{
  //if((millis() - temps) > 300)
       // {
            
	//affichage de la temperature et de la consigne
	lcd.clear();
	lcd.setCursor(0,0);
	lcd.print("Temp : ");
	lcd.print(degres);
	lcd.print(" C");
	lcd.setCursor (0,1);
	lcd.print("Cons : ");
	lcd.print(consigne);
	lcd.print(" C");
      // }
}
void bouton()
{
	if ((digitalRead (btn_gche) == LOW) &&  (etat_gche == true))
	{
		consigne++;
	}
	//decrementation variable consigne sur appui du bouton droite
	if ((digitalRead (btn_dte) == LOW) && (etat_dte == true))
	{
		consigne--;
	}
	//reinitialisation des boutons et affichage consigne sur deuxieme ligne de l'ecran
	
	etat_gche = !etat_gche;
	etat_dte = !etat_dte;
}

merci encore une fois a bientot

Il faut différencier les variables de la fonction millis() pour chaque fonction.

ok ca à l’air de fonctionner reste quelques petits reglages: la consigne lorsque j’appui sur le bouton up ou down la consigne avance de plusieurs unité voir des centaines et la temperature met 5 secondes avant de s’afficher aurait tu une soluce stp

#include <LiquidCrystal.h>
int backLight = 13;    //declaration variable pin 13
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //declaration pin ecran lcd
const int led = 9; //declaration variable led pin 9
float consigne=28;
boolean etat_dte=false; //variable etat bouton droite
boolean etat_gche = false; //variable etat bouton gauche
int btn_gche = 8;//variable bouton gauche pin8
int btn_dte = 7;//variable bouton gauche pin7
float degres;
float kelvin;
float voltage;
long tempsTempe;
long tempsaff;

void setup() {
	//initialisation des variables
	Serial.begin(9600);//ouverture du port serie et choix du debit com
	lcd.begin(16, 2);//init ecran
	lcd.clear();//init ecran
	pinMode(led,OUTPUT);//init led en outpout
	pinMode(btn_gche, INPUT);//init bouton gauche en input
	pinMode(btn_dte, INPUT);//init bouton droite en input
	pinMode(backLight, OUTPUT); //init ecran en output
	analogWrite(backLight, 150);//init contrast à 150 sur echelle 0à250
	Serial.println("CLEARDATA");
        tempsTempe=millis();
        tempsaff=millis();

}

void loop()
{
	temperature();
	bouton();
	affichage();
}


void temperature()
{
	if((millis() - tempsTempe) > 5000)
          {
        	//transformation de la valeur analogique(mV) de la sonde en °C
        	if (analogRead(0)>0)
        	{
        		int val = analogRead(1);
        		 voltage = (val*5.0/1024);
        		 kelvin = (voltage * 100);
        		 degres = kelvin - 273.15;
        		//envoi les donnees vers port serial et recuperé sur openoffice
        		Serial.println("LABEL,Time,consigne,degres,kelvin");
        		Serial.print("DATA,TIME,");Serial.print(consigne);Serial.print(",");Serial.print(degres);Serial.print(",");Serial.println(kelvin);
                        	
                }
        	
        	//si temperature > consigne allumer la led sinon l'eteindre
        	if ((degres) > (consigne))
        	{
        		digitalWrite (led, HIGH);
        	}
        	else
        	{
        		digitalWrite (led,LOW);
        	}
	      tempsTempe = millis();    
          }
}
void affichage()
{
  if((millis() - tempsaff) > 300)
        {
            
	//affichage de la temperature et de la consigne
	lcd.clear();
	lcd.setCursor(0,0);
	lcd.print("Temp : ");
	lcd.print(degres);
	lcd.print(" C");
	lcd.setCursor (0,1);
	lcd.print("Cons : ");
	lcd.print(consigne);
	lcd.print(" C");
        tempsaff = millis();
       }
}
void bouton()
{
	if ((digitalRead (btn_gche) == LOW) &&  (etat_gche == true))
	{
		consigne++;
	}
	//decrementation variable consigne sur appui du bouton droite
	if ((digitalRead (btn_dte) == LOW) && (etat_dte == true))
	{
		consigne--;
	}
	//reinitialisation des boutons et affichage consigne sur deuxieme ligne de l'ecran
	
	etat_gche = !etat_gche;
	etat_dte = !etat_dte;
}

Dans ta gestion des boutons. Il faut attendre le relâché du bouton sinon à chaque itération de la boucle tu prends l'appui en compte.
Le test simple du relâché étant bloquant, le mieux c'est de tester le changement d'état, en comparant l'état courant du bouton à son état au cycle précédent. S'il y a coincidence, tu ne fais rien.

je suis desolé mais la je seche j'arrive pas à voir si tu peux m'aiguiller differement
merci

Regarde ce topic :

J'ai une consigne de dépression que je fais augmenter ou diminuer en appuyant sur deux boutons.

ah pas mal ton post sur la pompe à vide Jean François ca serait un truc interesserant à faire dans le futur. :slight_smile:
sinon pour en revenir à mon programme en faisant comme dans le nouveau code si dessous j’ai la consigne qui marche j’ai pas fait exactement comme toi il incremente ou decremente d’unité en unité mais des fois il faut appuyer plusieurs fois pour changer d’unité :o . je vais revoir un peu mieux ton code et vous tiendrais au courant si vous avez des idees pour ameliorer celui ci je suis preneur
bonne soiree à tous

#include <LiquidCrystal.h>
int backLight = 13;    //declaration variable pin 13
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //declaration pin ecran lcd
const int led = 9; //declaration variable led pin 9
float consigne=28;
int etat_dte=HIGH; //variable etat bouton droite
int etat_gche = HIGH; //variable etat bouton gauche
int btn_gche = 8;//variable bouton gauche pin8
int btn_dte = 7;//variable bouton droite pin7
float degres;
float kelvin;
float voltage;
long tempsTempe;
long tempsaff;


void setup() {
	//initialisation des variables
	Serial.begin(9600);//ouverture du port serie et choix du debit com
	lcd.begin(16, 2);//init ecran
	lcd.clear();//init ecran
	pinMode(led,OUTPUT);//init led en outpout
	pinMode(btn_gche, INPUT);//init bouton gauche en input
	pinMode(btn_dte, INPUT);//init bouton droite en input
	pinMode(backLight, OUTPUT); //init ecran en output
	analogWrite(backLight, 150);//init contrast à 150 sur echelle 0à250
	Serial.println("CLEARDATA");
        tempsTempe=millis();
        tempsaff=millis();

}

void loop()
{
	temperature();
	bouton();
        affichage();
}


void temperature()
{
	if((millis() - tempsTempe) > 5000)
          {
        	//transformation de la valeur analogique(mV) de la sonde en °C
        	if (analogRead(0)>0)
        	{
        		int val = analogRead(1);
        		 voltage = (val*5.0/1024);
        		 kelvin = (voltage * 100);
        		 degres = kelvin - 273.15;
        		//envoi les donnees vers port serial et recuperé sur openoffice
        		Serial.println("LABEL,Time,consigne,degres,kelvin");
        		Serial.print("DATA,TIME,");Serial.print(consigne);Serial.print(",");Serial.print(degres);Serial.print(",");Serial.println(kelvin);
                        tempsTempe = millis();  	
                }
        }	
        	//si temperature > consigne allumer la led sinon l'eteindre
        	if ((degres) > (consigne))
        	{
        		digitalWrite (led, HIGH);
        	}
        	else
        	{
        		digitalWrite (led,LOW);
        	}
	         
          
}

void bouton()
{
  etat_gche=digitalRead(btn_gche);
  etat_dte=digitalRead(btn_dte);
	if  ( (digitalRead (btn_gche) == LOW) && (etat_gche == 1) )
	{
		consigne++;
	}
	//decrementation variable consigne sur appui du bouton droite
	if ((digitalRead (btn_dte) == LOW) && (etat_dte == 1))
	{
		consigne--;
	}
	//reinitialisation des boutons 
	
	etat_gche = !etat_gche;
	etat_dte = !etat_dte;
}

void affichage()
{
  if((millis() - tempsaff) > 40)
        {
            
	//affichage de la temperature et de la consigne
	lcd.clear();
	lcd.setCursor(0,0);
	lcd.print("Temp : ");
	lcd.print(degres);
	lcd.print(" C");
	lcd.setCursor (0,1);
	lcd.print("Cons : ");
	lcd.print(consigne);
	lcd.print(" C");
        tempsaff = millis();
        }
 }

une autre tite question
comment se fait il que la led TX sur l'arduino reste allumé non stop au debut elle clignote toute les 5 secondes et apres elle reste en fixe c'est normal?