Tasker a web server

tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: Tasker a web server

Příspěvek od tosik » 03 dub 2020, 12:19

Dobře, to zkusím předělat tím druhým způsobem. Díky za radu. Zkusím to najít na netu, zatím se mi to nedaří přiložit. Programuji teprve půl roku, tak to není tak jednoduché. Na těch záložkách bylo super, že jsem je měl pootevírané v IDE, pojmenované podle obsahu (třeba Termostat, Aktualizace času z webu, atd.) a dobře se mi to ladí. S tím se nějak poperu. Hlavně, že jsme přišli na to, kde je zakopaný pes.
Ale ještě jedno bych potřeboval poradit. Podařilo se mi to zprovoznit, na lokální síti vidím webovou stránku zobrazující teplotu a vlhkost (data jsou zatím fiktivní). A já nemůžu ani za boha přijít na to, kde nastavím interval, kterým se data aktualizují na webové stránce. Teď to změní zobrazovanou hodnotu co 10 sekund. V kódu jsou dvě fce setInterval, tam je nějaká hodnota 10000, ale když ji změním, nemá to vliv, stále to mění zobrazované hodnoty co 10 sekund. Prosím o radu, kde to řídí ten interval obnovy? Ten můj task na to nemá vliv. Ten mám jen pro to, aby se hodnota zvyšovala. Že by to bylo nastaveno někde v knihovně toho serveru? Kdyby mně někdo aspoň nasměroval, kde, popř. co hledat.... Díky

Kód: Vybrat vše

#include <Tasker.h>
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Hash.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>

Tasker tasker;

//******** 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 - začátek *****************************
  // prozatimní proměnné
  // current temperature & humidity, updated in loop()
  float t = 0.0;
  float h = 0.0;
  boolean smazat = true;

  // Create AsyncWebServer object on port 80
  AsyncWebServer server(80);

//********************** Webová stránka - začátek *****************************

    const char index_html[] PROGMEM = R"rawliteral(
    <!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
  <style>
    html {
     font-family: Arial;
     display: inline-block;
     margin: 0px auto;
     text-align: center;
    }
    h2 { font-size: 3.0rem; }
    p { font-size: 3.0rem; }
    .units { font-size: 1.2rem; }
    .dht-labels{
      font-size: 1.5rem;
      vertical-align:middle;
      padding-bottom: 15px;
    }
  </style>
</head>
<body>
  <h2>ESP8266 DHT Server</h2>
  <p>
    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    <span class="dht-labels">Temperature</span> 
    <span id="temperature">%TEMPERATURE%</span>
    <sup class="units">&deg;C</sup>
  </p>
  <p>
    <i class="fas fa-tint" style="color:#00add6;"></i> 
    <span class="dht-labels">Humidity</span>
    <span id="humidity">%HUMIDITY%</span>
    <sup class="units">%</sup>
  </p>
</body>

<script>
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("temperature").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/temperature", true);
  xhttp.send();
}, 10000 ) ;

setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("humidity").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/humidity", true);
  xhttp.send();
}, 10000 ) ;
</script>
</html>)rawliteral";

//---------------------------------------------------

  // Replaces placeholder with DHT values
String processor(const String& var){
  //Serial.println(var);
  if(var == "TEMPERATURE"){
    return String(t);
  }
  else if(var == "HUMIDITY"){
    return String(h);
  }
  return String();
}

//---------------------------------------------------

//********************** Webová stránka - konec ********************************

// --- fce ------------------------------------------------------------------

void testTask() {
  Serial.println("Test");
}

//**********

void testTask2() {
  
    t += 1;
     Serial.println(t);   
    h += 1;
     Serial.println(h);
    
  
}

//*********

// --- fce ------------------------------------------------------------------

void setup() {

  //--- spuštění komunikací - začátek ----------------------------------------

    Serial.begin(9600);

  //--- spuštění komunikací - začátek ----------------------------------------

  //---  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);
  });
  server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", String(t).c_str());
  });
  server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", String(h).c_str());
  });

  // Start server
  server.begin();

  // --- Server - konec -----------------------------------------------------

// ********* Spuštěné úlohy - začátek *****************************************
// v knihovně Tasker je nastaveno max. 10 úloh


  // 01 měření teploty čidlem CT1  
    // zrušení čekání procesoru, než se mu vrátí hodnota teploty z DS18B20
    //sensor.setWaitForConversion(false);
    // čtení teploty, interval nastav v deklaraci proměnné "intervalMereniTeploty"
    //tasker.setInterval(startConversion, intervalMereniTeploty);
  
  // 02 zpracování dat termostatu T1    
     //tasker.setInterval(taskTermostatT1, 2000);
  
  // 03 obsluha OLED 0.96"    
     //tasker.setInterval(taskOLED0_96, 200);
  
  // 04 tlačítka  
     //tasker.setInterval(taskTlacitka, 100);
  
  // 05 aktuální čas    
     //tasker.setInterval(taskAktCas, 1000);
  
  // 06 časové řízení jednotky    
     //tasker.setInterval(taskCasRizeni, 1000);   
      
  // schedule task1 to be called every 4 seconds but five times only
    //tasker.setRepeated(task1, 4000, 5);
  
  // schedule task2 to be called every 500 milliseconds
    // tasker.setInterval(task2, 500);

  // test - smazat
    tasker.setInterval(testTask, 1000);
    // test - smazat
    tasker.setInterval(testTask2, 2000);

// ********* Spuštěné úlohy - konec *****************************************

}

void loop() {

  tasker.loop();

}

tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: Tasker a web server

