Hello à tous,
Bon déjà je viens de finir la migration sur mega2560, et donc comme évalué, ça a démarré direct. Je continue sur le programme maintenant, j’ai enlevé le delay et repris la période de mesure comme suit :
void Get_Data(){
if (millis() > Last_Measure_Time + 4000){
//Last_Measure_Time est initialisé dans le setup avec :
// Last_Measure_Time = millis();
//recup des datas du DHT22
Room_Hum=dht.readHumidity();
Room_Temp=dht.readTemperature();
Room_Hum_D = round(Room_Temp);
//Correction des températures lues sur DHT22
Room_Temp_Corrected = Room_Temp + Temp_Correct;
//recup des datas du DS18B20
ds.requestTemperatures();
Heater_Temp = ds.getTempCByIndex(0);
//contrôle des valeurs du DHT22
if (isnan(Room_Hum) || isnan(Room_Temp)){
Display.clearDisplay();
Display.setTextSize(1);
Display.setTextColor(WHITE);
Display.setCursor(10,25);
Display.println("Probléme de lecture");
return;
}
}
}
toute cette partie semble fonctionner, le point a travaillé et la gestion de l’encodeur qui ne semble pas fonctionné, j’y retourne.
EDIT
Bon, j’ai corrigé un peu le code pour améliorer les choses, mais j’ai l’impression d’avoir un souci de bounce, quand j’appuie sur le bouton de l’encodeur, le menu de réglage consigne apparait mais seulement une 1/2 secondes et disparait.
donc au niveau de ma fonction Display_Menu_Consigne(), je comprends que je dois faire une boucle qui doit rester active tant que je n’appuies pas sur le bouton de l’encodeur, mais je ne vois pas comment le faire proprement.
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//define sensor pins
#define DHTPIN A1
#define DHTTYPE DHT22
//define screen
#define Screen_Width 128
#define Screen_Heigth 64
#define Screen_Rst -1
//define Encoder
const byte SW_Pin = 7;
//const byte CLK_Pin = 5;
//const byte DT_Pin = 6;
//define PWM Output
const byte PWM_PIN = 8;
//****************************************************************************************************
// BITMAP FIRE
//****************************************************************************************************
const unsigned char feu [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x03, 0xc0, 0x00,
0x00, 0x03, 0xc0, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x67, 0xf0, 0x00,
0x00, 0xef, 0xf0, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x01, 0xff, 0xfe, 0x00,
0x01, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0x80, 0x01, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xc0,
0x04, 0xff, 0x9f, 0xc0, 0x06, 0xff, 0x5f, 0xe0, 0x06, 0xfe, 0xff, 0xe0, 0x07, 0xfe, 0xef, 0xf0,
0x0f, 0xfe, 0xef, 0xf0, 0x0f, 0xed, 0xf7, 0xf0, 0x0f, 0xcd, 0xfb, 0xf0, 0x07, 0xd5, 0xfb, 0xe0,
0x07, 0xb9, 0xfd, 0xe0, 0x07, 0xbf, 0xfd, 0xe0, 0x03, 0xbf, 0xfd, 0xc0, 0x01, 0xbf, 0xfd, 0x80,
0x00, 0xbf, 0xfd, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00
};
Adafruit_SSD1306 Display(Screen_Width, Screen_Heigth, &Wire, Screen_Rst);
//define variable for temperature
float Temp_Correct = -2;
float Room_Hum = 0;
float Room_Temp = 0;
float Room_Temp_Corrected = 0;
float Heater_Temp = 0;
float Room_Target = 23;
const float Heat_Temp_Max = 40;
float Room_Hum_D = 0;
// define Variable for encoder and menu
int SW_State;
long old_Pos_Enc = -999;
int Menu;
//define timer interval for Temp measure
unsigned long Last_Measure_Time;
//****************************************************************************************************
// CASCADE PID
//****************************************************************************************************
#include <PID_v1.h>
//External PID
double Input_Room, Output_Room, Setpoint_Room;
double Kp_room = 2, Ki_room= 0.5, Kd_room = 1; // to be adjusted
//Interal PID
double Input_Heater, Output_Heater, Setpoint_Heater;
double Kp_heater = 5, Ki_heater= 0.8, Kd_heater = 2; // to be adjusted
//define function for PID
PID pidRoom(&Input_Room, &Output_Room, &Setpoint_Room, Kp_room, Ki_room, Kd_room, DIRECT);
PID pidHeater(&Input_Heater, &Output_Heater, &Setpoint_Heater, Kp_heater, Ki_heater, Kd_heater, DIRECT);
void PID_Calculation(){
// Boucle extérieure : régul pièce
Input_Room = Room_Temp;
Setpoint_Room = Room_Target;
pidRoom.Compute();
Setpoint_Heater = Output_Room; // La consigne pour la boucle intérieure
// Sécurité : jamais chauffer > max !
if (Setpoint_Heater > Heat_Temp_Max) Setpoint_Heater = Heat_Temp_Max;
// Boucle intérieure : régul chauffe
Input_Heater = Heater_Temp;
//pidHeater.SetSetpoint(Setpoint_Heater);
pidHeater.Compute();
}
//****************************************************************************************************
// ENCODEUR
//****************************************************************************************************
#include <Encoder.h>
Encoder Cons_Encoder(6,5);
//****************************************************************************************************
// Gestion bouton encodeur
//****************************************************************************************************
#include <OneButton.h>
OneButton Encod_Btn(SW_Pin, true);
void Button_Survey(){
Encod_Btn.tick();
}
//****************************************************************************************************
// Affichage menu principal
//****************************************************************************************************
void Display_MenuP() {
Display.clearDisplay();
//température pièce
Display.setTextSize(2,4);
Display.setTextColor(WHITE);
Display.setCursor(5,5);
Display.println(Room_Temp_Corrected);
Display.drawCircle(72, 5, 4, WHITE);
Display.setCursor(80,5);
Display.println("C");
//Humidité pièce
Display.setTextSize(2);
Display.setCursor(0,45);
Display.println(Room_Hum);
Display.setTextSize(1);
Display.setCursor(60,52);
Display.println("%HR");
//PID Power
Display.setCursor(5, 36);
Display.println(Heater_Temp);
Display.setCursor(38, 36);
/*Display.println("Heater:");
Display.setCursor(85, 36);
Display.println(Output_Heater/255*100);
//Output_Heater=0;*/
if (Output_Heater>0) {
Display.drawBitmap(95,28,feu,32,32,WHITE);
}
Display.display();
}
//****************************************************************************************************
// Menu de geston de la consigne
// Amélioration à faire sur la gestion de l'encodeur
//****************************************************************************************************
void Display_Menu_Consigne(){
SW_State = digitalRead(SW_Pin);
//gestion de l'encodeur et variation de la valeur
while (SW_State == HIGH)
{
SW_State = digitalRead(SW_Pin);
long New_Pos_Enc = Cons_Encoder.read();
//le /8 permet de compenser les crans (4 pulse par cran) et d'avoir un gradient de 0.5°C pour la consigne
if (New_Pos_Enc != old_Pos_Enc){
Room_Target = Room_Target + ((New_Pos_Enc - old_Pos_Enc)/8);
old_Pos_Enc = New_Pos_Enc;
}
}
Display.clearDisplay();
Display.setTextSize(2);
Display.setTextColor(WHITE);
Display.setCursor(10,10);
Display.println("CONSIGNE");
Display.setTextSize(3);
Display.setTextColor(WHITE);
Display.setCursor(10,30);
Display.println(Room_Target);
Display.display();
}
//****************************************************************************************************
// Pilotage du choix du menu,
//****************************************************************************************************
void Control_Menu(){
if(Menu == 0){
Menu++;
Display_MenuP();
}
else if(Menu == 1){
Menu--;
Display_Menu_Consigne();
}
else {
Display.clearDisplay();
Display.setTextSize(2);
Display.setTextColor(WHITE);
Display.setCursor(10,10);
Display.println("Erreur de menu");
Display.display();
}
}
//****************************************************************************************************
// Recupération données Capteurs
//****************************************************************************************************
#include <DHT.h>
#include <DHT_U.h>
#include <OneWire.h>
#include <DallasTemperature.h>
//define function for DHT
DHT dht(DHTPIN, DHTTYPE);
//define function for DS18B20
OneWire OneWire(A3);
DallasTemperature ds(&OneWire);
void Get_Data(){
if (millis() > Last_Measure_Time + 4000){
//recup des datas du DHT22
Room_Hum=dht.readHumidity();
Room_Temp=dht.readTemperature();
Room_Hum_D = round(Room_Temp);
//Correction des températures lues sur DHT22
Room_Temp_Corrected = Room_Temp + Temp_Correct;
//recup des datas du DS18B20
ds.requestTemperatures();
Heater_Temp = ds.getTempCByIndex(0);
//contrôle des valeurs du DHT22
if (isnan(Room_Hum) || isnan(Room_Temp)){
Display.clearDisplay();
Display.setTextSize(1);
Display.setTextColor(WHITE);
Display.setCursor(10,25);
Display.println("Probléme de lecture");
return;
}
}
}
//****************************************************************************************************
// Bloc de SETUP
//****************************************************************************************************
void setup() {
//demarrage lecture sondes
dht.begin();
ds.begin();
//initialisation écran et LoadScreen
Display.begin(SSD1306_SWITCHCAPVCC, 0X3C);
Display.clearDisplay();
Display.setTextSize(2);
Display.setTextColor(WHITE);
Display.setCursor(10,10);
Display.println("HELLO");
Display.display();
//Définition Pin diverses
//pinMode (LED_BUILTIN, OUTPUT);
//définition pin puissance
pinMode(PWM_PIN, OUTPUT);
Setpoint_Room = Room_Target;
Setpoint_Heater = 0;
Menu = 0;
//définition PID
pidRoom.SetMode(AUTOMATIC);
pidHeater.SetMode(AUTOMATIC);
pidRoom.SetOutputLimits(0, Heat_Temp_Max); // La consigne interne varie jusque température sécu résistance
pidHeater.SetOutputLimits(0, 255); // PWM output
//définition comportement bouton encodeur avec biblio onebutton
Encod_Btn.attachClick(Display_Menu_Consigne);
Last_Measure_Time = millis();
delay(4000);
}
//****************************************************************************************************
// Boucle principale
//****************************************************************************************************
void loop() {
Get_Data();
Button_Survey();
PID_Calculation();
Button_Survey();
Display_MenuP();
Button_Survey();
}