#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Teplotní čidlo DS18B20
// připojení knihoven
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>
#include <SoftwareSerial.h>
// nastavení čísla vstupního pinu
// vytvoření instance oneWireDS z knihovny OneWire
#define ONE_WIRE_BUS_1 22 //snímač teploty výstupu z kotle pin 22
#define ONE_WIRE_BUS_2 24 //snímač teploty horní části nádoby pin 24
#define ONE_WIRE_BUS_3 26 //snímač teploty spodní části nádoby pin 26
#define ONE_WIRE_BUS_4 28 //snímač teploty na potrubí před aku nádobou pin 28
#define ONE_WIRE_BUS_5 30 //snímač teploty výstup do topení pin 30
#define ONE_WIRE_BUS_6 32 //snímač teploty zpátečky do kotle pin 32
//#define ONE_WIRE_BUS_7 34 //snímač teploty vody ve velkém bojleru pin 34
#define ONE_WIRE_BUS_8 36 //snímač teploty vody v malém bojleru pin 36
#define ONE_WIRE_BUS_9 38 //snímač venkovní teploty pin 38
// nastavení čísel vstupních a výstupních pinů
#define pin_poloha_serva_aku A0
#define pin_poloha_serva_radiatory A1
#define pin_cerpadlo_kotle_in 23
#define pin_cerpadlo_kotle 45
#define pin_cerpadlo_radiatory 25
#define pin_servo_aku_open 27
#define pin_servo_aku_close 29
#define pin_servo_radiatory_open 31
#define pin_servo_radiatory_close 33
#define pin_servo_bojler_m 35
//#define pin_servo_bojler_v 37
//#define pin_ventil_radiatory 39
#define pin_pokojovy_termostat 41
#define pin_blokace_plynu 43
#define pin_7 7
// nastavení čísel propojovacích pinů pro displej
#define RX 15
#define TX 14
// nastavení adresy I2C (0x27 v mém případě 0x3F),
// a dále počtu znaků a řádků LCD, zde 20x4
LiquidCrystal_I2C lcd(0x27, 20, 4);
OneWire oneWire_kotelvystup(ONE_WIRE_BUS_1); //snímač teploty výstupu z kotle pin 22
OneWire oneWire_akumulackavrch(ONE_WIRE_BUS_2); //snímač teploty horní části nádoby pin 24
OneWire oneWire_akumulackaspodek(ONE_WIRE_BUS_3); //snímač teploty spodní části nádoby pin 26
OneWire oneWire_privod(ONE_WIRE_BUS_4); //snímač teploty na potrubí před aku nádobou pin 28
OneWire oneWire_privodradiatory(ONE_WIRE_BUS_5); //snímač teploty výstup do topení pin 30
OneWire oneWire_zpateckaradiatory(ONE_WIRE_BUS_6); //snímač teploty zpátečky do kotle pin 32
//OneWire oneWire_bojlerv(ONE_WIRE_BUS_7); //snímač teploty vody ve velkém bojleru pin 34
OneWire oneWire_bojlerm(ONE_WIRE_BUS_8); //snímač teploty vody v malém bojleru pin 36
OneWire oneWire_venek(ONE_WIRE_BUS_9); //snímač venkovní teploty pin 38
// vytvoření instance senzoryDS z knihovny DallasTemperature
DallasTemperature kotel_vystup(&oneWire_kotelvystup); //snímač teploty výstupu z kotle pin 22
DallasTemperature akumulacka_vrch(&oneWire_akumulackavrch); //snímač teploty horní části nádoby pin 24
DallasTemperature akumulacka_spodek(&oneWire_akumulackaspodek); //snímač teploty spodní části nádoby pin 26
DallasTemperature privodni_portubi(&oneWire_privod); //snímač teploty na potrubí před aku nádobou pin 28
DallasTemperature privod_radiatory(&oneWire_privodradiatory); //snímač teploty výstup do topení pin 30
DallasTemperature zpatecka_radiatory(&oneWire_zpateckaradiatory); //snímač teploty zpátečky do kotle pin 32
//DallasTemperature bojler_velky(&oneWire_bojlerv); //snímač teploty vody ve velkém bojleru pin 34
DallasTemperature bojler_maly(&oneWire_bojlerm); //snímač teploty vody v malém bojlerupin 36
DallasTemperature venkovni_teplota(&oneWire_venek); //snímač venkovní teploty pin 38
// vytvoření objektu swSerial z knihovny s nastavenými piny
SoftwareSerial swSerial(RX, TX);
//Vytvoření promněnných pro nastavení
int servo_aku_max = 1023; //map(poloha_serva_aku_analog, servo_aku_max, servo_aku_min, 100%, 0%)
int servo_aku_min = 0 ; //map(poloha_serva_aku_analog, servo_aku_max, servo_aku_min, 100%, 0%)
int servo_radiatory_max = 1023; //map(poloha_serva_radiatory_analog, servo_radiatory_max, servo_aku_min, 100%, 0%)
int servo_radiatory_min = 0; //map(poloha_serva_radiatory_analog, servo_radiatory_max, servo_aku_min, 100%, 0%)
int poloha_serva_radiatory_analog = 0; //aktuální poloha serva radiátorů 0-1023
int poloha_serva_radiatory = 0; //aktuální poloha serva radiátorů 0-100%
int pozadovana_poloha_serva_radiatory = 100; //požadovaná poloha serva radiátorů 0-100%
int poloha_serva_aku_analog = 0; //aktuální poloha serva aku nádoby 0-1023
int poloha_serva_aku = 0; //aktuální poloha serva aku nádoby 0-100%
int pozadovana_poloha_serva_aku = 100; //požadovaná poloha serva aku nádoby 0-100%
byte servo_radiatory = 1; //stav serva radiatory ručne/auto (1-auto),(2-ručně)
int servo_aku = 1; //stav serva aku ručne/auto (1-auto),(2-ručně)
byte rele_rad_close = 0;
byte rele_rad_open = 0;
byte rele_aku_close = 0;
byte rele_aku_open = 0;
byte pozadovana_teplota_aku_spodek = 70; //požadovaná teplota aku nádoby sponí část
byte pozadovana_teplota_aku_vrch = 70; //požadovaná teplota aku nádoby horní část
int pozadovana_teplota_topeni = 70; //požadovaná teplota do rediátorů
byte pozadovana_teplota_tuv = 64; //požadovaná teplota tuv bojler 1
int pozadovana_teplota;
byte havarijni_teplota = 80; //havarijní teplota na výstupu z kotle
boolean pusteni_cerpadla_radiatory = false;
byte dynamika_serv = 1; //čas na změnu teploty po změně polohy serv
unsigned long dynamika_stary_cas;
unsigned long stary_cas1;
byte hystereze = 4;
byte rozdil = 10; //
int ekviterm = 3; //ekvitermní křivka 0-9,0-vypnuto
float krivka;
String zprava_lcd;
int data_lcd;
float vykon;
float prutok;
int venek_teplota;
int eprom_venkovni_teplota;
//Vytvoření promněnných pro stavy
byte cerpadlo_kotle;
byte termostat;
byte stav_serva_bojler = 0;
byte stav_cerpadla_radiatory = 0; //stav čerpadla radiátorů 0-auto vypnuto, 1-auto zapnuto, 2-ručně zapnuto
byte prehrati = 0;
boolean plyn_kotel = false;
byte topeni_z_akumulace = 0;
boolean topeni_do_akumulace = false;
boolean ohrev_bojleru = false;
String zprava;
//Vytvoření promněnných pro teplotní čidla
float teplota_kotel_vystup;
float teplota_akumulacka_vrch;
float teplota_akumulacka_spodek;
float teplota_privodni_portubi;
float teplota_privod_radiatory;
float teplota_zpatecka_radiatory;
//float teplota_bojler_velky;
float teplota_bojler_maly;
float teplota_venkovni_teplota;
// Výstupní piny HIGH = 1 (sepnuto), LOW = 0 (vypnuto)
// Vstupní piny HIGH = 0 (vypnuto), LOW = 1 (sepnuto)
//================================== SETUP =================================================================================
void setup() {
//iniciace LCD
lcd.init();
//zapnutí podsvícení
lcd.backlight();
Serial.begin(9600);
// první zápis do eeprom
byte eprom = EEPROM.read (10);
if (eprom != 5) { //jestli ještě nebyl proveden žádný zápis do eeprom
EEPROM.write (10, 5); //byl proveden prvotní zápis hodnot do eeprom
EEPROM.write (11, 0); //ekviterm nastaven na 0
EEPROM.write (12, 70); //pozadovana_teplota_aku_vrch 70°C
EEPROM.write (13, 70); //pozadovana_teplota_aku_spodek 70°C
EEPROM.write (14, 70); //pozadovana_teplota_topeni 70°C
EEPROM.write (15, 80); //havarijni_teplota 80°C
EEPROM.write (16, 64); //pozadovana_teplota_tuv 64°C
EEPROM.write (17, 5); //dynamika_serv 5 sekund
}
// čtení hodnot z eeprom
ekviterm = EEPROM.read (11); //ekviterm nastaven na 0
pozadovana_teplota_aku_vrch = EEPROM.read (12); //pozadovana_teplota_aku_vrch
pozadovana_teplota_aku_spodek = EEPROM.read (13); //pozadovana_teplota_aku_spodek
pozadovana_teplota_topeni = EEPROM.read (14); //pozadovana_teplota_topeni
havarijni_teplota = EEPROM.read (15); //havarijni_teplota
pozadovana_teplota_tuv = EEPROM.read (16); //pozadovana_teplota_tuv
dynamika_serv = EEPROM.read (17); //dynamika_serv
// zapnutí komunikace knihovny s teplotním čidlem
kotel_vystup.begin();
akumulacka_vrch.begin();
akumulacka_spodek.begin();
privodni_portubi.begin();
privod_radiatory.begin();
zpatecka_radiatory.begin();
//bojler_velky.begin();
bojler_maly.begin();
venkovni_teplota.begin();
// zahájení komunikace po softwarové sériové lince
swSerial.begin(9600);
// nastavení směru vstupního pinu
pinMode(pin_poloha_serva_aku, INPUT); //poloha serva esbe do aku nadoby pin A0
pinMode(pin_poloha_serva_radiatory, INPUT); //poloha serva esbe do topení pin A1
pinMode(pin_cerpadlo_kotle_in, INPUT_PULLUP); //čte stav čerpadla uhelného kotle pin 23
pinMode(pin_cerpadlo_kotle, OUTPUT); //ovládá čerpadlo uhelného kotle pin 45
pinMode(pin_cerpadlo_radiatory, OUTPUT); //ovládá čerpadlo toného okruhu pin 25
pinMode(pin_servo_aku_open, OUTPUT); //ovládá servo esbe do aku nádoby pin 27
pinMode(pin_servo_aku_close, OUTPUT); //ovládá servo esbe do aku nádoby pin 29
pinMode(pin_servo_radiatory_open, OUTPUT); //otevírá servo esbe do topení pin 31
pinMode(pin_servo_radiatory_close, OUTPUT); //zavírá servo esbe do topení pin 33
pinMode(pin_servo_bojler_m, OUTPUT); //ovládá trojcestný ventil pro ohřev malého boleru pin 35
//pinMode(pin_servo_bojler_v, OUTPUT); //ovládá elektro ventil pro ohřev velkého boleru pin 37
//pinMode(pin_ventil_radiatory, OUTPUT); //ovládá elektro ventil do radiátorů pin 39
pinMode(pin_pokojovy_termostat, INPUT_PULLUP); //vtup z pokojového termostatu 41
pinMode(pin_blokace_plynu, OUTPUT); //blokuje spuštění plynového kotle 43
pinMode(pin_7, INPUT_PULLUP);
ekviterm = 3;
}
//###########################################################################################################################
//============================================= VÝPOČET EKVITERMNÍ KŘIVKY ===================================================
int vypocet_krivky(float teplota_venkovni_teplota){
lcd.setCursor(0, 0);
lcd.print("kriv");
Serial.print("venk teplota ");
Serial.println(teplota_venkovni_teplota);
float teplota;
float koeficient;
//int pozadovana_teplota;
teplota = teplota_venkovni_teplota;
teplota = 20 - teplota;
switch (ekviterm) {
case 0:
break;
case 1:
koeficient = 3.5;
break;
case 2:
koeficient = 3;
break;
case 3:
koeficient = 2.6;
break;
case 4:
koeficient = 2.3;
break;
case 5:
koeficient = 2;
break;
case 6:
koeficient = 1.6;
break;
case 7:
koeficient = 1.4;
break;
case 8:
koeficient = 1.2;
break;
case 9:
koeficient = 1;
break;
}
if (ekviterm != 0) {
pozadovana_teplota = teplota * koeficient + 22;
return pozadovana_teplota;
}
}
//=========================================== ČTENÍ DAT Z NEXTION ===========================================================
int cteni_dat_lcd() {
zprava_lcd = swSerial.read(); //Načte znak z lcd do cteni_dat_lcdpromněné zprava_lcd
data_lcd = zprava_lcd.toInt(); //Převede znak na číslo
return data_lcd;
}
//============================================ OTEVŘI ESBE RADIÁTORY ==========================================================
int servo_radiatory_open() {
lcd.setCursor(0, 0);
lcd.print("sro ");
if (poloha_serva_radiatory < 100) {
digitalWrite (pin_servo_radiatory_close, LOW); //Zastav zavírání esbe topení
rele_rad_close = 0;
delay(200);
if (rele_rad_close == 0) {
digitalWrite (pin_servo_radiatory_open, HIGH); //Otevři esbe topení o 1%
rele_rad_open = 1;
delay (1200);
digitalWrite (pin_servo_radiatory_open, LOW); //Zastav otevírání esbe topení
rele_rad_open = 0;
}
}
poloha_serva_radiatory_analog = analogRead(pin_poloha_serva_radiatory); //čte hodnotu polohy serva 0 až 1023
poloha_serva_radiatory = map(poloha_serva_radiatory_analog, servo_radiatory_max, servo_radiatory_min, 100, 0); //převede polohu 0 až 1023 na 0 až 100%
return poloha_serva_radiatory;
}
//============================================ ZAVŘI ESBE RADIÁTORY ==========================================================
int servo_radiatory_close() {
lcd.setCursor(0, 0);
lcd.print("src ");
if (poloha_serva_radiatory > 0) {
digitalWrite (pin_servo_radiatory_open, LOW); //Zastav otevírání esbe topení
rele_rad_open = 0;
delay(200);
if (rele_rad_open == 0) {
digitalWrite (pin_servo_radiatory_close, HIGH); //Zavři esbe topení o 1%
rele_rad_close = 1;
delay (1200);
digitalWrite (pin_servo_radiatory_close, LOW); //Zastav zavírání esbe topení
rele_rad_close = 0;
}
}
poloha_serva_radiatory_analog = analogRead(pin_poloha_serva_radiatory); //čte hodnotu polohy serva 0 až 1023
poloha_serva_radiatory = map(poloha_serva_radiatory_analog, servo_radiatory_max, servo_radiatory_min, 100, 0); //převede polohu 0 až 1023 na 0 až 100%
return poloha_serva_radiatory;
}
//=========================================== TOPENÍ Z AKU NÁDOBY ===========================================================
void topeni_z_aku() {
lcd.setCursor(0, 0);
lcd.print("TzA ");
delay(100);
int mil;
if (servo_aku == 1) { //jeli servo v automatickém režimu 1-automatický režim, 2-ruční režim
pozadovana_poloha_serva_aku = 0; // požadovaná poloha serva je 0%
Serial.println("servo aku top");
}
poloha_serva_aku = nastav_servo_aku (pozadovana_poloha_serva_aku);
if ((millis() - stary_cas1) > 900000) { //15 minut
stary_cas1 = millis();
topeni_z_akumulace = 1;
}
if (topeni_z_akumulace == 2 or topeni_z_akumulace == 1) { //Probíhá topení z aku
if (stav_cerpadla_radiatory == 0) { //Pokud je čerpadlo topení vypnuto
digitalWrite (pin_cerpadlo_radiatory, HIGH); //Zapni čerpadlo topení
stav_cerpadla_radiatory = 1; //Čerpadlo topení je zapnuto auto
Serial.print("Ekviterm ");
Serial.println(ekviterm);
}
if (ekviterm > 0) {
pozadovana_teplota_topeni = vypocet_krivky(teplota_venkovni_teplota);
//vypocet_krivky(); //volání podprogramu pro výpočet ekvitermní křivky
//Zmnění teplotu do radiátorů podle venkovní teploty - pootevře servo
mil = millis() - dynamika_stary_cas;
if ((millis() - dynamika_stary_cas) > (dynamika_serv * 1000)) {
if (teplota_privod_radiatory < (pozadovana_teplota_topeni - hystereze)) {
poloha_serva_radiatory = servo_radiatory_open();
Serial.println(pozadovana_teplota_topeni - hystereze);
}
// dynamika_stary_cas = millis();
//}
//Zmnění teplotu do radiátorů podle venkovní teploty - přivře servo
//if ((millis() - dynamika_stary_cas) > (dynamika_serv * 1000)) {
if (teplota_privod_radiatory > (pozadovana_teplota_topeni + hystereze)) {
poloha_serva_radiatory = servo_radiatory_close();
}
//nastav_servo_radiatory ();
dynamika_stary_cas = millis();
Serial.println(pozadovana_teplota_topeni - hystereze);
Serial.print("tep radiátory");
Serial.println(teplota_privod_radiatory);
}
}
Serial.print("požad tep top ");
Serial.println(pozadovana_teplota_topeni);
Serial.print("dynamika_stary_cas ");
Serial.println(dynamika_stary_cas);
Serial.println(mil);
}
}
//=========================================== TOPENÍ Z UHELNÉHO KOTLE DO AKU NÁDOBY ============================================
void topeni_do_aku() {
lcd.setCursor(0, 0);
lcd.print("TdA ");
//Pokud esbe aku není otevřeno do aku na 100%
if (prehrati != 1) { //pokud není aktivní přehřátí
if (servo_radiatory == 1) { //jeli servo v auwordtomatickém režimu 1-automatický režim, 2-ruční režim
pozadovana_poloha_serva_radiatory = 0; //požadovaná poloha serva je zavřeno
}
if (servo_aku == 1) { //jeli servo v automatickém režimu 1-automatický režim, 2-ruční režim
pozadovana_poloha_serva_aku = 0; //50% požadovaná poloha serva je otevřeno na 50%
}
poloha_serva_aku = nastav_servo_aku (pozadovana_poloha_serva_aku);
poloha_serva_radiatory = nastav_servo_radiatory (pozadovana_poloha_serva_radiatory);
if (stav_cerpadla_radiatory == 1) { //Pokud je čerpadlo topení zapnuto auto
digitalWrite (pin_cerpadlo_radiatory, LOW); //Vypni čerpadlo topení
stav_cerpadla_radiatory = 0; //Čerpadlo topení je vypnuto
}
}
//Přehřátí kotle
if (teplota_kotel_vystup > havarijni_teplota) { //&& prehrati == false) { //Pokud je teplota kotle větší než 80°C
prehrati = true;
swSerial.print("page0.gVystraha.en=1");
zapis_nextion();
swSerial.print ("page0.wav0.en=1");
zapis_nextion();
if (servo_radiatory == 1) { //jeli servo v automatickém režimu
pozadovana_poloha_serva_radiatory = 100; //požadovaná poloha serva je otevřeno na 100%
}
if (servo_aku == 1) { //jeli servo v automatickém režimu
pozadovana_poloha_serva_aku = 95; //požadovaná poloha serva je otevřeno na 95%
}
poloha_serva_radiatory = nastav_servo_radiatory (pozadovana_poloha_serva_radiatory);
poloha_serva_aku = nastav_servo_aku (pozadovana_poloha_serva_aku);
if (stav_cerpadla_radiatory = 0) { //Pokud je čerpadlo topení vypnuto
digitalWrite (pin_cerpadlo_radiatory, HIGH); //Zapni čerpadlo topení
stav_cerpadla_radiatory = 1; //Čerpadlo topení je zapnuto auto
}
}
//Konec přehřátí
if (prehrati == true && teplota_kotel_vystup < 75) { //Pokud je teplota kotle nižší než 75°C
prehrati = false;
swSerial.print("page0.g0.en=0");
zapis_nextion();
swSerial.print ("page0.wav0.en=0");
zapis_nextion();
if (stav_cerpadla_radiatory = 1) { //Pokud je čerpadlo topení zapnuto
digitalWrite (pin_cerpadlo_radiatory, LOW); //Vypni čerpadlo topení
stav_cerpadla_radiatory = 0; //Čerpadlo topení je vypnuto auto
}
}
//Nedostatečná teplota pro nahřátí aku nádoby
//Nádoba je natopena
if (teplota_akumulacka_spodek > pozadovana_teplota_aku_spodek or teplota_akumulacka_spodek >= teplota_kotel_vystup){ //akumulační nádoba natopen na požadovanou teplotu
if (servo_radiatory == 1) { //jeli servo v automatickém režimu
pozadovana_poloha_serva_radiatory = 100; //požadovaná poloha serva je otevřeno na 100%
}
if (servo_aku == 1) { //jeli servo v automatickém režimu
pozadovana_poloha_serva_aku = 50; // 50% požadovaná poloha serva je otevřeno na 50%
}
poloha_serva_radiatory = nastav_servo_radiatory (pozadovana_poloha_serva_radiatory);
poloha_serva_aku = nastav_servo_aku (pozadovana_poloha_serva_aku);
if (stav_cerpadla_radiatory == 0) { //Pokud je čerpadlo topení vypnuto
digitalWrite (pin_cerpadlo_radiatory, HIGH); //Zapni čerpadlo topení
stav_cerpadla_radiatory = 1; //Čerpadlo topení je zapnuto auto
}
}
}
//============================================= TOPENÍ Z UHELNÉHO KOTLE DO RADIÁTORŮ =========================================
void topeni_do_radiatoru() { //Topení z uhelného kotle do radiátorů
lcd.setCursor(0, 0);
lcd.print("TdR ");
if (teplota_kotel_vystup < havarijni_teplota && prehrati == false) { //Pokud je teplota kotle menší než 80°C
//Serial.println("přehřátí k do r");
//Otevře esbe radiátory na 100%
if (servo_radiatory == 1) { //jeli servo v automatickém režimu
pozadovana_poloha_serva_radiatory = 100; //požadovaná poloha serva je otevřeno na 100%
}
if (servo_aku == 1) { //jeli servo v automatickém režimu
pozadovana_poloha_serva_aku = 0; //požadovaná poloha serva je otevřeno na 0%
}
poloha_serva_radiatory = nastav_servo_radiatory (pozadovana_poloha_serva_radiatory);
poloha_serva_aku = nastav_servo_aku (pozadovana_poloha_serva_aku);
}
//nastav_servo_radiatory ();
//Přehřátí kotle
if (teplota_kotel_vystup > havarijni_teplota) { //&& prehrati == false) { //Pokud je teplota kotle větší než 80°C
prehrati = true;
Serial.println("přehřátí k do r");
swSerial.print("page0.g0.en=1");
zapis_nextion();
swSerial.print ("page0.wav0.en=1");
zapis_nextion();
if (servo_radiatory == 1) { //jeli servo v automatickém režimu
pozadovana_poloha_serva_radiatory = 100;
}
if (servo_aku == 1) { //jeli servo v automatickém režimu
pozadovana_poloha_serva_aku = 95;
}
poloha_serva_radiatory = nastav_servo_radiatory (pozadovana_poloha_serva_radiatory);
poloha_serva_aku = nastav_servo_aku (pozadovana_poloha_serva_aku);
if (stav_cerpadla_radiatory == 0) { //Pokud je čerpadlo topení vypnuto
digitalWrite (pin_cerpadlo_radiatory, HIGH); //Zapni čerpadlo topení
stav_cerpadla_radiatory = 1; //Čerpadlo topení je zapnuto auto
}
}
if (prehrati == true && teplota_kotel_vystup < 75) { //Pokud je teplota kotle včtší než 80°C
prehrati = false;
if (stav_cerpadla_radiatory == 1){
digitalWrite (pin_cerpadlo_radiatory, HIGH);
stav_cerpadla_radiatory = 0;
}
Serial.println("konec přehřátí k do r");
swSerial.print("page0.g0.en=0");
zapis_nextion();
swSerial.print ("page0.wav0.en=0");
zapis_nextion();
}
}
//============================================ LCD PRINT ===================================================
void lcd_print() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("zav");
lcd.setCursor(4, 0);
lcd.print(teplota_akumulacka_vrch);
lcd.setCursor(10, 0);
lcd.print("anS ");
lcd.print(teplota_akumulacka_spodek);
lcd.setCursor(0, 1);
lcd.print("rad ");
lcd.setCursor(4, 1);
lcd.print(teplota_privod_radiatory);
lcd.setCursor(10, 1);
lcd.print("tuv ");
lcd.setCursor(14, 1);
lcd.print(teplota_bojler_maly);
lcd.setCursor(0, 2);
lcd.print("ven ");
lcd.setCursor(4, 2);
lcd.print(teplota_venkovni_teplota);
lcd.setCursor(11, 2);
lcd.print("kot ");
lcd.setCursor(15, 2);
lcd.print(teplota_kotel_vystup);
lcd.setCursor(0, 3);
lcd.print("seR ");
lcd.setCursor(4, 3);
lcd.print(poloha_serva_radiatory);
lcd.setCursor(8, 3);
lcd.print("%");
lcd.setCursor(11, 3);
lcd.print("seA ");
lcd.setCursor(15, 3);
lcd.print(poloha_serva_aku);
lcd.setCursor(18, 3);
lcd.print("%");
}
//============================================ NASTAV ESBE RADIATORY ===========================================================
int nastav_servo_radiatory (int pozadovana_poloha_serva_radiatory) {
unsigned long stary_cas;
stary_cas = millis();
Serial.print("poz.pol.ser.rad");
Serial.println(pozadovana_poloha_serva_radiatory);
//Otvírání serva
poloha_serva_radiatory_analog = analogRead(pin_poloha_serva_radiatory); //čte hodnotu polohy serva 0 až 1023
poloha_serva_radiatory = map(poloha_serva_radiatory_analog, servo_radiatory_max, servo_radiatory_min, 100, 0); //převede polohu 0 až 1023 na 0 až 100%
if (poloha_serva_radiatory < pozadovana_poloha_serva_radiatory) { //Pokud není esbe zavřeno do aku
digitalWrite (pin_servo_radiatory_close, LOW); //Zastav zavírání esbe radiátory
rele_rad_close = 0;
delay (200);
do {
if (rele_rad_close == 0) {
digitalWrite (pin_servo_radiatory_open, HIGH); //Otevři esbe topení
rele_rad_open = 1;
poloha_serva_radiatory_analog = analogRead(pin_poloha_serva_radiatory); //čte hodnotu polohy serva 0 až 1023
poloha_serva_radiatory = map(poloha_serva_radiatory_analog, servo_radiatory_max, servo_radiatory_min, 100, 0); //převede polohu 0 až 1023 na 0 až 100%
//Zobrazí polohu trojcestného serva okruh radiátorů
zprava = "page0.n6.val=\"";
zprava += poloha_serva_radiatory;
zprava += "\"";
swSerial.print(zprava);
zapis_nextion();
lcd_print();
}
if ((millis() - stary_cas) > 240000) { //4 minuty
break;
}
} while (poloha_serva_radiatory < pozadovana_poloha_serva_radiatory);
digitalWrite (pin_servo_radiatory_open, LOW); //Zastav otevírání esbe topení
rele_rad_open = 0;
}
//Zavírání serva
if (poloha_serva_radiatory > pozadovana_poloha_serva_radiatory) { //Pokud není esbe zavřeno do aku
digitalWrite (pin_servo_radiatory_open, LOW); //Zastav otvírání esbe radiátory
rele_rad_open = 0;
delay (200);
do {
if (rele_rad_open == 0) {
digitalWrite (pin_servo_radiatory_close, HIGH); //Zavři esbe topení
rele_rad_close = 1;
poloha_serva_radiatory_analog = analogRead(pin_poloha_serva_radiatory); //čte hodnotu polohy serva 0 až 1023
poloha_serva_radiatory = map(poloha_serva_radiatory_analog, servo_radiatory_max, servo_radiatory_min, 100, 0); //převede polohu 0 až 1023 na 0 až 100%
//Zobrazí polohu trojcestného serva okruh radiátorů
zprava = "page0.n6.val=\"";
zprava += poloha_serva_radiatory;
zprava += "\"";
swSerial.print(zprava);
zapis_nextion();
lcd_print();
Serial.print("pol.ser.rad close ");
Serial.println(poloha_serva_radiatory);
}
if ((millis() - stary_cas) > 240000) { //4 minuty
break;
}
} while (poloha_serva_radiatory < pozadovana_poloha_serva_radiatory);
digitalWrite (pin_servo_radiatory_close, LOW); //Zastav zavírání esbe topení
rele_rad_close = 0;
}
return poloha_serva_radiatory;
}
//============================================ NASTAV ESBE AKUMULAČNÍ NÁDRŽE ===================================================
int nastav_servo_aku (int pozadovana_poloha_serva_aku) {
unsigned long stary_cas;
stary_cas = millis();
Serial.print("pož.pol.ser.aku");
Serial.println(pozadovana_poloha_serva_aku);
//Otvírání serva
poloha_serva_aku_analog = analogRead(pin_poloha_serva_aku); //čte hodnotu polohy serva 0 až 1023
poloha_serva_aku = map(poloha_serva_aku_analog, servo_aku_max, servo_aku_min, 100, 0); //převede polohu 0 až 1023 na 0 až 100%
if (poloha_serva_aku < pozadovana_poloha_serva_aku) {
digitalWrite (pin_servo_aku_close, LOW); //Zastav zavírání esbe aku
rele_aku_close = 0;
delay (200);
do {
if (rele_aku_close == 0) {
digitalWrite (pin_servo_aku_open, HIGH); //Otevři esbe aku
rele_aku_open = 1;
poloha_serva_aku_analog = analogRead(pin_poloha_serva_aku); //čte hodnotu polohy serva 0 až 1023
poloha_serva_aku = map(poloha_serva_aku_analog, servo_aku_max, servo_aku_min, 100, 0); //převede polohu 0 až 1023 na 0 až 100%
//Zobrazí polohu trojcestného serva okruh aku nádoby
zprava = "page0.n4.val=\"";
zprava += poloha_serva_aku;
zprava += "\"";
swSerial.print(zprava);
zapis_nextion();
lcd_print();
}
Serial.print("pol.ser.aku open ");
Serial.println(poloha_serva_aku);
if ((millis() - stary_cas) > 240000) { //4 minuty
break;
}
} while (poloha_serva_aku < pozadovana_poloha_serva_aku);
digitalWrite (pin_servo_aku_open, LOW); //Zastav otevírání esbe aku
rele_aku_open = 0;
}
//Zavírání serva
if (poloha_serva_aku > pozadovana_poloha_serva_aku) {
digitalWrite (pin_servo_aku_open, LOW); //Zastav otvírání esbe aku
rele_aku_open = 0;
delay (200);
do {
if (rele_aku_open == 0) {
digitalWrite (pin_servo_aku_close, HIGH); //Zavři esbe aku
rele_aku_close = 1;
poloha_serva_aku_analog = analogRead(pin_poloha_serva_aku); //čte hodnotu polohy serva 0 až 1023
poloha_serva_aku = map(poloha_serva_aku_analog, servo_aku_max, servo_aku_min, 100, 0); //převede polohu 0 až 1023 na 0 až 100%
//Zobrazí polohu trojcestného serva okruh aku nádoby
zprava = "page0.n6.val=\"";
zprava += poloha_serva_aku;
zprava += "\"";
swSerial.print(zprava);
zapis_nextion();
lcd_print();
}
Serial.print("pol.ser.aku close ");
Serial.println(poloha_serva_aku);
if ((millis() - stary_cas) > 240000) { //4 minuty
break;
}
} while (poloha_serva_aku > pozadovana_poloha_serva_aku);
digitalWrite (pin_servo_aku_close, LOW); //Zastav zavírání esbe aku
rele_aku_close = 0;
}
return poloha_serva_aku;
}
//============================================ POTVRZENÍ ZÁPISU NA DISPLEJ =================================================
void zapis_nextion() {
swSerial.write(0xff);
swSerial.write(0xff);
swSerial.write(0xff);
}
//=============================================== OHŘEV TUV Z UHELNÉHO KOTLE ===================================================
void ohrev_tuv() {
lcd.setCursor(0, 0);
lcd.print("tuv");
ohrev_bojleru = true; //Probíhá ohřev tuv
Serial.print("oh boj ");
Serial.println(ohrev_bojleru);
rozdil = 0; //Nastaví vypínací teplotu pro ohřev tuv na požadovanout teplotu tuv
//Otevře esbe radiátory na 100%
if (prehrati !=1) {
if (servo_radiatory == 1) { //jeli servo v automatickém režimu
pozadovana_poloha_serva_radiatory = 100; //požadovaná poloha serva je otevřeno na 100%
}
if (servo_aku == 1) { //jeli servo v automatickém režimu
pozadovana_poloha_serva_aku = 100; //požadovaná poloha serva je otevřeno na 100%
}
poloha_serva_radiatory = nastav_servo_radiatory (pozadovana_poloha_serva_radiatory);
poloha_serva_aku = nastav_servo_aku (pozadovana_poloha_serva_aku);
}
//Pust čerpadlo topení
if (stav_cerpadla_radiatory == 0) { //Pokud je čerpadlo topení vypnuto
digitalWrite (pin_cerpadlo_radiatory, HIGH); //Zapni čerpadlo topení
stav_cerpadla_radiatory = 1; //Čerpadlo topení je zapnuto auto
}
if (stav_serva_bojler == 0) {
digitalWrite(pin_servo_bojler_m, HIGH); //Otevře servo ohřevu tuv
stav_serva_bojler = 1; //Servo ohřevu tuv je zapnuto auto
}
Serial.print("čerp rad ");
Serial.println(stav_cerpadla_radiatory);
Serial.print("servo boj ");
Serial.println(stav_serva_bojler);
//Přehřátí kotle
if (teplota_kotel_vystup > havarijni_teplota && prehrati != 1) { //Pokud je teplota kotle větší než 80°C
prehrati = 1;
swSerial.print("page0.gVystraha.en=1");
zapis_nextion();
swSerial.print ("page0.wav0.en=1");
zapis_nextion();
Serial.println("přehřátí tuv");
if (servo_aku == 1) { //jeli servo v automatickém režimu
pozadovana_poloha_serva_aku = 95; //požadovaná poloha serva je otevřeno na 95%
}
poloha_serva_aku = nastav_servo_aku (pozadovana_poloha_serva_aku);
}
if (prehrati == 1 && teplota_kotel_vystup < 73) {
Serial.println("přeh konec");
prehrati = 0;
swSerial.print("page0.gVystraha.en=0");
zapis_nextion();
swSerial.print ("page0.wav0.en=0");
zapis_nextion();
if (servo_aku == 1) { //jeli servo v automatickém režimu
pozadovana_poloha_serva_aku = 100; //požadovaná poloha serva je otevřeno na 100%
}
poloha_serva_aku = nastav_servo_aku (pozadovana_poloha_serva_aku);
}
//Ukončení ohřevu tuv
if (teplota_bojler_maly > (pozadovana_teplota_tuv - 2)) { //Teplota bojleru je větší než požadovaná ponížená o 2°C
if (stav_cerpadla_radiatory == 1) { //Pokud je čerpadlo topení zapnuto auto
digitalWrite (pin_cerpadlo_radiatory, LOW); //Vypni čerpadlo topení
stav_cerpadla_radiatory = 0; //Čerpadlo topení je vypnuto
}
digitalWrite(pin_servo_bojler_m, LOW); //Zavře servo ohřevu tuv
stav_serva_bojler = 0; //Servo ohřevu tuv je vypnuto auto
ohrev_bojleru = false; //Ohřev tuv ukončen
rozdil = 10; //Nastaví spínací teplotu pro ohřev tuv
Serial.println("konec tuv 1");
}
if ((teplota_privod_radiatory -2) < teplota_bojler_maly) {
if (stav_cerpadla_radiatory == 1) { //Pokud je čerpadlo topení zapnuto auto
digitalWrite (pin_cerpadlo_radiatory, LOW); //Vypni čerpadlo topení
stav_cerpadla_radiatory = 1; //Čerpadlo topení je vypnuto
}
digitalWrite(pin_servo_bojler_m, LOW); //Zavře servo ohřevu tuv
stav_serva_bojler = 0; //Servo ohřevu tuv je vypnuto auto
ohrev_bojleru = false; //Ohřev tuv ukončen
rozdil = 10;
Serial.println("konec tuv 2");
}
}
//============================================ ZAVŘI ESBE AKUMULAČNÍ NÁDRŽE ====================================================
int servo_aku_close() {
digitalWrite (pin_servo_aku_open, LOW); //Zastav otevírání esbe aku
rele_aku_open = 0;
delay (200);
if (rele_aku_open == 0) {
digitalWrite (pin_servo_aku_close, HIGH); //Zavři esbe aku z kotle do aku o 1%
rele_aku_close = 1;
delay (1200);
digitalWrite (pin_servo_aku_close, LOW); //Zastav zavírání esbe aku
rele_aku_close = 0;
}
poloha_serva_aku_analog = analogRead(pin_poloha_serva_aku); //čte hodnotu polohy serva 0 až 1023
poloha_serva_aku = map(poloha_serva_aku_analog, servo_aku_max, servo_aku_min, 100, 0); //převede polohu 0 až 1023 na 0 až 100%
return poloha_serva_aku;
}
//============================================ OTEVŘI ESBE AKUMULAČNÍ NÁDRŽE ====================================================
int servo_aku_open() {
digitalWrite (pin_servo_aku_close, LOW); //Zastav zavírání esbe aku
rele_aku_close = 0;
delay (200);
if (rele_aku_close == 0) {
digitalWrite (pin_servo_aku_open, HIGH); //Otevři esbe aku z kotle do aku o 1%
rele_aku_open = 1;
delay (1200);
digitalWrite (pin_servo_aku_open, LOW); //Zastav otevírání esbe aku
rele_aku_open = 0;
}
poloha_serva_aku_analog = analogRead(pin_poloha_serva_aku); //čte hodnotu polohy serva 0 až 1023
poloha_serva_aku = map(poloha_serva_aku_analog, servo_aku_max, servo_aku_min, 100, 0); //převede polohu 0 až 1023 na 0 až 100%
return poloha_serva_aku;
}
//###########################################################################################################################
//============================================== LOOP ==========================================================================
void loop() {
//----------------------------------------------------------------------
//--------------čtení dat z teplotních čidel ---------------------------
//----------------------------------------------------------------------
kotel_vystup.requestTemperatures(); //žádost o teplotu
akumulacka_vrch.requestTemperatures(); //žádost o teplotu
akumulacka_spodek.requestTemperatures(); //žádost o teplotu
privodni_portubi.requestTemperatures(); //žádost o teplotu
privod_radiatory.requestTemperatures(); //žádost o teplotu
zpatecka_radiatory.requestTemperatures(); //žádost o teplotu
//bojler_velky.requestTemperatures(); //žádost o teplotu
bojler_maly.requestTemperatures(); //žádost o teplotu
venkovni_teplota.requestTemperatures(); //žádost o teplotu
teplota_kotel_vystup = kotel_vystup.getTempCByIndex(0); // načtení informací z čidla na daném pinu
teplota_akumulacka_vrch = akumulacka_vrch.getTempCByIndex(0); // načtení informací z čidla na daném pinu
teplota_akumulacka_spodek = akumulacka_spodek.getTempCByIndex(0); // načtení informací z čidla na daném pinu
teplota_privodni_portubi = privodni_portubi.getTempCByIndex(0); // načtení informací z čidla na daném pinu
teplota_privod_radiatory = privod_radiatory.getTempCByIndex(0); // načtení informací z čidla na daném pinu
teplota_zpatecka_radiatory = zpatecka_radiatory.getTempCByIndex(0); // načtení informací z čidla na daném pinu
//teplota_bojler_velky = bojler_velky.getTempCByIndex(0); // načtení informací z čidla na daném pinu
teplota_bojler_maly = bojler_maly.getTempCByIndex(0); // načtení informací z čidla na daném pinu
teplota_venkovni_teplota = venkovni_teplota.getTempCByIndex(0); // načtení informací z čidla na daném pinu
// Zjištění aktuální polohy serva radiátory
poloha_serva_radiatory_analog = analogRead(pin_poloha_serva_radiatory); //čte hodnotu polohy serva 0 až 1023
poloha_serva_radiatory = map(poloha_serva_radiatory_analog, servo_radiatory_max, servo_radiatory_min, 100, 0); //převede polohu 0 až 1023 na 0 až 100%
// Zjištění aktuální polohy serva aku
poloha_serva_aku_analog = analogRead(pin_poloha_serva_aku); //čte hodnotu polohy serva 0 až 1023
poloha_serva_aku = map(poloha_serva_aku_analog, servo_aku_max, servo_aku_min, 100, 0); //převede polohu 0 až 1023 na 0 až 100%
if (digitalRead(pin_cerpadlo_kotle_in) == LOW) {
cerpadlo_kotle = 0;
}
else{
cerpadlo_kotle = 1;
}
if (digitalRead(pin_pokojovy_termostat) == LOW) {
termostat = 1;
}
else{
termostat = 0;
}
//byte plyn_kotel = digitalRead(pin_blokace_plynu);
//-------------------------------------------------------------------
//------------------ Zápis dat do nextion lcd -----------------------
//-------------------------------------------------------------------
//Zobrazení teploty na výstupu z kotle
zprava = "page0.tKotelVystup.txt=\""; //zapíše text do promněnné
zprava += teplota_kotel_vystup; //přidá aktuální teplotu
zprava += " C\""; //ukončí textem C
swSerial.print(zprava); //odešle zprávu do lcd nextion
zapis_nextion(); //odešle potvrzení pro lcd }nextion (3X 0xFF)
Serial.println(zprava);
delay(50);
//Zobrazení venkovní teploty
zprava = "page0.tVenek.txt=\"";
zprava += teplota_venkovni_teplota;
zprava += " C\"";
swSerial.print(zprava);
zapis_nextion();
Serial.println(zprava);
delay(50);
//Zobrazení teploty na přívodo do aku nádoby
zprava = "page0.tPotrubiPrivod.txt=\"";
zprava += teplota_privodni_portubi;
zprava += " C\"";
swSerial.print(zprava);
zapis_nextion();
Serial.println(zprava);
delay(50);
//Zobrazení teploty ve vrchní části aku nádoby
zprava = "page0.tAkuVrch.txt=\"";
zprava += teplota_akumulacka_vrch;
zprava += " C\"";
swSerial.print(zprava);
zapis_nextion();
Serial.println(zprava);
delay(50);
//Zobrazení teploty ve spodní části aku nádoby
zprava = "page0.tAkuSpodek.txt=\"";
zprava += teplota_akumulacka_spodek;
zprava += "C\"";
swSerial.print(zprava);
zapis_nextion();
Serial.println(zprava);
delay(50);
//Zobrazení teploty do radiátorů
zprava = "page0.tRadiatory.txt=\"";
zprava += teplota_privod_radiatory;
zprava += " C\"";
swSerial.print(zprava);
zapis_nextion();
Serial.println(zprava);
delay(50);
//Zobrazení teploty zpátečky do kotle
zprava = "page0.tZpatecka.txt=\"";
zprava += teplota_zpatecka_radiatory;
zprava += " C\"";
swSerial.print(zprava);
zapis_nextion();
Serial.println(zprava);
delay(50);
//Zobrazí teplotu bojleru
zprava = "page0.tBojler.txt=\"";
zprava += teplota_bojler_maly;
zprava += "C\"";
swSerial.print(zprava);
zapis_nextion();
Serial.println(zprava);
delay(50);
//Jestli je pokojový termostat vypnut zobruzí text OFF
//Jestli je pokojový termostat zapnut zobruzí text ON
if (digitalRead(pin_pokojovy_termostat) == HIGH) {
zprava = "page0.tTermostat.txt=\"OFF\"";
swSerial.print(zprava);
zapis_nextion();
Serial.println(zprava);
delay(50);
}
if (digitalRead(pin_pokojovy_termostat) == LOW){
zprava = "page0.tTermostat.txt=\"ON\"";
swSerial.print(zprava);
zapis_nextion();
Serial.println(zprava);
delay(50);
}
//Jestli je čerpadlo kotle zapnuté změní text na zelenou odešle text ON
//Jestli je čerpadlo kotle vypnuté změní text na červenou odešle text OFF
if (digitalRead(pin_cerpadlo_kotle_in) == LOW){
swSerial.print("page0.tCerpKotel.pco=13572"); //Změní text na zelenou
zapis_nextion();
//Zobrazí polohu trojcestného serva okruh radiátorů
zprava = "page0.tm0.en=1";
swSerial.print(zprava);
zapis_nextion();
zprava = "page0.tCerpKotel.txt=\"ON\"";
swSerial.print(zprava);
zapis_nextion();
Serial.println(zprava);
delay(50);
}
if (digitalRead(pin_cerpadlo_kotle_in) == HIGH){
swSerial.print("page0.tCerpKotel.pco=63521"); //Změní text na červenou
zapis_nextion();
zprava = "page0.tCerpKotel.txt=\"OFF\"";
swSerial.print(zprava);
zapis_nextion();
Serial.println(zprava);
delay(50);
//Zruší zobrazení hořících plamenů na kotli
zprava = "page0.tm0.en=0";
swSerial.print(zprava);
zapis_nextion();
zprava = "page0.pPlamen.pic=21";
swSerial.print(zprava);
zapis_nextion();
}
//Jestli je čerpadlo radiátorů zapnuté změní text na zelenou odešle text ON
//Jestli je čerpadlo radiátorů vypnuté změní text na červenou odešle text OFF
if (stav_cerpadla_radiatory == 1) {
swSerial.print("page0.tCerpRadiatory.pco=13572"); //Změní text na zelenou
zapis_nextion();
//Zobrazení hořících plamenů na kotli
swSerial.print("page0.p2.pic=6");
zapis_nextion();
zprava = "page0.tCerpRadiatory.txt=\"ON\"";
Serial.println(zprava);
delay(50);
}
else if (stav_cerpadla_radiatory == 0) {
swSerial.print("page0.tCerpRadiatory.pco=63521"); //Změní text na červenou
zapis_nextion();
swSerial.print("page0.p2.pic=5");
zapis_nextion();
zprava = "page0.tCerpRadiatory.txt=\"OFF\"";
Serial.println(zprava);
delay(50);
}
swSerial.print(zprava);
zapis_nextion();
//Zobrazí polohu trojcestného serva okruh radiátorů
zprava = "page0.n6.val=";
zprava += poloha_serva_radiatory;
//zprava += "\"";
swSerial.print(zprava);
zapis_nextion();
Serial.println(zprava);
delay(50);
//Zobrazí polohu trojcestného serva okruh aku nádoby
zprava = "page0.n4.val=";
zprava += poloha_serva_aku;
//zprava += "\"";
swSerial.print(zprava);
zapis_nextion();
Serial.println(zprava);
delay(50);
//Jestli je plynový kotel zapnut odešle text ON
//Jestli je plynový kotel vypnut odešle text OFF
if (plyn_kotel == false) {
zprava = "page0.tPlynKotel.txt=\"OFF\"";
}
else {
zprava = "page0.tPlynKotel.txt=\"ON\"";
}
Serial.println(zprava);
delay(50);
swSerial.print(zprava);
zapis_nextion();
//Zobrazí výkonu kotle
zprava = "page0.tVykon.txt=\"";
zprava += vykon;
zprava += " kw\"";
swSerial.print(zprava);
zapis_nextion();
//Zobrazí průtok okruh topení(digitalRead(pin_cerpadlo_kotle_in)
zprava = "page0.tPrutok.txt=\"";
zprava += prutok;
zprava += " l/h\"";
swSerial.print(zprava);
zapis_nextion();
//Zobrazení hořících plamenů na kotli
if (digitalRead(pin_cerpadlo_kotle_in) == LOW) {
zprava = "page0.tm0.en=1";
swSerial.print(zprava);
zapis_nextion();
}
//Zruší zobrazení hořících plamenů na kotli
if (digitalRead(pin_cerpadlo_kotle_in) == HIGH) {
zprava = "page0.tm0.en=0";
swSerial.print(zprava);
zapis_nextion();
zprava = "page0.pPlamen.pic=21";
swSerial.print(zprava);
zapis_nextion();
}
//Zobrazí ohřev bojleru
if (stav_serva_bojler == 1) {
zprava = "page0.t0.txt=\"ON\"";
swSerial.print(zprava);
zapis_nextion();
Serial.println(zprava);
delay(50);
}
else if (stav_serva_bojler == 3) {
zprava = "page0.t0.txt=\"OFF\"";
swSerial.print(zprava);
zapis_nextion();
Serial.println(zprava);
delay(50);
}
Serial.println("výpis nextion");
//---------------------------------------------------------------------
//------------------------- Čtení displeje ----------------------------
//---------------------------------------------------------------------
if (digitalRead(pin_7) == LOW) {
Serial.println("čerpadlo ruč on");
stav_cerpadla_radiatory = 2;
}
if (swSerial.available() > 0) { //Jestli jsou ve vyrovnávací paměti lcd nějaká data
while (swSerial.available()) { //Opakuj dokud jsou ve vyrovnávací paměti lcd nějaká data
data_lcd = cteni_dat_lcd(); //načte číslo stránky z lcd nextion
switch (data_lcd) {
case 65: //65 = page0
data_lcd = cteni_dat_lcd(); //načte ID číslo z lcd nextion
if (data_lcd == 3) { //ID = 3,čerpadlo radiátory
data_lcd = cteni_dat_lcd(); //načte hodnotu z lcd nextion
if (data_lcd == 49) { //čerpadlo radiátory je zapnuto ručně
stav_cerpadla_radiatory = 2; //stav čerpadla radiátorů 0-auto vypnuto, 1-auto zapnuto, 2-ručně zapnuto
swSerial.print("page0.tCerpRadiatory.txt=\"ON\"");
zapis_nextion();
}
if (data_lcd == 48) { //čerpadlo radiátory je vypnuto ručně
stav_cerpadla_radiatory = 0; //stav čerpadla radiátorů 0-auto vypnuto, 1-auto zapnuto, 2-ručně zapnuto
swSerial.print("page0.tCerpRadiatory.txt=\"OFF\"");
zapis_nextion();
}
data_lcd = cteni_dat_lcd(); //načte ID číslo z lcd nextion
if (data_lcd == 42) { //ID = 42,servo bojleru
data_lcd = cteni_dat_lcd(); //načte hodnotu z lcd nextion
if (data_lcd == 49) { //servo bojleru je zapnuto ručně
stav_serva_bojler = 2; //stav serva bojleru 0 vypnuto, 1-auto zapnuto, 2-ručně zapnuto
}
if (data_lcd == 48) { //servo bojleru je vypnuto ručně
stav_serva_bojler = 0; //stav serva bojleru 0 vypnuto, 1-auto zapnuto, 2-ručně zapnuto
}
}
case 66: //66 = page1
data_lcd = cteni_dat_lcd(); //načte ID číslo z lcd nextion
switch (data_lcd) {
case 17: //Teplota aku nastav_servo_aku ();vrch tlačítko-OK
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
pozadovana_teplota_aku_vrch = data_lcd;
case 21: //Teplota aku spodek tlačítko-OK
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
pozadovana_teplota_aku_spodek = data_lcd;
case 24: //Teplota radiátory tlačítko-OK
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
pozadovana_teplota_topeni = data_lcd;
case 27: //Havarijní teplota tlačítko-OK
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
case 30: //Ekviterm tlačítko-OK
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
ekviterm = data_lcd;
case 41: //Teplota TUV tlačítko-OK
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
pozadovana_teplota_tuv = data_lcd;
case 47: //Dynamika esbe tlačítko-OK
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
dynamika_serv = data_lcd;
case 19: //Teplota aku vrch tlačítko-SAVE
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
pozadovana_teplota_aku_vrch = data_lcd;
EEPROM.write (12, pozadovana_teplota_aku_vrch);
case 23: //Teplota aku spodek tlačítko-SAVE
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
pozadovana_teplota_aku_spodek = data_lcd;
EEPROM.write (13, pozadovana_teplota_aku_spodek);
case 26: //Teplota radiátory tlačítko-SAVE
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
pozadovana_teplota_topeni = data_lcd;
EEPROM.write (14, pozadovana_teplota_topeni);
case 29: //Havarijní teplota tlačítko-SAVE
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
havarijni_teplota = data_lcd;
EEPROM.write (15, havarijni_teplota);
case 32: //Ekviterm tlačítko-SAVE
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
ekviterm = data_lcd;
EEPROM.write (11, ekviterm);
case 43: //Teplota TUV tlačítko-SAVE
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
pozadovana_teplota_tuv = data_lcd;
EEPROM.write (16, pozadovana_teplota_tuv);
case 49: //Dynamika esbe tlačítko-SAVE
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
dynamika_serv = data_lcd;
EEPROM.write (17, dynamika_serv);
}
case 67: //67 = page2servo_radiatory_close
data_lcd = cteni_dat_lcd(); //načte ID číslo z lcd nextion
switch (data_lcd) {
case 18: //poloha serva aku nádoby
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
pozadovana_poloha_serva_aku = data_lcd;
servo_aku = 2; //servo je v ručním režimu
case 17: //poloha serva radiátorů
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
pozadovana_poloha_serva_radiatory = data_lcd;
servo_radiatory = 2; //servo je v ručním režimu
case 28: //servo aku auto/řučně
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
servo_aku = data_lcd; //servo je v automatickém režimu servo_aku = 1
case 29: //servo radiátory auto/řučně
data_lcd = cteni_dat_lcd(); //načte data z lcd nextion
servo_radiatory = data_lcd; //servo je v automatickém režimu servo_radiatory = 1
}
}
}
}
Serial.println("čtení nextion");
}
//---------------------------------------------------------------------
//---------------------------- Ohřev TUV ------------------------------
//---------------------------------------------------------------------
Serial.print("poz.tep.tuv ");
Serial.println(pozadovana_teplota_tuv);
Serial.print("rozdíl ");
Serial.println(rozdil);
if (teplota_bojler_maly < (pozadovana_teplota_tuv - rozdil) && digitalRead(pin_cerpadlo_kotle_in) == LOW && (teplota_privod_radiatory + 3) > pozadovana_teplota_tuv ) {
//teplota bojleru je menší než požadovaná ponížená o rozdíl (spínací teplota), je sepnuto čerpadlo kotle, teplota potrubí je větší než
//pežadovaná teplota bojleru
Serial.println("ohrev tuv");
ohrev_tuv();
}
else if (ohrev_bojleru == true) { //Jestli probíhá ohřev tuv
Serial.println("ohrev tuv ELSE");
ohrev_tuv();
//digitalWrite(pin_servo_bojler_m, LOW); //Zavře servo ohřevu tuv
//stav_serva_bojler = 4;
//rozdil = 10; //Nastaví spínací teplotu pro ohřev tuv
//ohrev_bojleru = false; //Ohřev tuv je ukončen
}
//if (stav_serva_bojler == 0) {
// digitalWrite(pin_servo_bojler_m, LOW); //Zavře servo ohřevu tuv ručně
// stav_serva_bojler = 3;
//}
//if (stav_serva_bojler == 2) {
// digitalWrite(pin_servo_bojler_m, HIGH); //Otevře servo ohřevu tuv ručně
// stav_serva_bojler = 3;
//}
//---------------------------------------------------------------------
//---------------- Topení z uhelného kotle do radiátorů ---------------
//---------------------------------------------------------------------
if (digitalRead(pin_pokojovy_termostat) == LOW && digitalRead(pin_cerpadlo_kotle_in) == LOW && ohrev_bojleru == false) {
// je sepnut pokojový termostat, je sepnuto čerpadlo kotle, neprobíhá ohřev tuv
Serial.println("top z uh kot do rad");
Serial.print("oh boj ");
Serial.println(ohrev_bojleru);
topeni_do_radiatoru();
}
//---------------------------------------------------------------------
//-------------------- Topení do akumulační nádoby --------------------
//---------------------------------------------------------------------
if (digitalRead(pin_pokojovy_termostat) == HIGH && digitalRead(pin_cerpadlo_kotle_in) == LOW && ohrev_bojleru == false) {
//je vypnut pokojový termostat, je sepnuto čerpadlo kotle, neprobíhá ohřev tuv
if (teplota_akumulacka_spodek <= teplota_kotel_vystup) {
Serial.println("top do aku");
topeni_do_aku();
}
}
//---------------------------------------------------------------------
//-------------------- Topení z akumulační nádoby ---------------------
//---------------------------------------------------------------------
//Zahájení topení z aku
if (digitalRead(pin_pokojovy_termostat) == LOW && digitalRead(pin_cerpadlo_kotle_in) == HIGH && teplota_akumulacka_vrch > 50 ) {
//je zapnut pokojový termostat, je vypnuto čerpadlo kotle, teplota_akumulacka_vrch je > 50
topeni_z_akumulace = 2; //Topení z aku probíhá, ale čeká se na prohřátí potrubí
Serial.println("top z aku");
topeni_z_aku();
}
//Konec topení z aku
if (topeni_z_akumulace == 1 ) {
if (teplota_privod_radiatory < 40 or digitalRead(pin_pokojovy_termostat) == HIGH) {
topeni_z_akumulace = 0; //Topení z akumulace je vypnuto
Serial.println("konec top z aku");
if (stav_cerpadla_radiatory == 1) { //Pokud je čerpadlo topení zapnuto auto
digitalWrite (pin_cerpadlo_radiatory, LOW); //Vypni čerpadlo topení
stav_cerpadla_radiatory = 0; //Čerpadlo topení je vypnuto
}
}
}
//---------------------------------------------------------------------
//-------------- Přehřátí kotle při ukončeném topení ------------------
//---------------------------------------------------------------------
if (digitalRead(pin_cerpadlo_kotle_in) == HIGH && teplota_kotel_vystup > 65) {
// je vypnut pokojový termostat, je vypnuto čerpadlo kotle, teplota kotle je větší než 65°C
while (teplota_kotel_vystup > 50) {
Serial.println("Přehřátí kotle při ukončeném topení");
kotel_vystup.requestTemperatures(); //žádost o teplotu
teplota_kotel_vystup = kotel_vystup.getTempCByIndex(0); // načtení informací z čidla na daném pinu
//Zobrazení teploty na výstupu z kotle
zprava = "tKotelVystup.txt=\""; //zapíše text do promněnné
zprava += teplota_kotel_vystup; //přidá aktuální teplotu
zprava += " C\""; //ukončí textem C
swSerial.print(zprava); //odešle zprávu do lcd nextion
zapis_nextion();
lcd_print(); //odešle potvrzení pro lcd nextion (3X 0xFF)
if (poloha_serva_radiatory < 50) { //Pokud esbe radiátory není otevřeno na 50%
poloha_serva_radiatory = servo_radiatory_open(); //Otevři esbe topení o 1%
//Zobrazí polohu trojcestného serva okruh radiátorů
zprava = "page0.n6.val=";
zprava += poloha_serva_radiatory;
//zprava += "\"";
swSerial.print(zprava);
zapis_nextion();
if (stav_cerpadla_radiatory == 0); { //Čerpadlo topení je vypnuto auto
digitalWrite (pin_cerpadlo_radiatory, HIGH); //Zapni čerpadlo topení
stav_cerpadla_radiatory = 1 ; //Čerpadlo topení je zapnuto auto
swSerial.print("page0.tCerpRadiatory.pco=13572"); //Změní text na zelenou
zapis_nextion();
swSerial.print("page0.tCerpRadiatory.txt=\"ON\"");
zapis_nextion();
swSerial.print("page0.p2.pic=6");
zapis_nextion();
lcd_print();
}
Serial.println("prehrati pri ukon topeni");
}
if (digitalRead(pin_cerpadlo_kotle_in) == LOW) { //Pokud se spustí čerpadlo kotle ukončí smyčku
break;
}
}
if (stav_cerpadla_radiatory == 1) { //Pokud je čerpadlo zapnuto automaticky
digitalWrite (pin_cerpadlo_radiatory, LOW); //Vypni čerpadlo topení
stav_cerpadla_radiatory = 0; //Čerpadlo topení je vypnuto auto
}
}
//---------------------------------------------------------------------
//-------------- Výpis hodnot na LCD 4x20 -----------------------------
//---------------------------------------------------------------------
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("lop");
lcd.setCursor(4, 0);
lcd.print(teplota_akumulacka_vrch);
lcd.setCursor(10, 0);
lcd.print("anS ");
lcd.print(teplota_akumulacka_spodek);
lcd.setCursor(0, 1);
lcd.print("rad ");
lcd.setCursor(4, 1);
lcd.print(teplota_privod_radiatory);
lcd.setCursor(10, 1);
lcd.print("tuv ");
lcd.setCursor(14, 1);
lcd.print(teplota_bojler_maly);
lcd.setCursor(0, 2);
lcd.print("ven ");
lcd.setCursor(4, 2);
lcd.print(teplota_venkovni_teplota);
lcd.setCursor(11, 2);
lcd.print("kot ");
lcd.setCursor(15, 2);
lcd.print(teplota_kotel_vystup);
lcd.setCursor(0, 3);
lcd.print("seR ");
lcd.setCursor(4, 3);
lcd.print(poloha_serva_radiatory);
lcd.setCursor(8, 3);
lcd.print("%");
lcd.setCursor(11, 3);
lcd.print("seA ");
lcd.setCursor(15, 3);
lcd.print(poloha_serva_aku);
lcd.setCursor(18, 3);
lcd.print("%");
}