Bonsoir tout le monde !
Je suis en train de développer depuis maintenant plusieurs mois un thermostat.
Il fonctionne bien j'ai juste un petit soucis d'affichage.
Je m'explique, Il y a plusieurs fonctions, une pour l'affichage du "double 7 segments" et une pour la gestion de l'appui d'un bouton.
Pour le bouton je gère déjà une variable avec millis() pour le temps. (appuie de trois secondes).
Le problème est pour l'affichage, le capteur prend la température à chaque retour de boucles, ce qui rend l'affichage illisible vu que si la température est entre deux degrès on n'arrive plus à lire...
J'ai créé une variable temps2 pour cette partie mais après plusieurs essaie il y a souvent un probème avec l'autre gestion du temps, elle n'est plus prise en compte. Je sais pas si je me suis bien exprimé, je vous donne mon code en entier.
//Programme pour l'afficheur LFU-4421-2001A
//Le principe est simple : afficher un par un les afficheurs sans oublier de réinitialiser avant chaque changement
const int seg10 = 10;
const int seg9 = 9;
const int seg8 = 8;
const int seg7 = 7;
const int seg6 = 6;
const int seg5 = 5;
const int seg4 = 4;
const int voyant = 2;
const int RELAIS = 13;
const int aff_1 = 11;
const int aff_2 = 12;
const int btn_1 = 3;
int etatBtn1;
int etatBtn1Prec;
int etatRelais = LOW;
unsigned long temps;
unsigned long temps2;
char chiffreUnit;
char chiffreDiz;
const int captTemp = 0;//variale prenant comme valeur la du capteur
int valeur;
float tension;
int temperature;
int tempEntree = 14;//variable stockant la température voulue par l'utilisateur
void setup() {
pinMode(btn_1, INPUT_PULLUP);
pinMode(seg10, OUTPUT);
pinMode(seg9, OUTPUT);
pinMode(seg8, OUTPUT);
pinMode(seg7, OUTPUT);
pinMode(seg6, OUTPUT);
pinMode(seg5, OUTPUT);
pinMode(seg4, OUTPUT);
pinMode(voyant, OUTPUT);
pinMode(aff_1, OUTPUT);
pinMode(aff_2, OUTPUT);
pinMode(RELAIS, OUTPUT);
digitalWrite(RELAIS, etatRelais); //On écrit l'état du relais
etatBtn1 == HIGH;
}
void loop()
{
valeur = analogRead(captTemp);
tension = map(valeur, 0, 1023, 0, 5000);
temperature = (tension / 10)-3;
chiffreDiz = temperature / 10;//variable pour récupérer le premier chiffre pour pouvoir l'envoyer à l'afficheur
chiffreUnit = temperature % 10;
digitalWrite(aff_2, HIGH);
aff7seg(chiffreUnit);
digitalWrite(aff_2, LOW);
digitalWrite(aff_1, HIGH);
aff7seg(chiffreDiz);
digitalWrite(aff_1, LOW);
appuiBtn1();
if(temperature < tempEntree )
{
etatRelais = LOW;
}
else if(temperature >=tempEntree)
{
etatRelais = HIGH;
}
digitalWrite(RELAIS, etatRelais);
}
void aff7seg(char chiffre) //decodage du chiffre en 7seg
{
if(chiffre == 0)//5-6-7-8-9-10
{
digitalWrite(seg10, HIGH);
digitalWrite(seg9, HIGH);
digitalWrite(seg8, HIGH);
digitalWrite(seg7, HIGH);
digitalWrite(seg6, HIGH);
digitalWrite(seg5, HIGH);
digitalWrite(seg10, LOW);
digitalWrite(seg9, LOW);
digitalWrite(seg8, LOW);
digitalWrite(seg7, LOW);
digitalWrite(seg6, LOW);
digitalWrite(seg5, LOW);
}
else if(chiffre == 1)//9-8
{
digitalWrite(seg9, HIGH);
digitalWrite(seg8, HIGH);
digitalWrite(seg9, LOW);
digitalWrite(seg8, LOW);
}
else if(chiffre == 2)
{
digitalWrite(seg10, HIGH);
digitalWrite(seg9, HIGH);
digitalWrite(seg4, HIGH);
digitalWrite(seg6, HIGH);
digitalWrite(seg7, HIGH);
digitalWrite(seg10, LOW);
digitalWrite(seg9, LOW);
digitalWrite(seg4, LOW);
digitalWrite(seg6, LOW);
digitalWrite(seg7, LOW);
}
else if(chiffre == 3)//10-9-4-8-7
{
digitalWrite(seg10, HIGH);
digitalWrite(seg9, HIGH);
digitalWrite(seg4, HIGH);
digitalWrite(seg8, HIGH);
digitalWrite(seg7, HIGH);
digitalWrite(seg10, LOW);
digitalWrite(seg9, LOW);
digitalWrite(seg4, LOW);
digitalWrite(seg8, LOW);
digitalWrite(seg7, LOW);
}
else if(chiffre == 4)//5-4-9-8
{
digitalWrite(seg5, HIGH);
digitalWrite(seg4, HIGH);
digitalWrite(seg9, HIGH);
digitalWrite(seg8, HIGH);
digitalWrite(seg5, LOW);
digitalWrite(seg4, LOW);
digitalWrite(seg9, LOW);
digitalWrite(seg8, LOW);
}
else if(chiffre == 5)//10-5-4-8-7
{
digitalWrite(seg10, HIGH);
digitalWrite(seg5, HIGH);
digitalWrite(seg4, HIGH);
digitalWrite(seg8, HIGH);
digitalWrite(seg7, HIGH);
digitalWrite(seg10, LOW);
digitalWrite(seg5, LOW);
digitalWrite(seg4, LOW);
digitalWrite(seg8, LOW);
digitalWrite(seg7, LOW);
}
else if(chiffre == 6)//10-5-4-8-6-7
{
digitalWrite(seg10, HIGH);
digitalWrite(seg5, HIGH);
digitalWrite(seg4, HIGH);
digitalWrite(seg8, HIGH);
digitalWrite(seg7, HIGH);
digitalWrite(seg6, HIGH);
digitalWrite(seg6, LOW);
digitalWrite(seg10, LOW);
digitalWrite(seg5, LOW);
digitalWrite(seg4, LOW);
digitalWrite(seg8, LOW);
digitalWrite(seg7, LOW);
}
else if(chiffre == 7)//10-9-8
{
digitalWrite(seg10, HIGH);
digitalWrite(seg9, HIGH);
digitalWrite(seg8, HIGH);
digitalWrite(seg10, LOW);
digitalWrite(seg9, LOW);
digitalWrite(seg8, LOW);
}
else if(chiffre == 8)//tout : 10-9-8-7-6-5-4
{
digitalWrite(seg10, HIGH);
digitalWrite(seg9, HIGH);
digitalWrite(seg8, HIGH);
digitalWrite(seg7, HIGH);
digitalWrite(seg6, HIGH);
digitalWrite(seg5, HIGH);
digitalWrite(seg4, HIGH);
digitalWrite(seg10, LOW);
digitalWrite(seg9, LOW);
digitalWrite(seg8, LOW);
digitalWrite(seg7, LOW);
digitalWrite(seg6, LOW);
digitalWrite(seg5, LOW);
digitalWrite(seg4, LOW);
}
else if(chiffre == 9)
{
digitalWrite(seg10, HIGH);
digitalWrite(seg9, HIGH);
digitalWrite(seg8, HIGH);
digitalWrite(seg7, HIGH);
digitalWrite(seg5, HIGH);
digitalWrite(seg4, HIGH);
digitalWrite(seg10, LOW);
digitalWrite(seg9, LOW);
digitalWrite(seg8, LOW);
digitalWrite(seg7, LOW);
digitalWrite(seg5, LOW);
digitalWrite(seg4, LOW);
}
}
void appuiBtn1()//gestion de l'appui du bouton 1
{
char continuer = 1;
char indice;
etatBtn1 = digitalRead(btn_1);
if (etatBtn1 == LOW)
{
if(etatBtn1Prec != etatBtn1)
{
temps = millis(); //on stocke la nouvelle heure
etatBtn1Prec = etatBtn1;
}
if((millis() - temps) > 3000)
{
temps = millis();
while(continuer == 1)
{
chiffreDiz = tempEntree / 10;
chiffreUnit = tempEntree % 10;
digitalWrite(aff_2, HIGH);
aff7seg(chiffreUnit);
digitalWrite(aff_2, LOW);
digitalWrite(aff_1, HIGH);
digitalWrite(voyant, HIGH);
aff7seg(chiffreDiz);
digitalWrite(voyant, LOW);
digitalWrite(aff_1, LOW);
etatBtn1 = digitalRead(btn_1);
if(etatBtn1 == LOW)//Une autre gestion du bouton : si il y a appui on incrémente la température entrée
{
if(etatBtn1Prec != etatBtn1)
{
etatBtn1Prec = etatBtn1;
tempEntree ++;
if(tempEntree > 30)//si ça dépasse 23 degrès on repasse à 14 degrès
tempEntree = 14;
}
}
else if( (millis() - temps) > 10000)//problème, on veut faire en sorte que lorsqu'un certain temps est passé on sort de la fonction
{
continuer = 0;
}
else
{
etatBtn1Prec=etatBtn1;
}
}
}
}
else
{
etatBtn1Prec=etatBtn1; //Memorisation de l'etat precedant
}
}
Merci d'avance à vous pour votre aide, en espérant que vous ayez réussi à me suivre.