const byte bp_valid = 12; // entrée bouton poussoir changement écran
const byte bp_menu = 11; // entrée bouton poussoir changement menu
const byte bp_plus = 10;
const byte bp_moin = 9;
byte valid = HIGH;
byte menu = HIGH;
byte plus = HIGH;
byte moin = HIGH;
byte compteur_menu = 0;
byte compteur_plus = 1;
float vin = 0.00;
int value = 0;
//const byte max_power = 94;
//byte power = 0;
unsigned long preMillis = 0;
unsigned long previous_millis = 0;
byte dec_h = 0;
byte heure = 0;
//byte m = 0;
byte h = 0;
//byte etat = 0; // drapeau pour redémarage à 0
byte sans_hc = 0; // drapeau thermostat chauffe eau
float kwh_chauffe_eau = 0.00;
const int lcd_delay = 30000; // delay 30 secondes allumage afficheur
float vb_max = 48.50;
float kw_max = 2.00; // si i_max = 8.70 le chauffe eau se coupe
bool drap_valid = false;
bool drap_menu = false;
bool drap_plus = false;
bool drap_moin = false;
byte mode_chauffeau = 1;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
LiquidCrystal_I2C lcd (0x27,20,4);
RTC_DS1307 RTC;
void setup() {
Wire.begin();
lcd.init();
RTC.begin();
pinMode(bp_valid,INPUT_PULLUP);
pinMode(bp_menu,INPUT_PULLUP);
pinMode(bp_plus,INPUT_PULLUP);
pinMode(bp_moin,INPUT_PULLUP);}
void loop() {
if (valid == LOW || menu == LOW || plus == LOW || moin == LOW){
lcd.backlight();
preMillis = millis();}
DateTime now = RTC.now();
valid = digitalRead(bp_valid);
menu = digitalRead(bp_menu);
plus = digitalRead(bp_plus);
moin = digitalRead(bp_moin);
value = analogRead(A3);
vin = value * (5.00 / 1023); // calcul tension batterie
heure = (now.hour()+dec_h);
if (heure == 7){
kwh_chauffe_eau = 0.00;
sans_hc = 0;}
lcd.setCursor(3,0);
lcd.print(F("Routeur Solaire"));
lcd.setCursor(0,1);
lcd.print(F("Bat "));
lcd.print(vin);
lcd.print(F("V "));
lcd.setCursor(11,1);
lcd.print(F("D"));
lcd.setCursor(13,1);
if (dec_h == 0) {
lcd.print(F("H"));}
else{
lcd.print(F("E"));}
lcd.setCursor(15,1); // menu Horloge
if (heure < 10)lcd.print(F("0"));
lcd.print(heure);
lcd.print(F(":"));
if (now.minute() < 10)lcd.print(F("0"));
lcd.print(now.minute());
lcd.setCursor(17,2);
if (sans_hc == 1) lcd.print(F("SHC"));
else lcd.print(F("AHC"));
lcd.setCursor(0,3);
lcd.print(F("Ch"));
lcd.setCursor(3,3);
if (mode_chauffeau == 1) lcd.print(F("A"));
if (mode_chauffeau == 2) lcd.print(F("M"));
if (mode_chauffeau == 3) lcd.print(F("C"));
if (mode_chauffeau == 4) lcd.print(F("E"));
lcd.setCursor(5,3);
lcd.print(F("B"));
lcd.setCursor(7,3);
lcd.print(vb_max);
lcd.print(F("V"));
lcd.setCursor(14,3);
lcd.print(kw_max);
lcd.print(F("Kw"));
if (valid == HIGH) drap_valid = false;
if (valid == LOW && drap_valid == false){
if (compteur_menu == 1)lcd.setCursor(12,1);
if (compteur_menu == 2)lcd.setCursor(2,3);
if (compteur_menu == 3)lcd.setCursor(6,3);
if (compteur_menu == 4)lcd.setCursor(13,3);
lcd.print(F(" "));
compteur_menu = 0;
compteur_plus = 0;
drap_valid = true;}
if (menu == HIGH) drap_menu = false;
if (menu == LOW && drap_menu == false){
compteur_menu ++;
if (compteur_menu == 5) compteur_menu = 1;
drap_menu = true;
switch (compteur_menu){
case 1: lcd.setCursor(13,3);
lcd.print(F(" "));
lcd.setCursor(12,1);
break;
case 2: lcd.setCursor(12,1);
lcd.print(F(" "));
lcd.setCursor(2,3);
break;
case 3: lcd.setCursor(2,3);
lcd.print(F(" "));
lcd.setCursor(6,3);
break;
case 4: lcd.setCursor(6,3);
lcd.print(F(" "));
lcd.setCursor(13,3);
break;}
lcd.print(F("*"));}
if (plus == HIGH) drap_plus = false;
if (plus == LOW && drap_plus == false){
compteur_plus ++;
if(compteur_menu == 1){
if(compteur_plus >= 3) compteur_plus = 1;
dec_h = compteur_plus - 1;}
if(compteur_menu == 2) {
if(compteur_plus >= 5)compteur_plus = 1;
mode_chauffeau = compteur_plus;}
if(compteur_menu == 3) {
vb_max = vb_max + 0.10;
if(vb_max > 60.00)vb_max = 60.00;}
if(compteur_menu == 4) {
kw_max = kw_max + 0.10;
if(kw_max > 3.00)kw_max = 3.00;}
drap_plus = true;}
if (moin == HIGH) drap_moin = false;
if (moin == LOW && drap_moin == false){
compteur_plus --;
if(compteur_menu == 3) {
vb_max = vb_max - 0.10;
if(vb_max < 20.00)vb_max = 20.00;}
if(compteur_menu == 4) {
kw_max = kw_max - 0.10;
if(kw_max < 2.00)kw_max = 2.00;}
drap_moin = true;}
if (millis() - preMillis > lcd_delay)lcd.noBacklight();}