Příspěvek od tosik » 03 dub 2020, 12:23

Tak už jsem na to přišel, byla to opravdu ta fce setInterval, jen po odeslání na webový server a zobrazení na stránce bylo třeba udělat refresh stránky, jinak to mělo stále načtené původní data a měnilo to pouze zobrazované hodnoty.... :-D

tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: Tasker a web server

Příspěvek od tosik » 06 dub 2020, 10:04

Já jsem asi úplný de..l. Vytvořil jsem složku "Test_vloz_soubor". Do ní 3 soubory:

"Test_vloz_soubor.ino"

Kód: Vybrat vše

#include "Test_vloz_soubor.cpp"

void setup() {
  Serial.begin(9600);
  fce();
}

void loop() {
  
}
"Test_vloz_soubor.cpp"

Kód: Vybrat vše

#include "Test_vloz_soubor.h"

void fce();

"Test_vloz_soubor.h"

Kód: Vybrat vše

void fce() {
  Serial.println("Tisk z .cpp");
}
Při kompilaci však píše (u souboru .h):

Kód: Vybrat vše

 'Serial' was not declared in this scope
Zkoušel jsem to i přehodit, deklarace v .h a definici fce v .cpp, stále nezná Serial... :idea: Co mám špatně? Díky.

Uživatelský avatar
kiRRow
Příspěvky: 1164
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Tasker a web server

Příspěvek od kiRRow » 06 dub 2020, 16:18

soubor test.ino :

Kód: Vybrat vše

#include "vloz_soubor.h"

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  testFunkce();
}

void loop() {
  // put your main code here, to run repeatedly:

}
soubor vloz_soubor.h :

Kód: Vybrat vše

#include <Arduino.h>

void testFunkce();
soubor vloz_soubor.cpp :

Kód: Vybrat vše

#include "vloz_soubor.h"

void testFunkce(){
  Serial.println("TEST");
}
Kompilace ukončena :
Projekt zabírá 1800 bytů (0%) úložného místa pro program. Maximum je 253952 bytů.
Globální proměnné zabírají 192 bytů (2%) dynamické paměti, 8000 bytů zůstává pro lokální proměnné. Maximum je 8192 bytů.
....... nemám to momentálně možnost někde nahrát a zkusit

tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: Tasker a web server

Příspěvek od tosik » 06 dub 2020, 20:31

Díky moc. Chybělo mi tam vložit knihovnu Arduino.h. Teď už to jde zkompilovat bez problémů. Je zajímavé, že na Mega 2560 to zabírá 1776 bytů, zatímco na NodeMCU to zabírá 260748 bytů. Ale jinak funguje, to je hlavní. Díky za pomoc.

tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: Tasker a web server

Příspěvek od tosik » 06 dub 2020, 21:09

Ještě by potřeboval poradit, jak dostat do externího souboru webovou stránku, která je vložená do proměnné:

Kód: Vybrat vše

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;">&deg;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;">&permil;</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;">&permil;</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;">&permil;</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();
}

//---------------------------------------------------
Je to poměrně obsáhlé, a najít pak něco v kódu Arduina je pecka. Nešlo by to hodit třeba do fce, která by vrátila do místa, kde webovka v kódu má být, obsah té proměnné? Mi se to nedaří.

tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: Tasker a web server

Příspěvek od tosik » 06 dub 2020, 21:10

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 - &deg;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;">&deg;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;">&permil;</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;">&permil;</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;">&permil;</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();

}


tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: Tasker a web server

Příspěvek od tosik » 07 dub 2020, 08:28

Problém bude v chybné deklaraci proměnné. Když ji deklaruji v souboru Test_vloz_soubor.ino a pak volám ve fci v souboru Test_vloz_soubor.cpp, tak to vypíše opět chybu (nebylo deklarováno). Když ji deklaruji v Test_vloz_soubor.cpp, tak stejná chyba. A když ji deklaruji v Test_vloz_soubor.cpp, tak opět chyba.

Uživatelský avatar
kiRRow
Příspěvky: 1164
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Tasker a web server

Příspěvek od kiRRow » 07 dub 2020, 16:13

Jako hodně ti v tom HTML kódu děláj ty styly. Máš je zapsány všechny v HTML prvcích. Pomocí CSS by šel ten kód hodně zkrátit. Rozhodně spoustu věcí s arduinem neuděláš, alespoň né tak lehce, tak jako na opravdovém webovém serveru. Já už bych tady asi pokukoval po raspberry pi, které mi dovolí rozběhnout plnohodnotný web server, php, mysql, ftp, smtp a další služby.

ps : tohle by mohlo pomoct https://startingelectronics.org/tutoria ... eb-server/

tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: Tasker a web server

Příspěvek od tosik » 07 dub 2020, 21:24

Ano, vím, to je zatím testovací verze, upravím to s tím css-kem. Ale i tak je kód hodně nepřehledný. Je to prostě fšechno natěpané na jedné stránce. S tím taskerem to šlo krásně rozhodit, teď nemůžu mít v taskeru ani věci, které jsem tam míval. Ale zatím mi to stačí, ten webový server bude takový bonus, není to pro mne stěžejní. Kdyby šlo rozhodit aspoň do těch souborů ty fce, to by mi stačilo. Tak snad se k tomu časem propracuji. V Arduinu Mega mi zatím tasker běží. Je možné, že problém dělá ten NodeMCU, že ho časem vyměním za Nano či něco podobného a připojím k němu Wifi modul. Rapsberry Pi je pro mne zatím zbytečně výkonný. Ale věřím, že časem mne to asi nemine....

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti