#include <Wire.h> // Pour utiliser un bus I2C
#include <LiquidCrystal_I2C.h> // Pour utiliser l'écran LCD I2C
#include <OneWire.h> // Pour utiliser bus composants 1-wire
#include <DallasTemperature.h> // Pour utiliser capteur T° Dallas
LiquidCrystal_I2C lcd(0x27, 20, 4); // Décalaration Ecran LCD
// Pour les capteurs de T° Onewire
const byte ONE_WIRE_BUS = 7; // Connect DS18B29 to Arduino pin 7
OneWire oneWire(ONE_WIRE_BUS); // Setup a OneWire instance to communicate with any OneWire devices.
DallasTemperature sensors(&oneWire); // Pass our OneWire reference to Dallas Temperature sensor.
byte numDevices = 0;
int8_t TEMPERATURE_PRECISION = 12;
// Pour les boutons de selection menu et gestion des menus
int upButton = 10;
int downButton = 11;
int selectButton = 12;
const int maxMenu = 6; // Número máximo de opciones en el menú principal
const int maxSubMenu = 4; // Número máximo de opciones en el submenú
int menu = 0;
int submenu = 0;
// Ecrans de règlage paramètres
const int maxparametres = 6; // Nombre paramètres règlables maxi dans le sous menu paramètres
boolean menu_param = 0;
int submenu_param = 0;
String screens_param[maxparametres][2] = {{"MAX EAU CHAUDE:","Deg c"}, {"TEMPO CHAUFFE:", "Min"}, {"TEMPO MINUTEUR:","Min"}, {"Tc MAX RESISTANCE:","Deg c"}, {"Tc MIN RESERVOIR:","Deg c"}, {"Tc MAX RESERVOIR:","Deg c"}};
int parametres[maxparametres] = {60, 30, 5, 70, 5, 10 };
// Pour les sorties des relais résistances de chauffe
int chauffe_eau = 13;
int chauffe_res_propres = 9;
int chauffe_res_sales = 8;
int resistance_chauffee = 0;
int duree_tempo = 10000; // Durée temporisation de chauffe résistance
// Pour les affichages température
float temperatureaffichee = 0;
void setup() {
Serial.begin(115200);
sensors.begin();
byte address[8];
while (oneWire.search(address))
{
Serial.print("Bus index=");
Serial.print(numDevices);
Serial.print("; Device address=");
for(byte i = 0; i < 8; i++)
{
Serial.print(address[i], HEX);
Serial.print(" ");
}
Serial.println();
numDevices++;
}
lcd.begin(20, 4);
lcd.setBacklight(1);
pinMode(upButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(selectButton, INPUT_PULLUP);
pinMode(chauffe_eau, OUTPUT);
pinMode(chauffe_res_propres, OUTPUT);
pinMode(chauffe_res_sales, OUTPUT);
updateMenu();
}
void loop() {
affichemenu();
if (!digitalRead(upButton)) {
if (submenu == 0) {
menu = (menu - 1 <= 0) ? maxMenu : menu - 1;
} else {
submenu = (submenu - 1 <= 0) ? maxSubMenu : submenu - 1;
if (menu_param == true) {
submenu_param = (submenu_param - 1 <= 0) ? maxparametres : submenu_param - 1;
}
}
if (menu_param == false) {
updateMenu();
} else {
updateMenuparam();
}
delay(200); // Debounce anti-rebond
}
if (!digitalRead(downButton)) {
if (submenu == 0) {
menu = (menu + 1 > maxMenu) ? 1 : menu + 1;
} else {
submenu = (submenu + 1 > maxSubMenu) ? 1 : submenu + 1;
if (menu_param == true) {
submenu_param = (submenu_param +1 > maxparametres) ? 1 : submenu_param + 1;
}
}
if (menu_param == false) {
updateMenu();
} else {
updateMenuparam();
}
delay(200); // Debounce
}
if (!digitalRead(selectButton)) {
excecute();
delay(200); // Debounce
}
}
void updateMenu() {
if (submenu == 0) {
switch (menu) {
case 0:
ecran_temperatures();
menu = 1;
updateMenu();
break;
case 1:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(">CHAUFFE EAU");
lcd.setCursor(1, 1);
lcd.print("ANTIGEL EAU PROPRE");
lcd.setCursor(1, 2);
lcd.print("ANTIGEL EAU SALE");
lcd.setCursor(1, 3);
lcd.print("AFFICHAGE TEMPs");
break;
case 2:
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("CHAUFFE EAU");
lcd.setCursor(0, 1);
lcd.print(">ANTIGEL EAU PROPRE");
lcd.setCursor(1, 2);
lcd.print("ANTIGEL EAU SALE");
lcd.setCursor(1, 3);
lcd.print("AFFICHAGE TEMPs");
break;
case 3:
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("CHAUFFE EAU");
lcd.setCursor(1, 1);
lcd.print("ANTIGEL EAU PROPRE");
lcd.setCursor(0, 2);
lcd.print(">ANTIGEL EAU SALE");
lcd.setCursor(1, 3);
lcd.print("AFFICHAGE TEMPs");
break;
case 4:
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("CHAUFFE EAU");
lcd.setCursor(1, 1);
lcd.print("ANTIGEL EAU PROPRE");
lcd.setCursor(1, 2);
lcd.print("ANTIGEL EAU SALE");
lcd.setCursor(0, 3);
lcd.print(">AFFICHAGE TEMPs");
break;
case 5:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(">REGLAGE PARAMETRES");
lcd.setCursor(1, 1);
lcd.print("MINUTEUR CUISINE");
lcd.setCursor(1, 2);
lcd.print("NON UTILISE");
lcd.setCursor(1, 3);
lcd.print("NON UTILISE");
break;
case 6:
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("REGLAGE PARAMETRES");
lcd.setCursor(0, 1);
lcd.print(">MINUTEUR CUISINE");
lcd.setCursor(1, 2);
lcd.print("NON UTILISE");
lcd.setCursor(1, 3);
lcd.print("NON UTILISE");
break;
case 7:
menu = 5;
break;
}
} else updateSubmenu ();
}
void updateSubmenu () {
if (submenu != 0) {
switch (menu) {
case 0:
lcd.clear();
menu = 1;
break;
case 1:
lcd.clear();
lcd.print("CHAUFFE EAU");
lcd.setCursor(0, 1);
lcd.print((submenu == 1) ? ">ON" : "ON");
lcd.setCursor(4, 1);
lcd.print((submenu == 2) ? ">OFF" : "OFF");
lcd.setCursor(9, 1);
lcd.print((submenu == 3) ? ">MIN." : "MIN.");
lcd.setCursor(15, 1);
lcd.print((submenu == 4) ? ">BACK" : "BACK");
break;
case 2:
lcd.clear();
lcd.print("CH. RES. EAU PROPRE");
lcd.setCursor(0, 1);
lcd.print((submenu == 1) ? ">ON" : "ON");
lcd.setCursor(4, 1);
lcd.print((submenu == 2) ? ">OFF" : "OFF");
lcd.setCursor(9, 1);
lcd.print((submenu == 3) ? ">MIN." : "MIN.");
lcd.setCursor(15, 1);
lcd.print((submenu == 4) ? ">BACK" : "BACK");
break;
case 3:
lcd.clear();
lcd.print("CH. RES. EAU SALE");
lcd.setCursor(0, 1);
lcd.print((submenu == 1) ? ">ON" : "ON");
lcd.setCursor(4, 1);
lcd.print((submenu == 2) ? ">OFF" : "OFF");
lcd.setCursor(9, 1);
lcd.print((submenu == 3) ? ">MIN." : "MIN.");
lcd.setCursor(15, 1);
lcd.print((submenu == 4) ? ">BACK" : "BACK");
break;
case 4:
ecran_temperatures();
submenu = 0; // Vuelve al menú principal
updateMenu();
break;
case 5:
menu_param = true;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(menu);
lcd.setCursor(0,1);
lcd.print(submenu);
lcd.setCursor(0,2);
lcd.print(menu_param);
lcd.setCursor(0,3);
lcd.print(submenu_param);
delay(500);
if (submenu == 4) menu_param = false;
updateMenu();
// lcd.clear();
// lcd.setCursor(0,0);
// lcd.print(screens_param[0][0]);
// lcd.setCursor(5,0);
// lcd.print(parametres[0]);
// lcd.print(" ");
// lcd.print(screens_param[0][1]);
// lcd.clear();
// lcd.print("REGLAGE PARAMETRES:");
// lcd.setCursor(0,1);
// lcd.print("MAX EAU CHAUDE:");
// lcd.setCursor(15,1);
// lcd.print("XX,X");
// lcd.setCursor(0,2);
// lcd.print("TEMPO CH. MIN.:");
// lcd.setCursor(15,2);
// lcd.print("XX,X");
// lcd.setCursor(0,3);
// lcd.print("TEMPO MINUTEUR:");
// lcd.setCursor(15,3);
// lcd.print("XX,X");
// delay(3000);
// lcd.clear();
// lcd.print("REGLAGE PARAMETRES:");
// lcd.setCursor(0,1);
// lcd.print("Tc RESIST. EAU:");
// lcd.setCursor(15,1);
// lcd.print("XX,X");
// lcd.setCursor(0,2);
// lcd.print("MAX RESISTANCE:");
// lcd.setCursor(15,2);
// lcd.print("XX,X");
// lcd.setCursor(0,3);
// lcd.print("MIN RESERVOIR:");
// lcd.setCursor(15,3);
// lcd.print("XX,X");
// delay(2000);
//submenu = 0; // Vuelve al menú principal
// updateMenu();
break;
case 6:
lcd.clear();
lcd.print("MINUTEUR CUISINE");
lcd.setCursor(0, 1);
lcd.print((submenu == 1) ? ">ON" : "ON");
lcd.setCursor(4, 1);
lcd.print((submenu == 2) ? ">OFF" : "OFF");
lcd.setCursor(9, 1);
lcd.print((submenu == 3) ? ">MIN." : "MIN.");
lcd.setCursor(15, 1);
lcd.print((submenu == 4) ? ">BACK" : "BACK");
break;
case 7:
menu = 6;
break;
}
}
}
void affichemenu() {
Serial.print("menu ");
Serial.print(menu);
Serial.print(" submenu ");
Serial.println(submenu);
Serial.print("menu_param ");
Serial.println(menu_param);
Serial.print("sub_param ");
Serial.println(submenu_param);
}
void excecute() {
if (submenu == 0) {
switch (menu) {
case 1:
submenu = 1; // Entramos al submenu del LED1
updateMenu();
break;
case 2:
submenu = 1; // Entramos al submenu del LED2
updateMenu();
break;
case 3:
submenu = 1; // Entramos al submenu del LED3
updateMenu();
break;
case 4:
submenu = 1; // Entramos al submenu del LED4
updateMenu();
break;
case 5:
submenu = 1; // Entramos al submenu del LED5
//updateMenuparam();
updateMenu();
break;
case 6:
submenu = 1; // Entramos al submenu del LED6
updateMenu();
break;
}
} else action_menu(menu);
}
void action_menu(int menu_actuel) {
switch (menu_actuel) {
case 1:
resistance_chauffee = chauffe_eau;
break;
case 2:
resistance_chauffee = chauffe_res_propres;
break;
case 3:
resistance_chauffee = chauffe_res_sales;
break;
case 4:
resistance_chauffee = 0;
Serial.println("Bientot les températures");
break;
case 5:
resistance_chauffee = 0;
menu_param = true;
Serial.println("Bientot les paramètres");
break;
case 6:
resistance_chauffee = 0;
Serial.println("Bientot le minuteur");
break;
}
Serial.print("Résistance active ");
Serial.println(resistance_chauffee);
switch (submenu) {
case 1:
digitalWrite(resistance_chauffee, HIGH);
updateMenu();
break;
case 2:
digitalWrite(resistance_chauffee, LOW);
updateMenu();
break;
case 3: // Opción tempo
digitalWrite(resistance_chauffee, HIGH);
delay(duree_tempo);
digitalWrite(resistance_chauffee, LOW);
submenu = 0; // Vuelve al menú principal
updateMenu();
break;
case 4: // Opción de "Salir" en el submenú
submenu = 0; // Vuelve al menú principal
updateMenu();
break;
}
}
void demande_temperature (byte num_sensor) {
if (numDevices > 0) {
sensors.requestTemperatures();
if ( num_sensor < numDevices ) {
float temperatureCelsius = sensors.getTempCByIndex(num_sensor);
// Check if the temperature reading is valid
if (temperatureCelsius != DEVICE_DISCONNECTED_C) {
int tInt = int(temperatureCelsius);
temperatureaffichee = temperatureCelsius;
// Reset the error flag
sensors.setResolution(num_sensor, TEMPERATURE_PRECISION);
} else {
// Print an error message if the reading is invalid
temperatureaffichee = 999;
Serial.print("Error reading temperature from sensor at index ");
Serial.println(num_sensor);
}
char floatBuffer[20];
// delay(500);
}
}
// delay(1000);
}
void ecran_temperatures () {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tc EAU CHAUDE:");
lcd.setCursor(15,0);
demande_temperature (0);
lcd.print(temperatureaffichee);
lcd.setCursor(0,1);
lcd.print("Tc CC SOL:");
lcd.setCursor(15,1);
demande_temperature (1);
lcd.print(temperatureaffichee);
lcd.setCursor(0,2);
lcd.print("Tc CC HAUT:");
lcd.setCursor(15,2);
demande_temperature (2);
lcd.print(temperatureaffichee);
lcd.setCursor(0,3);
lcd.print("Tc EXTER.:");
lcd.setCursor(15,3);
demande_temperature (3);
lcd.print(temperatureaffichee);
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tc RESIST. EAU:");
lcd.setCursor(15,0);
demande_temperature (4);
lcd.print(temperatureaffichee);
lcd.setCursor(0,1);
lcd.print("Tc SOUTE:");
lcd.setCursor(15,1);
demande_temperature (5);
lcd.print(temperatureaffichee);
lcd.setCursor(0,2);
lcd.print("Tc EAU PROPRE:");
lcd.setCursor(15,2);
demande_temperature (6);
lcd.print(temperatureaffichee);
lcd.setCursor(0,3);
lcd.print("Tc EAU SALE:");
lcd.setCursor(15,3);
demande_temperature (7);
lcd.print(temperatureaffichee);
delay(3000);
}
void updateMenuparam() {
}