Go Down

Topic: Seuil de température ARDUINO. (Read 267 times) previous topic - next topic

Kakimlebg

Bonjour,Bonsoir.

après de multiple recherche , je me dirige vers vous pour finir mon projet.

Je vous explique : c'est une serre totalement autonome.

Le capteur de température permettra l'aération à l'aide de deux moteur de chaque coté de la serre permettant un lever de bâche.

Le problème c'est que supposons que ma température avant l'ouverture soit de 23 degrés Celsius
Si cela monte a 23,1 degrés celsius puis redescend a 22,9 degrés celsius la bâche va constamment s'ouvrir et se fermer.

Comment pourrais je faire pour pouvoir mettre 2 seuil de température.

je veux que mon programme ajuste a chaque température 2 degrés de différence.
Par exemple si la température désigné par le maraîcher est 23 degrés
alors le seuil bas: est a 21 degrés et le seuil haut : est a 25 degrés.
Voici mon programme :

#include <LiquidCrystal.h>
float volt;
float temp; // On initialise la variable de température
float temperature_max = 23; // Seuil de température
int led=2;
bool etat;
LiquidCrystal lcd(4, 6, 9, 10, 11, 12);
void setup()
{
  lcd.begin(16, 2);
  pinMode(led,OUTPUT);
}
void loop()
{
  volt = analogRead(A3) * 5.0 / 1024; // conversion de la valeurs analogique en Volt.
  Serial.print (volt);
  Serial.println (" Volt");
 
  temp = volt * 100 ;  // Conversion de la valeurs volt en degré (temp);
  Serial.print (temp);
  Serial.println (" C");
 
  if (temp > temperature_max)
  {
    etat = HIGH;
  }

   if (temp < temperature_max)
  {
    etat = LOW;
  }
 
  lcd.setCursor(0, 0);
  lcd.print("Temp : ");
  lcd.print (temp);
  lcd.setCursor(0, 1);
  if (etat == HIGH) lcd.print("Ouverture bache");
  if (etat == LOW) lcd.print ("Fermeture bache");
  if (temp>temperature_max)digitalWrite(led,HIGH);
  if (temp<temperature_max)digitalWrite(led,LOW);
  delay(750); // Delay en MS (1s)
}



LA LED permet d'avertir le maraîcher.
Merci d'avoir pris le temps de lire.
En vous souhaitant une agréable journée.

dbrion06

Il faut rajouter un hysteresis (demandez à wikipedia ce que c'est)

Code: [Select]


  if (temp > temperature_max)
  {
    etat = HIGH;
  }

   if (temp < temperature_max)
  {
    etat = LOW;
  }
 

deviendrait
Code: [Select]


  if (temp > temperature_max + hyst)  { // hyst est une constante, de l'ordre de 1.0 degrés
    etat = HIGH;
  }

   if (temp < temperature_max - hyst)  {
    etat = LOW;
  }
  [code]

Kakimlebg

Bonjour.
Un grand merci.

Est il possible de changer la valeur ? au lieu de 1 degrés mettre 2 ?.
Merci.

dbrion06

Oui (je ne peux pas pifomètrer une valeur; c'est vous l'expert)

Kakimlebg

Est il possible de faire cela
float hyst;




 if (temp > temperature_max + 2)
  {
    etat = HIGH;
  }

   if (temp < temperature_max - 1)
  {
    etat = LOW;


funkTLS

Est il possible de faire cela
J'ai envie de dire oui.. mais j'ai surtout envie de demander... pourquoi ? :smiley-mr-green:


Aussi, il est bizarre ce capteur de température :smiley-eek: on peut avoir la référence ?

Code: [Select]
temp = volt * 100 ;  // Conversion de la valeurs volt en degré (temp);

Et également, si la température dépasse un des seuils, on va se retrouver avec une commande "Ouverture (ou Fermeture) bâche" toutes les 750ms.. Ne serait-il pas plus judicieux de n'envoyer cette commande qu'une seule fois ? Et ça je vous laisse réfléchir comment..  :smiley-roll:


Kakimlebg

Bonjour,
C'est un capteur LM35.
Et non, pour l'instant je laisse un delai de 750 ms.

Kakimlebg

 if (temp > temperature_max + 2)
{
  etat = HIGH;
}

 if (temp < temperature_max - 2)
{
  etat = LOW;

Je viens de tester cela, ca ne marche pas :/

fdufnews

#8
Apr 16, 2019, 03:40 pm Last Edit: Apr 16, 2019, 03:40 pm by fdufnews
Est il possible de faire cela
float hyst;
 if (temp > temperature_max + 2)
  {
    etat = HIGH;
  }

   if (temp < temperature_max - 1)
  {
    etat = LOW;
Oui. Encore que ce serait sans doute plus facile à maintenir par la suite en définissant 2 variables temperatureHaute et températureBasse plutôt que de faire temperature_max + 2.

Autre chose. Pourquoi poser cette question sur le forum, au risque d'attendre la réponse pendant des heures, alors que cela prend 20 secondes de compiler le code en question et de tester le fonctionnement?

fdufnews

Qu'est-ce qui ne marche pas?
Un peu plus de détails

Kakimlebg

bonjour,
j'ai effectuer des test et la diode s'allume à 23 degrés et non à 25.
Oui mais le but est de faire en sorte que le maraîcher définit une température par exemple 23 degrés et que automatiquement le seuil haut et bas se créer avec 2 degrés de différence ://////

Pour la compilation c'est nickel j'ai tous tester - hyst , etc et rien ne marche :/

dbrion06

Quote
j'ai effectuer des test et la diode s'allume à 23 degrés et non à 25.
Est ce que c'est ce que vous voulez?
Plutôt que de faire des tests de façon anarchique (je tourne un bouton, puis un autre et ça ne marche toujours pas), pouvez vous poster un code qui ne marche pas? (déjà, j'ai vu dans vos codes une variable hyst qui ne sert à rien, les seuils étant gravés en dur)
 s'il y a plein de petits défauts, il vaut mieux avoir une version stable et visible pour pouvoir la corriger...

funkTLS

Code: [Select]
if (temp > temperature_max) digitalWrite(led, HIGH);

C'est normal qu'elle s'allume à 23° si vous n'avez pas introduit les mêmes °C de battements que pour la gestion de "etat"

Kakimlebg

Code: [Select]
#include <LiquidCrystal.h>
float volt;
float temp; // On initialise la variable de température
float temperature_max = 23; // Seuil de température
bool etat;
LiquidCrystal lcd(4, 6, 9, 10, 11, 12);
void setup()
{
  lcd.begin(16, 2);
}
void loop()
{
  volt = analogRead(A3) * 5.0 / 1024; // conversion de la valeurs analogique en Volt.
  Serial.print (volt);
  Serial.println (" Volt");
  
  temp = volt * 100 ;  // Conversion de la valeurs volt en degré (temp);
  Serial.print (temp);
  Serial.println (" C");
  
  if (temp > temperature_max)
  {
    etat = HIGH;
  }

   if (temp < temperature_max)
  {
    etat = LOW;
  }
  
  lcd.setCursor(0, 0);
  lcd.print("Temp : ");
  lcd.print (temp);
  lcd.setCursor(0, 1);
  if (etat == HIGH) lcd.print("Ouverture bache");
  if (etat == LOW) lcd.print ("Fermeture bache");
  delay(750); // Delay en MS (1s)
}


Voila mon code.
Pour information je suis un débutant mais vraiment débutant c'est mon premier projet arduino...
Je n'arrive pas a faire ce que je veux :///
Comment je pourrais faire pour que quand le maraîcher définit une valeur automatiquement se créer 2 seuil haut et bas avec chacun une différence de 2 degrés ?

dbrion06

Code: [Select]

// avant loop (variables globales) :
const float hystHaut=1.9;
const float hystBas= 0.9;

// dans loop 
  if (temp > (temperature_max + hystHaut))  { // j'ai rajouté hystHaut et hystBas pour rendre la réponse asymètrique et mettre un hysteresis
    etat = HIGH;
  }

   if (temp < (temperature_max -hystBas)  {
    etat = LOW;
  }
 
  lcd.setCursor(0, 0);
  lcd.print("Temp : ");
  lcd.print (temp);
  lcd.setCursor(0, 1);
  if (etat == HIGH) lcd.print("Ouverture bache"
  if (etat == LOW) lcd.print ("Fermeture bache");

Go Up