Jen pro úplnost přikládám celý kód. Je to zatím testovací verze, takže některé fce jsou tam jen pro simulaci příchozích dat.
Kód: Vybrat vše
// simulace obnovy zobrazovaných hodnot, stavů jednotek, tlačítek, zobrazen testovací panel s časem
// načte a zobrazí čas z webu, umí opravit systémový čas připojeného DS3231
// ***** odeber po testování součásti potřebné pro DS3231, to bude na Arduinu
// vlastní server běží mimo tasker
// !!! dodělej v Arduinu, že pokud nenajde modul času, mělo by se to zobrazit na displeji
// z Arduina pošli float, jinak by jsi nemusel formátovat
// formátování zobrazování desetinných čísel - deklaruj proměnnou jako pole znaků - char test[5];
//sprintf (test,"%04.1f", 8.56); //test - proměnná pro uložení formát. hodnoty, 0 - zást. symbol chybějících znaků do počtu znaků,
//celkem znaků - 4, počet des. míst - 1, f- desetinné číslo
// pozor, v textu HTML kódu se nesmí objevit %, jinak se rozhodí kód stráky, který je dále
// zkuz podobný kód jako pro °C - °C - procento není, použit pro promile
#include <Wire.h>
#include <RTClib.h>
#include <SoftwareSerial.h>
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Hash.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <ezTime.h>
#include <Tasker.h>
SoftwareSerial Slinka1(D7,D8);
Timezone myLocalTime;
Tasker tasker;
RTC_DS3231 rtc; // časový modul DS3231
#define DS3231_I2C_ADDRESS 0x68 // adresa časového modulu DS3231
//******** Přihlašovací údaje k sítím - začátek *****************************
/*
// Přihlášení k iPhone
const char* ssid = "iPhone";
const char* password = "********";
*/
// Přihlášení k TP-Link
const char* ssid = "TP-Link_1C18";
const char* password = "********";
//******** Přihlašovací údaje k sítím - konec *****************************
//******** Deklarace proměnných zobrazovacích polí - začátek **************
//--- Termostat - začátek ------------------------
String zobrazTeplotaVody = "N/A";
String zobrazRezimTermostatu = "N/A";
String zobrazHMezTeplVody = "N/A";
String zobrazDMezTeplVody = "N/A";
String zobrazStavOhrivace = "N/A";
//--- Termostat - konec --------------------------
//--- Osvětlení - začátek ------------------------
String zobrazAktualDimL1 = "N/A";
String zobrazRezimJednotky = "N/A";
//--- Osvětlení - konec --------------------------
//--- Domácnost - začátek ------------------------
String zobrazVnitniTeplota = "N/A";
String zobrazVenkovniTeplota = "N/A";
//--- Domácnost - konec --------------------------
//--- Testování - začátek ------------------------
String internetCas;
//--- Testování - konec --------------------------
//******** Deklarace proměnných zobrazovacích polí - konec ****************
// data načtená z modulu času DS3231
byte den, mesic, hodiny, minuty, sekundy;
int rok;
byte rozsahOdchylky = 10; // zadej o kolik sekund se může čas z DS3231 lišit od času z webu
// prozatimní proměnné
float t = 0.0;
float h = 0.0;
String c;
unsigned long milis = 0;
boolean smazat = true;
byte hod;
byte minu;
byte sec;
char cas [7];
byte RJ = 0;
// Create AsyncWebServer object on port 80
AsyncWebServer server(80);
//********************** Webová stránka - začátek *****************************
// postup pro vytvoření zobrazování aktualizované hodnoty na webu
// v html kódu vytvořit příslušný prvek, musí obsahovat id prvku a identifikátor (<span id="temperature">%TEMPERATURE%</span>)
// vytořit fce setInterval s ID prku pro GET
// v PROCESORU přidat řádky, které spárují identifikátor a proměnnou pro zobrazení na webu
// v sekci route vytvořit obnovovací proceduru s ID prvku a příslušnou proměnnou
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html><html>
<head>
<meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1">
<style>
html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}
.button { background-color: gainsboro; border: 1px darkgrey solid; color: black; width: 80px; height: 40px;
text-decoration: none; font-size: 18px; margin: 2px; cursor: pointer;}
.button:hover {background-color: red; // po najetí myší nad tlačítko}
.button2 {background-color: #77878A; color: red}
</style>
</head>
<body>
<!--<div style="width: 1005px; border: red solid 0px; height: 485px; padding: 2px;">
<iframe style="width: 1000px; height: 500px; margin: 0px; margin-top: -10px" frameborder="0" scrolling="no" src="http://www.zrucnymuz.cz/Panel_kuchyn_web/Panel_kuchyn_2.html">
</iframe>
</div>-->
<div style="width: 1005px; border: blue solid 2px; height: 197px; margin-top: 5px; padding: 2px; font-size: 12px">
<!-- ######################################################## 1. okno AKVA panelu - začátek ########################################################-->
<div style="float: left; width:280px; height: 193px; border: black solid 2px; background-color: #AEEA38">
<div style="background-color: black; width: 25px; height: 188px; color: white; text-align: center; font-weight: bold; font-family: aladin, allan, Arial; font-size: 14px; padding-top: 5px; float: left;">
<span style="font-size: 22px; color: #AEEA38">T</span><br/>E<br/>R<br/>M<br/>O<br/>S<br/>T<br/>A<br/>T
</div>
<div style="border: green solid 0px; width: 157px; height: 155px; margin-left: 0px; float: left; font-family: aladin, allan, Arial; font-weight: bold">
<div style="border: blue solid 0px; width: 157px; height: 100px; margin-left: 5px; margin-top: 5px; float: left; font- family: aladin, allan, Arial; font-weight: bold; text-align: left; ">
<span style="padding-left: 5px;">Režim termostatu</span>
<div>
<a href="/RT/0"><button class="button button2" style="width:140px; color: red;"><span id="ID_rezimtermostatu">%REZIMTERMOSTATU%</span></button></a>
</div>
</div>
<div style="margin: 4px; margin-top: 0px; text-align: left;">
<span style="padding-left: 5px;">Teplota vody</span><br/>
<div style="width: 134px; height: 60px; background-color: black; border: red solid 2px; color:#0899C5; font-size: 40px; font-weight: bold; padding-left: 6px; margin-top: 5px">
<div style=" width: 105px; float: left; text-align: right; margin-right: 5px; padding-top: 10px;" id="ID_teplvody">%TEPLVODY%</div>
<div style="width: 22px; font-size: 18px; float: left; padding-top: 10px;">°C</div>
</div>
</div>
</div>
<div style="border: brown solid 0px; width: 80px; height: 155px; margin-left: 0px; float: left; font-family: aladin, allan, Arial; font-weight: bold">
<div style=" height: 42px; border: red solid 0px; margin-top: 4px; text-align: left;">
<span style="padding-left: 5px;">Horní mez</span><br/>
<button class="button"><div id="ID_hmezteplvody">%HMEZTEPLVODY%</div></button>
</div>
<div style=" height: 42px; border: red solid 0px;margin-top: 22px; text-align: left;">
<span style="padding-left: 5px;">Dolní mez</span><br/>
<button class="button"><div id="ID_dmezteplvody">%DMEZTEPLVODY%</div></button>
</div>
<div style=" height: 42px; border: red solid 0px; margin-top: 22px; text-align: left;">
<span style="padding-left: 5px;">Ohřívač</span><br/>
<div style="width: 86px; height: 32px; background-color: black; border: red solid 2px; color:red; font-size: 18px; font-weight: bold; margin-top: 5px">
<div style=" width: 86px; text-align: center; margin-right: 5px; padding-top: 5px;" id="ID_stavohrivace">%STAVOHRIVACE%</div>
</div>
</div>
</div>
</div>
<!-- ######################################################## 1. okno AKVA panelu - konec ##########################################################-->
<!-- ######################################################## 2. okno AKVA panelu - začátek ##########################################################-->
<div style="float: left; width:270px; height: 193px; border: black solid 2px; background-color: #A9EFFB; margin-left: 5px;">
<div style="background-color: black; width: 25px; height: 188px; color: white; text-align: center; font-weight: bold; font-family: aladin, allan, Arial; font-size: 14px; padding-top: 5px; float: left;">
<span style="font-size: 22px; color:#A9EFFB">O</span><br/>S<br/>V<br/>Ě<br/>T<br/>L<br/>E<br/>N<br/>Í
</div>
<div style="border: green solid 0px; width: 157px; height: 155px; margin-left: 0px; float: left; font-family: aladin, allan, Arial; font-weight: bold">
<div style="border: green solid 0px; width: 157px; height: 100px; margin-left: 5px; margin-top: 5px; float: left; font- family: aladin, allan, Arial; font-weight: bold; text-align: left; ">
<span style="padding-left: 5px;">Režim jednotky</span>
<div style="width: 140px; height: 40px; background-color: black; border: red solid 2px; color:green; font-size: 25px; font-weight: bold; margin-top: 2px;">
<div style=" width: 140px; float: left; text-align: center; padding-top: 5px" id="ID_rezimjednotky">%REZIMJEDNOTKY%</div>
</div>
</div>
<div style="margin: 4px; margin-top: 0px; text-align: left;"><span style="padding-left: 5px;">DIM LED L1</span><br/>
<div style="width: 134px; height: 60px; background-color: black; border: red solid 2px; color:red; font-size: 40px; font-weight: bold; padding-left: 6px; margin-top: 5px">
<div style="padding-top: 10px;">
<div style=" width: 105px; float: left; text-align: right; margin-right: 5px;" id="ID_aktDimL1">%AKTDIML1%</div>
<div style="width: 22px; font-size: 18px; float: left;">‰</div>
</div>
</div>
</div>
</div>
<div style="border: brown solid 0px; width: 80px; height: 155px; margin-left: 0px; float: left; font-family: aladin, allan, Arial; font-weight: bold">
<div style=" height: 42px; border: red solid 0px; margin-top: 4px; text-align: left;"><br/>
<div><a href="/5/on"><button class="button" style="color: green;">ZAP</button></a></div>
</div>
<div style=" height: 42px; border: red solid 0px;margin-top: 22px; text-align: left; "><br/>
<button type="button" class="button" style="color: red;">VYP</button>
</div>
<div style=" height: 42px; border: red solid 0px; margin-top: 22px; text-align: left;"><br/>
<button type="button" class="button" style="color: blue;">AUTO</button>
</div>
</div>
</div>
<!-- ######################################################## 2. okno AKVA panelu - konec ##########################################################-->
<!-- ######################################################## 3. okno AKVA panelu - začátek ##########################################################-->
<div style="float: left; width:185px; height: 193px; border: black solid 2px; background-color: #CDABF3; margin-left: 5px;">
<div style="background-color: black; width: 25px; height: 188px; color: white; text-align: center; font-weight: bold; font-family: aladin, allan, Arial; font-size: 14px; padding-top: 5px; float: left; border: 1px black solid;">
<span style="font-size: 22px; color:#CDABF3">D</span><br/>O<br/>M<br/>Á<br/>C<br/>N<br/>O<br/>S<br/>T
</div>
<div style="border: green solid 0px; width: 157px; height: 155px; margin-left: 0px; float: left; font-family: aladin, allan, Arial; font-weight: bold">
<div style="border: blue solid 0px; width: 157px; height: 100px; margin-left: 5px; margin-top: 5px; float: left; font- family: aladin, allan, Arial; font-weight: bold; text-align: left; ">
<span style="padding-left: 5px;">Venkovní teplota</span>
<div style="width: 134px; height: 60px; background-color: black; border: red solid 2px; color:green; font-size: 40px; font-weight: bold; padding-left: 6px; margin-top: 5px">
<div style="padding-top: 10px;">
<div style=" width: 105px; float: left; text-align: right; margin-right: 5px;" id="ID_venkTepl">%VENKTEPL%</div>
<div style="width: 22px; font-size: 18px; float: left;">‰</div>
</div>
</div>
</div>
<div style="margin: 4px; margin-top: 0px; text-align: left;">
<span style="padding-left: 5px;">Vnitřní teplota</span><br/>
<div style="width: 134px; height: 60px; background-color: black; border: red solid 2px; color:white; font-size: 40px; font-weight: bold; padding-left: 6px; margin-top: 5px">
<div style="padding-top: 10px;">
<div style=" width: 105px; float: left; text-align: right; margin-right: 5px;" id="ID_vnitTepl">%VNITTEPL%</div>
<div style="width: 22px; font-size: 18px; float: left;">‰</div>
</div>
</div>
</div>
</div>
</div>
<!-- ######################################################## 3. okno AKVA panelu - konec ##########################################################-->
<!-- ######################################################## 4. okno AKVA panelu - začátek ########################################################-->
<div style="float: left; width:230px; height: 193px; border: black solid 2px; background-color: #ECF9BD; margin-left: 5px;">
<div style="background-color: black; width: 25px; height: 188px; color: white; text-align: center; font-weight: bold; font-family: aladin, allan, Arial; font-size: 14px; padding-top: 5px; float: left; border: 1px black solid;">
<span style="font-size: 22px; color:#ECF9BD">T</span><br/>E<br/>S<br/>T<br/>O<br/>V<br/>Á<br/>N<br/>Í
</div>
<div style="border: green solid 0px; width: 200px; height: 155px; margin-left: 0px; float: left; font-family: aladin, allan, Arial; font-weight: bold">
<div style="border: blue solid 0px; width: 190px; height: 100px; margin-left: 5px; margin-top: 5px; float: left; font- family: aladin, allan, Arial; font-weight: bold; text-align: left; ">
<span style="padding-left: 5px;">Internetový čas</span>
<div style="width: 170px; height: 60px; background-color: black; border: red solid 2px; color: yellow; font-size: 40px; font-weight: bold; margin-top: 5px">
<div style="padding-top: 10px;">
<div style=" width: 170px; text-align: center; margin-right: 5px;" id="ID_internetcas">%INTERNETCAS%</div>
</div>
</div>
</div>
</div>
<!-- ######################################################## 4. okno AKVA panelu - konec ##########################################################-->
</div>
</body>
<script>
// parametry pro obnovování hodnoty daného prvku na webové stránce
//--- termostat - začátek ---------------------------------------------------
//----- obnovování zobrazování teploty vody v akváriu
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("ID_rezimtermostatu").innerHTML = this.responseText; // identifikátor prvku na webové stránce
}
};
xhttp.open("GET", "/rezimTermostatu", true); // id prvku příkazu GET
xhttp.send();
}, 1000 ) ; // nastavení času v ms pro obnovení na webové stránce
//----- obnovování zobrazování teploty vody v akváriu
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("ID_teplvody").innerHTML = this.responseText; // identifikátor prvku na webové stránce
}
};
xhttp.open("GET", "/teplVody", true); // id prvku příkazu GET
xhttp.send();
}, 1000 ) ; // nastavení času v ms pro obnovení na webové stránce
//----- obnovování zobrazování nastavení horní meze termostatu
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("ID_hmezteplvody").innerHTML = this.responseText; // identifikátor prvku na webové stránce
}
};
xhttp.open("GET", "/hMezTeplVody", true); // id prvku příkazu GET
xhttp.send();
}, 1000 ) ; // nastavení času v ms pro obnovení na webové stránce
//----- obnovování zobrazování nastavení dolní meze termostatu
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("ID_dmezteplvody").innerHTML = this.responseText; // identifikátor prvku na webové stránce
}
};
xhttp.open("GET", "/dMezTeplVody", true); // id prvku příkazu GET
xhttp.send();
}, 1000 ) ; // nastavení času v ms pro obnovení na webové stránce
//----- obnovování zobrazování stavu ohřívače vody v akváriu
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("ID_stavohrivace").innerHTML = this.responseText; // identifikátor prvku na webové stránce
}
};
xhttp.open("GET", "/stavOhrivace", true); // id prvku příkazu GET
xhttp.send();
}, 1000 ) ; // nastavení času v ms pro obnovení na webové stránce
//--- termostat - konec -----------------------------------------------------
//--- osvětlení - začátek ---------------------------------------------------
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("ID_rezimjednotky").innerHTML = this.responseText; // id prvku na webové stránce
}
};
xhttp.open("GET", "/rezimJednotky", true); // identifikátor příkazu GET
xhttp.send();
}, 2000 ) ; // nastavení času v ms pro obnovení na webové stránce
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("ID_aktDimL1").innerHTML = this.responseText; // id prvku na webové stránce
}
};
xhttp.open("GET", "/aktDimL1", true); // identifikátor příkazu GET
xhttp.send();
}, 1000 ) ; // nastavení času v ms pro obnovení na webové stránce
//--- osvětlení - konec ---------------------------------------------------
//--- domácnost - začátek ---------------------------------------------------
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("ID_vnitTepl").innerHTML = this.responseText; // identifikátor prvku na webové stránce
}
};
xhttp.open("GET", "/vnitTepl", true); // id prvku příkazu GET
xhttp.send();
}, 3000 ) ; // nastavení času v ms pro obnovení na webové stránce
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("ID_venkTepl").innerHTML = this.responseText; // identifikátor prvku na webové stránce
}
};
xhttp.open("GET", "/venkTepl", true); // id prvku příkazu GET
xhttp.send();
}, 2000 ) ; // nastavení času v ms pro obnovení na webové stránce
//--- domácnost - konec ---------------------------------------------------
//--- testování - začátek ---------------------------------------------------
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("ID_internetcas").innerHTML = this.responseText; // id prvku na webové stránce
}
};
xhttp.open("GET", "/internetCas", true); // identifikátor příkazu GET
xhttp.send();
}, 500 ) ; // nastavení času v ms pro obnovení na webové stránce
//--- testování - konec ---------------------------------------------------
</script>
</html>)rawliteral";
//---------------------------------------------------
// Hodnoty proměnných jsou zaměněny za identifikátor na webové stránce
String processor(const String& var){
// tady vytvoř, která proměnná se má za který identifikátor zaměnit
//--- Termotat - začátek ------------------------------------------------
if(var == "REZIMTERMOSTATU"){ // identifikátor
return String(zobrazRezimTermostatu); // proměnná obsahující hodnotu pro zobrazení na webové stránce
} else if(var == "TEPLVODY"){ // identifikátor
return String(zobrazTeplotaVody); // proměnná obsahující hodnotu pro zobrazení na webové stránce
} else if(var == "HMEZTEPLVODY"){ // identifikátor
return String(zobrazHMezTeplVody); // proměnná obsahující hodnotu pro zobrazení na webové stránce
} else if(var == "DMEZTEPLVODY"){ // identifikátor
return String(zobrazDMezTeplVody); // proměnná obsahující hodnotu pro zobrazení na webové stránce
} else if(var == "STAVOHRIVACE"){ // identifikátor
return String(zobrazStavOhrivace); // proměnná obsahující hodnotu pro zobrazení na webové stránce
}
//--- Termotat - konec ------------------------------------------------
//--- Domácnost - začátek ------------------------------------------------
if(var == "REZIMJEDNOTKY"){ // identifikátor
return String(zobrazRezimJednotky); // proměnná obsahující hodnotu pro zobrazení na webové stránce
} else if(var == "VNITTEPL"){ // identifikátor
return String(zobrazVnitniTeplota); // proměnná obsahující hodnotu pro zobrazení na webové stránce
} else if(var == "VENKTEPL"){ // identifikátor
return String(zobrazVenkovniTeplota); // proměnná obsahující hodnotu pro zobrazení na webové stránce
}
//--- Domácnost - konec ------------------------------------------------
//--- Osvětlení - začátek ------------------------------------------------
if(var == "AKTDIML1"){ // identifikátor
return String(zobrazAktualDimL1); // proměnná obsahující hodnotu pro zobrazení na webové stránce
}
//--- Osvětlení - začátek ------------------------------------------------
//--- Testování - začátek ------------------------------------------------
if(var == "INTERNETCAS"){ // identifikátor %CAS%
return String(internetCas); // proměnná obsahující hodnotu pro zobrazení na webové stránce
}
//--- Testování - konec ------------------------------------------------
return String();
}
//---------------------------------------------------
//********************** Webová stránka - konec ********************************
//********************** Fce - začátek *****************************************
// --- fce tasker - začátek -------------------------------------------------------------
// --- Čas - začátek -----------------------------------------------------------
// fce, která opraví systémový čas z DS3231, pokud se bude lišit od času
// z webového serveru o určitý interval
// zatím se počítá s přímým připojením DS3231, pak uprav, aby se aktualizoval
// opravdu systémový čas
void opravSystemovyCas() {
// systémový čas
unsigned long systemovyTimestamp; // = DejAktTimestamp();
// čas z webu
byte webHodiny = myLocalTime.hour();
byte webMinuty = myLocalTime.minute();
byte webSekundy = myLocalTime.second();
int webRok = myLocalTime.year();
byte webMesic = myLocalTime.month();
byte webDen = myLocalTime.day();
unsigned long webovyTimestamp = (webHodiny * 3600L) + (webMinuty * 60) + webSekundy;
if ( (abs(webovyTimestamp - systemovyTimestamp)) >= rozsahOdchylky) {
rtc.adjust(DateTime(webRok, webMesic, webDen, webHodiny, webMinuty, webSekundy));
}
/* //pro test
Serial.print("Nastaven nový systémový čas: ");
Serial.print(webRok);
Serial.print(".");
Serial.print(webMesic);
Serial.print(".");
Serial.print(webDen);
Serial.print(" -- ");
Serial.print(webHodiny);
Serial.print(" : ");
Serial.print(webMinuty);
Serial.print(" : ");
Serial.println(webSekundy);
} else (Serial.print("Systémový čas je aktuální. "));*/
}
// Vrátí hodnotu timestampu (počet sekund) aktuálního času v modulu času DS3231 - začátek ++++
// použij hodnoty z úlohy Aktualni_cas, pokud bude blbnout, odkomentuj
unsigned long DejAktTimestamp() {
unsigned long aktCasTimestamp;
aktCasTimestamp = (hodiny * 3600L) + (minuty * 60) + sekundy;
return aktCasTimestamp;
}
// Vrátí hodnotu timestampu aktuálního času v modulu času DS3231 - konec +++++++
// naplní veřejné proměnné aktuálním čase - začátek -------------------
void aktCas() {
DateTime now = rtc.now(); // načtení aktuálního času z modulu DS3231
hodiny = now.hour();
minuty = now.minute();
sekundy = now.second();
den = now.day();
mesic = now.month();
rok = now.year();
}
// naplní veřejné proměnné aktuálním čase - konec ---------------------
// zobraz čas na sériové lince - pro test
void zobrazAktCasNaSerLince() {
aktCas();
char casDS3231 [6];
sprintf(casDS3231, "%02d:%02d:%02d", hodiny, minuty, sekundy);
Serial.print("Čas DS3231: ");
Serial.println(casDS3231);
/*Serial.print(hodiny);
Serial.print(":");
Serial.print(minuty);
Serial.print(":");
Serial.println(sekundy);*/
}
// zobraz čas konec
// zobrazí webový čas na serial monitoru
void zobrazitCasZwebu() {
Serial.print("Čas z webu:");
Serial.println(myLocalTime.dateTime("H:i:s"));
}
//zobrazit čas z webu konec
// --- Čas - konec -------------------------------------------------------------
// --- fce tasker - konec ---------------------------------------------------------------
// --- testovací fce - začátek ----------------------------------------------------------
void testDIML1task() {
h += 1;
if (h > 100) {
h = 0;
}
zobrazAktualDimL1 = (String)h;
Serial.println(zobrazAktualDimL1);
}
void taskCas() {
minu = myLocalTime.minute();
hod = myLocalTime.hour();
sec = myLocalTime.second();
sprintf(cas, "%02d:%02d:%02d", hod, minu, sec);
internetCas = (String)cas;
Serial.println(internetCas);
}
void testTeplVodyTask() {
t += 0.11;
if (t > 100) { t=0;
}
char testT [5];
sprintf(testT,"%4.1f", t);
zobrazTeplotaVody = testT;
zobrazVnitniTeplota = testT;
zobrazVenkovniTeplota = testT;
sprintf(testT,"%4.1f °C", t);
zobrazHMezTeplVody = testT;
zobrazDMezTeplVody = testT;
Serial.println(zobrazTeplotaVody);
}
void testStavy() {
if (zobrazStavOhrivace == "Topi") {
zobrazStavOhrivace = "Netopi";
zobrazRezimTermostatu = "NEAKTIVNI";
} else if (zobrazStavOhrivace == "Netopi") {
zobrazStavOhrivace = "Topi";
zobrazRezimTermostatu = "AKTIVNI";
} else if (zobrazStavOhrivace == "N/A") {
zobrazStavOhrivace = "Netopi";
zobrazRezimTermostatu = "AKTIVNI";
}
RJ ++;
if (RJ > 5) {
RJ = 0;
}
switch (RJ) {
case (0):
zobrazRezimJednotky = "VYPNUTO";
break;
case (1):
zobrazRezimJednotky = "ZAPNUTO";
break;
case (2):
zobrazRezimJednotky = "PROG 1";
break;
case (3):
zobrazRezimJednotky = "PROG 2";
break;
case (4):
zobrazRezimJednotky = "PROG 3";
break;
default:
zobrazRezimJednotky = "N/A";
}
}
// --- testovací fce -konec ------------------------------------------------------------
// ******************** fce - konec ****************************************************
void setup() {
//--- spuštění komunikací - začátek ----------------------------------------
Serial.begin(9600);
Slinka1.begin(9600);
Wire.begin();
// nastavení pinů pro sériovou komunikaci
pinMode(D7,INPUT);
pinMode(D8,OUTPUT);
//--- spuštění komunikací - konec ----------------------------------------
//--- Wi-Fi - začátek -----------------------------------------------------
// Connect to Wi-Fi
WiFi.begin(ssid, password);
Serial.print("Připojování k WiFi síti -> ");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Zobrazení lokální adresy na seriovém monitoru
Serial.println("");
Serial.print("WiFi - připojeno k ");
Serial.println(ssid);
Serial.println("Lokální IP adresa: ");
Serial.println(WiFi.localIP());
//--- Wi-Fi - konec -------------------------------------------------------
// --- Server - začátek ----------------------------------------------------
// Route for root / web page
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", index_html, processor);
});
// tady se spouští proces obnovování zobrazované hodnoty na webové stránce za identifikátor
//--- Termostat - začátek -------------------------------------------
server.on("/rezimTermostatu", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", String(zobrazRezimTermostatu).c_str());
});
server.on("/teplVody", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", String(zobrazTeplotaVody).c_str());
});
server.on("/hMezTeplVody", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", String(zobrazHMezTeplVody).c_str());
});
server.on("/dMezTeplVody", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", String(zobrazDMezTeplVody).c_str());
});
server.on("/stavOhrivace", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", String(zobrazStavOhrivace).c_str());
});
//--- Termostat - konec ---------------------------------------------
//--- Ovětlení - začátek -------------------------------------------
server.on("/rezimJednotky", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", String(zobrazRezimJednotky).c_str());
});
server.on("/aktDimL1", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", String(zobrazAktualDimL1).c_str());
});
//--- Osvětlení - konec --------------------------------------------
//--- Domácnost - začátek -------------------------------------------
server.on("/vnitTepl", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", String(zobrazVnitniTeplota).c_str());
});
server.on("/venkTepl", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", String(zobrazVenkovniTeplota).c_str());
});
//--- Domácnost - konec ---------------------------------------------
//--- Testování - začátek -------------------------------------------
server.on("/internetCas", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", String(internetCas).c_str());
});
//--- Testování - konec ---------------------------------------------
// Start server
server.begin();
// --- Server - konec -----------------------------------------------------
// hledání časového modulu
/*if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
} else (Serial.println("DS3231 nalezen"));
*/
// --- Internetový čas - začátek -------------------------------------------
// Set desired time zone for Timezone object declared in the beginning
myLocalTime.setLocation(F("cz")); // set your time zone
// Sync NTP time for ezTime library
waitForSync();
delay(2000);
// --- Internetový čas - konec -----------------------------------------------
// ********* Spuštěné úlohy - začátek *****************************************
// v knihovně Tasker je nastaveno max. 10 úloh
// 02 Čas z webu
tasker.setInterval(zobrazitCasZwebu, 1000);
// 03 Čas z DS3231
tasker.setInterval(zobrazAktCasNaSerLince, 1000);
// 04 Oprava času, pokud se DS3231 předbíhá či opožďuje
tasker.setInterval(opravSystemovyCas, 3600);
// test - smazat
tasker.setInterval(testTeplVodyTask, 1000);
// test - smazat
tasker.setInterval(testDIML1task, 2000);
// test - smazat
tasker.setInterval(taskCas, 1000);
// test - smazat
tasker.setInterval(testStavy, 2000);
// ********* Spuštěné úlohy - konec *****************************************
delay(5000); // smazat, jen pro simulaci načítání po spuštění programu
}
void loop() {
tasker.loop();
}