Go Down

Topic: Thermostat  (Read 410 times) previous topic - next topic

Project_1209

May 08, 2016, 04:35 pm Last Edit: May 08, 2016, 04:41 pm by Project_1209
Bonjour

Je suis sur un projet de thermostat simple

relevé de la température via LM35.
un écran 2x16 pour visualiser la consigne et la température mesurée
2 boutons pour le réglage. Qui est enregistré sur l'EEPROM en cas de perte d'alimentation.
il est réglable de 15°C a 35°C.
le rétroéclairage s'allume pendant 10secs après appuis sur un des 2 boutons, la minuterie est remise a zéro a chaque appuis pour qu'il s'éteigne 10sec après le dernier appuis.

Jusqu' ici tout fonctionne bien. J'aimerais que le premiers appuis ne modifie pas le réglage juste activer l'écran pour lecture et que le réglage ce fasse a partir du second appuis.

J'ai fait ce code pour tester l'éclairage s'allume mais une foie allumé la fonction de modification de la consigne est bloqué.

Je travaille sur le simulateur : 123d.circuits.io

Code: [Select]
if((etatbtp != memoire_plus) && (etatbtp == HIGH) && (retro == HIGH))

Voici le schéma de câblage et la totalité du code
la led bleu est présente pour illustrer l'activation du relais.



Code: [Select]
#include "LiquidCrystal.h" //ajout de la librairie
#include <EEPROM.h>

LiquidCrystal lcd(11,10,9,8,7,6,5,4,3,2); //liaison 8 bits de données

int capteur=A0; //Déclaration sonde de température sur la broche A0
int Cons = 20;  // Temperature demandée
int relais=12; //Déclaration relais sur la broche analogique 12
int etatbtp;
int etatbtm;
int btp=A1; // Déclaration bouton plus sur la borne analogique 1
int btm=A2; // Déclaration bouton moins sur la borne analogique 2
int memoire_plus = LOW; //état relâché par défaut
int memoire_minus = LOW;
int retro = A3; //Déclaration retroeclairage sur sortie analogique 3
long temps; //variable qui stocke la mesure du temps
int T_retro = 1000; // temps d'allumage du retroeclairage en ms 
void setup()
{
   lcd.begin(16,2); //utilisation d'un écran 16 colonnes et 2 lignes
   pinMode(relais, OUTPUT); //met la broche en sortie
   pinMode(btp,INPUT); //met la broche en entrée
   pinMode(btm,INPUT); //met la broche en entrée
   pinMode(retro,OUTPUT); //met la broche en sortie
   
//on initialise le temps
   temps = millis();
   
 
//Affichage fixe
   lcd.setCursor(0,0);
   lcd.write("Consigne");
   lcd.setCursor(0,1);
   lcd.write("Temperature");
   lcd.setCursor(12,0);
   lcd.print(Cons);
 
//Lecture de la variable Cons à l'adresse 0 de l' EEPROM
   EEPROM.get(0, Cons);
 
   
}
 
void loop() {
 
   
//lecture de l'état du bouton d'incrémentation
     etatbtp = digitalRead(btp);
//lecture de l'état du bouton de décrémantation
     etatbtm = digitalRead(btm);
   
//Si le bouton a un état différent que celui enregistré ET que cet état est "appuyé"
    if((etatbtp != memoire_plus) && (etatbtp == HIGH))
    {
        Cons++; //on incrémente la variable de temperature de consigne
        temps = millis(); //on stocke la nouvelle heure
     
    }
         
//Si le bouton a un état différent que celui enregistré ET que cet état est "appuyé"
    if((etatbtm != memoire_minus) && (etatbtm == HIGH))
    {
        Cons--; //on décrémente la variable de temperature de consigne
        temps = millis(); //on stocke la nouvelle heure
     
    }
 
   if((etatbtm != memoire_minus) && (etatbtm == HIGH)||(etatbtp != memoire_plus) && (etatbtp == HIGH))
    {
        digitalWrite(retro, HIGH); // on allume le retroeclairage
     
    }
 
       else
       {
            if((millis() - temps) > T_retro)
            {
                digitalWrite(retro, LOW); //on  éteint le retroeclairage
               //temps = millis(); //on stocke la nouvelle heure
            }
        }
         
    memoire_plus = etatbtp; //on enregistre l'état du bouton pour le tour suivant
    memoire_minus = etatbtm; //on enregistre l'état du bouton pour le tour suivant
 
//on applique des limites au nombre pour ne pas dépasser 15 ou 35
    if(Cons > 35)
    {
        Cons = 35;
    }
    if(Cons < 15)
    {
        Cons = 15;
     
    }
 
//Ecriture de la variable valeur à l'adresse 0
   EEPROM.put(0, Cons);
 
// lecture et conversion capteur de temperature
 
   float temp = analogRead(capteur) / 2.048; //calcul de la temperature en fonction de la tension du LM35
   
    if(Cons < temp) { // Si la température mesurée est inférieure a la consigne
      digitalWrite(relais, LOW);
    }
        else {
          digitalWrite(relais, HIGH);
        }
 
//Affichage variable
   lcd.setCursor(12,0);
   lcd.print(Cons);
   lcd.setCursor(12,1);
   lcd.print( temp, 1);
     
  }

Go Up