Je réalise un thermostat qui actionnera un chauffage d'appoint.
Le système fonctionne mais il y a une fonction que je voudrait mettre en place. Sur l'afficheur oled, j'ai actuellement 2 valeurs de température. La valeur de réelle de la pièce et la valeur ciblé.
La valeur cible se modifie avec un potentiomètre.
J'aimerai que la valeur cible s'affiche seulement lorsque la valeur du potentiomètre change. Puis disparait après quelques seconde.
C'est là ou je bloque ! Pour afficher une valeur lorsqu'elle change.
J'ai essayé une formule de comparaison mais ca marche pas.
if(tempC != DEVICE_DISCONNECTED_C) // si la sonde est branché
{
u8g2.clearBuffer();
u8g2.setCursor(0, 0);
u8g2.print(tempC);
u8g2.println("\xb0"); // symbole degres C
u8g2.println("C");
u8g2.sendBuffer();
delay(time_delay);
}
else
{
u8g2.clearBuffer(); // sinon 'erreur signal'
u8g2.setCursor(0, 10);
u8g2.print("Erreur Signal");
u8g2.sendBuffer();
delay(time_delay);
}
if(t == (t+1) || t == (t-1)){ // si la valeur t est égale à t+1 ou t-1
u8g2.clearBuffer();
u8g2.setCursor(0, 0);
u8g2.print(t);
u8g2.println("\xb0"); // symbole degres C
u8g2.println("C");
u8g2.sendBuffer();
delay(time_delay);
}
#include <U8g2lib.h> // definition des librairies utilisées
#include <Wire.h>
#define time_delay 1000
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
const byte potar =A0; // signal du potentiomètre sur A0
float consigne = map(analogRead(potar),0,1023,15,31); // map la valeur du potentiomètre avec la valeur du thermostat(valeur cible)
float memo_consigne = consigne; //
float t = 0.0;
unsigned long chrono_affichage_consigne = millis();
int led = 3; // led brancher sur la pin 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); // defini la taile (128X32) et l'adresse I2C de l'écran (0X3C par défaut)
void u8g2_prepare() {
u8g2.setFont(u8g2_font_logisoso24_tf); // (u8g2_font_ncenB10_tr --- u8g2_font_6x10_tf --- u8g2_font_helvB10_tr ) police d'écriture
u8g2.setFontRefHeightExtendedText();
u8g2.setDrawColor(1);
u8g2.setFontPosTop();
u8g2.setFontDirection(0);
}
void setup(void) {
pinMode(led, OUTPUT); // pin de la led en sortie
u8g2.begin(); // ouverture du port de comunication pour l'écran
u8g2.setFont(u8g2_font_helvB14_tr); // police d'écriture
u8g2.setFontRefHeightExtendedText();
u8g2.setDrawColor(1);
u8g2.setFontPosTop();
u8g2.setFontDirection(0);
u8g2.clearBuffer(); // nettoie la mémoire tampon
u8g2.setCursor(5, 10); // position du texte sur l'écran sur les axes (x,y)
u8g2.print("Thermometre"); // texte a envoyer
u8g2.sendBuffer(); // envoi le texte vers la memoire'
delay(2000);
sensors.begin(); // ouvre le port de comunication de la sonde
u8g2_prepare();
}
void loop(void) {
// call sensors.requestTemperatures() to issue a global temperature
sensors.requestTemperatures(); // Send the command to get temperatures
// After we got the temperatures, we can print them here.
// We use the function ByIndex, and as an example get the temperature from the first sensor only.
float tempC = sensors.getTempCByIndex(0); // attribut a "tempC" la valeur de la sonde
consigne = map(analogRead(potar), 0, 1023, 15, 31); // attribut a "consigne" la mapper entre le potentiomètre (0,1023) et le valeur du thermostat souhaité (15,31)
if ( (consigne >= (memo_consigne + 1)) || (consigne <= (memo_consigne - 1))) // si c'est vrai : on encoi à l'écran la valeur du potentiomètre tant quelle bouge. Jusqu'a 3 secande lorsqu'elle est fixe
{
u8g2.clearBuffer();
u8g2.setCursor(20, 6);
u8g2.print(consigne);
u8g2.println("\xb0"); // symbole degres °
u8g2.println("C");
u8g2.sendBuffer();
chrono_affichage_consigne = millis();
memo_consigne = consigne ;
}
if (millis() > (chrono_affichage_consigne + 3000)) // si c'est vrai : on envoi à l'écran la valeur de la sonde "tempC"
{
u8g2.clearBuffer();
u8g2.setCursor(20, 6);
u8g2.print(tempC);
u8g2.println("\xb0"); // symbole degres °
u8g2.println("C");
u8g2.sendBuffer();
delay(time_delay);
}
if((consigne - 1) >= tempC){ // si "consigne"-1 est supérieur ou égal a "tempC"
digitalWrite(led, HIGH); // on allume la led
}
if(consigne <= tempC){ // si "consigne" est inferieur ou égal a "tempC"
digitalWrite(led, LOW); // on éteind la led
}
}
Je rencontre à nouveau un soucis avec mon projet.
Dans le programme, je simule la commande d'un relais via la "led". Le fait est quelle s'allume ou s'éteint lorsque la valeur cible est atteinte.
En réalité, le relais (led) doit être actionné pendant 5 seconde lors de la mise en marche et l'arret du chauffage.
J'ai utilisé ce code
if((consigne - 1) >= tempC){ // si "consigne"-1 est supérieur ou égal a "tempC"
digitalWrite(led, HIGH); // on allume la led
delay(5000);
digitalWrite(led, LOW);
}
if(consigne <= tempC){ // si "consigne" est inferieur ou égal a "tempC"
digitalWrite(led, HIGH);
delay(5000);
digitalWrite(led, LOW);
}
}
Le problème est que le programme tourne en boucle lorsque les valeurs supérieur et inférieur sont dépassées. Donc la "led" clignote tout le temps.
Il faudrait que if(consigne <= tempC){ // si "consigne" est inferieur ou égal a "tempC"
s'active une seul fois lorsque la valeur atteinte.
Et que if((consigne - 1) >= tempC){ // si "consigne"-1 est supérieur ou égal a "tempC"
s'active aussi une seule fois lorsque la valeur est atteinte.
Je sais pas si c'est clair comme demande
J'ai essayé avec les interruptions mais sans succès.
J'avais aussi l'idée d'envoyer le signal on/off de la led vers un second microcontrôleur qui commande à son tour le relais via la librairie Button.h
Tu peux essayer en utilisant un indicateur dans ta condition
if ((consigne - 1) >= tempC && replay != 1) { // si "consigne"-1 est supérieur ou égal a "tempC"
digitalWrite(led, HIGH); // on allume la led
delay(5000);
digitalWrite(led, LOW);
replay = 1;
}
if (consigne <= tempC && replay != -1) { // si "consigne" est inferieur ou égal a "tempC"
digitalWrite(led, HIGH);
delay(5000);
digitalWrite(led, LOW);
replay = -1
}
Avec la variable déclarée en dehors de ta fonction char replay = 0;
Si tu veux que cela soit plus parlant, tu peux utiliser aussi un caractère sous la forme par exemple 'N' pour non définie, 'S' pour consigne supérieur, 'I' pour consigne inférieur