Nouvelles:

Le Forum est maintenant chiffré (préambule https). Bien sûr, des liens externes insérés dans les sujets vont demeurer inchangés. Mais la composition des pages du Forum est désormais sécurisée. Si des problèmes d'affichage surviennent, veillez à vider votre cache pour ce site.

Menu principal

Thermostat STM32 ( avec Hystérèse v1)

Démarré par Manu, Novembre 25, 2020, 02:46:11 PM

« précédent - suivant »

Manu

Salut à  tous,  :)

Je faisais un thermostat qui était très simple en principe, mais finalement qui m'a bien caser la tête pour obtenir quelque chose comme un effet d'hystérésis. Je ne connais que les bases de code sur Arduino, donc toute contribution, simplification, nettoyage etc.. du code sera la bienvenue  ;D

Thermostat qui active un ventilateur à  partir d'une température. Une fois activé, il devra descendre de deux degrés pour se désactiver.





T= 19ºC sur la photo   Température Réelle
A= 24ºC sur la photo   Temp Activation
B= pasa sur el display   Temp Activation avec "hystérésis" à  partir de 2eme tour du "for".

for (T >= A ; T>= B ; T=T) {
      digitalWrite(Pin_Relay, LOW);
      B = (A-2);                           
}



// http://forum.bidouilleur.ca/
// v1.0 Thermostat STM32
/*
STM32F103C8T6
Relay 5v mod 3.3V
OLED SH1106
DHT22

PA5 input analog voltmeter
PB0 input analo pot for activation adjust
PB6 SCK OLED SH1106
PB7 SDA OLED SH1106
PB8 DHT22
*/

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <DHT.h>
#define DHTPIN PB8
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
int Pin_Relay = PA0;
int Pin_VSalida = PA5;
int Pin_Activ = PB0;

void setup(void) {
  Serial.begin(9600);
  u8g2.begin();
  dht.begin();
  pinMode(Pin_Relay, OUTPUT);
  pinMode(Pin_VSalida, INPUT);
  pinMode(Pin_Activ, INPUT);
  digitalWrite(Pin_Relay, HIGH);
  delay(500);
}

void loop(void) {
 
float T = dht.readTemperature();                   // Temperature ªC (for ºF -> dht.Temperature(True))
float H = dht.readHumidity();                      // Humidity
float V = (analogRead(Pin_VSalida)/71.236);        // AnalogRead to Volts (the formula changes according to the voltage divider bridge used)
float A = ((analogRead(Pin_Activ)*1.01)-1001);     // AnalogRead to Temp activation (the formula changes according to the potentiometer value and voltage divider bridge used)
float B = A;                                       // Over Temperature ºC = Activation Relay to apply later hysterersis

// Relay ON necessary conditions
for (T >= A ; T>= B ; T=T) {                        // Step1 Temp > A , Step2 Temp > B , Step3 not necessary but fill Temp = Temp 
  //Relay ON
  u8g2.clearBuffer();
  digitalWrite(Pin_Relay, LOW);
  u8g2.setFont (u8g2_font_courB12_tf);
  u8g2.setCursor(0,18);
  u8g2.print("ON");
  u8g2.setCursor(52,18);
  u8g2.print(V,0);
  u8g2.print("V");
  u8g2.setFont (u8g2_font_courB12_tf);
  u8g2.setCursor(86,18);
  u8g2.print(A,0);
  u8g2.print((char)176);
  u8g2.print("C"); 
  u8g2.setFont(u8g2_font_logisoso16_tr);
  u8g2.setCursor(0,40);
  u8g2.print("Temp");
  u8g2.setCursor(64,40);
  u8g2.print(dht.readTemperature(),0);
  u8g2.print((char)167);
  u8g2.print(" C");
  u8g2.setFont(u8g2_font_logisoso16_tr);
  u8g2.setCursor(0,63);
  u8g2.print("Hum");
  u8g2.setCursor(64,63);
  u8g2.print(dht.readHumidity(),0);
  u8g2.print(" ");
  u8g2.print((char)37);
  u8g2.sendBuffer();
  delay(300);
  T = dht.readTemperature();
  H = dht.readHumidity();                   
  V = (analogRead(Pin_VSalida)/71.236);       
  A = ((analogRead(Pin_Activ)*1.01)-1001); 
  B = (A-2);                                   // for Step2 Temp > B add "Hysteresis"
}
// Relay OFF
  u8g2.clearBuffer();
  digitalWrite(Pin_Relay, HIGH);
  u8g2.setFont (u8g2_font_courB12_tf);
  u8g2.setCursor(0,18);
  u8g2.print("OFF");
  u8g2.setCursor(52,18);
  u8g2.print(V,0);
  u8g2.print("V");
  u8g2.setFont (u8g2_font_courB12_tf);
  u8g2.setCursor(86,18);
  u8g2.print(A,0);
  u8g2.print((char)176);
  u8g2.print("C"); 
  u8g2.setFont(u8g2_font_logisoso16_tr);
  u8g2.setCursor(0,40);
  u8g2.print("Temp");
  u8g2.setCursor(64,40);
  u8g2.print(dht.readTemperature(),0);
  u8g2.print((char)167);
  u8g2.print(" C");
  u8g2.setFont(u8g2_font_logisoso16_tr);
  u8g2.setCursor(0,63);
  u8g2.print("Hum");
  u8g2.setCursor(64,63);
  u8g2.print(dht.readHumidity(),0);
  u8g2.print(" ");
  u8g2.print((char)37);
  u8g2.sendBuffer();
  delay(300);
}


Liens:

Relais 5v -> 3.3v modif
http://forum.bidouilleur.ca/index.php?topic=907.0

EB_#148 Banc d'Essai: Contrôleur de Température W1209 (Thermostat)
https://youtu.be/j6blCrNm-5s

kamill

Bonjour,

Je ne sais pas très bien ce que tu penses que fait
for (T >= A ; T>= B ; T=T)
Mais ça ne fait certainement pas ce que tu penses.

C'est équivalent à  for (; T>= B ; ) ou while (T>= B)

Pour gérer un hystérésis c'est simple
On définit une température de marche et une température d’arrêt.
Pour un chauffage ça donne le pseudocode:
si T>=Tarret
  arreter le chauffage
si T=<Tmarche
  mettre en marche le chauffage

Manu

Ok merci, je vais voir cette méthode aussi. Pour le moment, la fonction dont j'avais besoin fonctionne. Mon problème est plutôt l'organisation du code de manière plus intelligible.