Thermostat électronique

Bonsoir,

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

hello
dans ton if, comment veux tu que "t" soit absolument égal à "t+1" ( ou à "t-1") ?????????????

non par forcément.

J'aimerai que lorsque l'on tourne de potentiomètre, la valeur "t" s'affiche à l'écran. Puis disparaît au bout de 2 seconde par exemple.

avec un bout de code.......
si " t " est la valeur du potentiometre, comment la condition "t==t+1" peut elle etre vraie ?

vu sous cet angle c'est pas faux

non testé

const byte potar = A1;
float consigne = map(analogRead(potar), 0, 1023, 0, 30);
float memo_consigne = consigne;
float t = 0.0;
unsigned long chrono_affichage_consigne = millis();
#include <LiquidCrystal_I2C.h>

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()
{
  lcd.begin();
}
void loop()
{
  //bla
  //bla
  //bla
  consigne = map(analogRead(potar), 0, 1023, 0, 30);
  if ( (consigne >= (memo_consigne + 1)) || (consigne <= (memo_consigne - 1)))
  {
    lcd.setCursor(10, 1);
    lcd.print(consigne);
    chrono_affichage_consigne = millis();
    // bla
    //bla
    //bla
    memo_consigne = consigne ;
  }
  if (millis() > (chrono_affichage_consigne + 2000))
  {
    lcd.setCursor(10, 1);
    lcd.print(" ");
  }
}

Merci à toi dfgh !
Ca fonctionne nickel :+1:

#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 met le code si ca peut aider certain :slightly_smiling_face:

Merci du retour, bonne suite :+1:

1 Like

Bonsoir,

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 :roll_eyes:
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

Quand pensez-vous ?

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

Merci pour ta réponse terwal,
Je fais l'essai et te tiens au courant .

Merci

Le code fonctionne terwal,
Je l'ai tester ce matin.

Merci :slightly_smiling_face:

Après, si tu voudra par la suite, faire autre chose pendant les 5s, il te faudra changer la structure de ton programme.

1 Like

J'ai dans l'idée pour un futur projet, de pouvoir changer d'affichage en appuyant sur deux boutons. Comme des menu.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.