Forum Électro-Bidouilleur

Merci de vous connecter ou de vous inscrire.

Connexion avec identifiant, mot de passe et durée de la session
Recherche avancée  

Nouvelles:

Bienvenue au Forum de discussion Électro-Bidouilleur! Inscrivez-vous pour participer aux discussions!: 
http://forum.bidouilleur.ca/index.php?action=register Les demandes d'inscription sont révisées quotidiennement.

Auteur Sujet: Thermostat STM32 ( avec Hystérèse v1)  (Lu 506 fois)

Manu

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Thermostat STM32 ( avec Hystérèse v1)
« le: novembre 25, 2020, 02:46:11 pm »

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
« Modifié: novembre 28, 2020, 07:12:31 pm par Manu »
IP archivée

kamill

  • Newbie
  • *
  • Messages: 32
    • Voir le profil
Re : Thermostat STM32 ( avec Hystérèse )
« Réponse #1 le: novembre 25, 2020, 03:56:28 pm »

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
IP archivée

Manu

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Thermostat STM32 ( avec Hystérèse )
« Réponse #2 le: novembre 28, 2020, 03:44:30 pm »

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.
IP archivée