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