Tasker a web server

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

Tasker a web server

Příspěvek od tosik » 02 dub 2020, 16:32

Zdravím.
Chtěl bych zprovoznit malý web server (NodeMCU). Používám pro rozdělení kódu knihovnu Tasker.h. Na webu jsem si našel tutoriál na web server:

Kód: Vybrat vše

https://randomnerdtutorials.com/esp8266-dht11dht22-temperature-and-humidity-web-server-with-arduino-ide/
Ten jsem bez problému zprovoznil. Pak jsem zprovoznil tento program s Taskerem:

Kód: Vybrat vše

#include <Tasker.h>

Tasker tasker;

void setup() {
  Serial.begin(9600);
  
// ********* Spuštěné úlohy - začátek *****************************************
  // test - smazat
    tasker.setInterval(testTask, 1000);
// ********* Spuštěné úlohy - konec *****************************************

}

void loop() {
  tasker.loop();
}

Kód: Vybrat vše

void testTask() {
  Serial.println("Test");
}
Opět fachá jak má. Ovšem když chci nakopírovat ten server do svého projektu, nejde to zkompilovat. Když mám zakomentovanou část kódu s PROGMEM (webová stránka), tak to zkompiluji. Když ji však odkomentuji, vyhodí mi to chybu:

Kód: Vybrat vše

'testTask' was not declared in this scope
Nevíte někdo, kde je chyba? Co vlastně dělá to PROGMEM? Že by právě toto nějak kolidovalo s tím Taskerem? Chybný kód zde:

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";

*/

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

void setup() {

  Serial.begin(9600);

// ********* Spuštěné úlohy - začátek *****************************************

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

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

}

void loop() {
  tasker.loop();
}

Kód: Vybrat vše

void testTask() {
  Serial.println("Test");
}
Díky za tipy.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Tasker a web server

Příspěvek od pavel1tu » 02 dub 2020, 17:57

Můj tip je - závorky - někde nahoře není uzavřená některá závorka - ale sorry, na tabletu to nedávám ...
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Tasker a web server

Příspěvek od KamilV » 02 dub 2020, 18:09

Kód: Vybrat vše

tasker.setInterval(testTask, 1000);
Kde je definován testTask?

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, 06:38

Mám to rozdelene v IDE na zalozky, takže v dalsi záložce . Proto jsem to oddělil od hlavního kódu.

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

Re: Tasker a web server

Příspěvek od kiRRow » 03 dub 2020, 08:49

Kompilátor tu funkci nezná:
může to být překlep v názvu funkce,
zapomeneš importovat soubor,
funkci se ti povedlo napsat do nějakého scope, takže není globálně přístupná
snažíš se volat funkci dřív, než ji deklaruješ

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, 09:13

Tak je chyba zřejmě někde v kódu webové stránky. Když proměnnou index_html nechám prázdnou:

Kód: Vybrat vše

const char index_html[] PROGMEM = R"rawliteral(
    
)rawliteral";
nebo tam něco vepíšu, např:

Kód: Vybrat vše

const char index_html[] PROGMEM = R"rawliteral(
    test
)rawliteral";
tak mi to zkompiluje. Ale ani za boha nemůžu přijít na co, co je špatně.

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, 09:19

to kiRRow:

Ten základ programu je stále stejný, myslím tím tu kostru s Taskerem. To funguje, deklarované to je. Jakmile ale přidám tu část s tím PROGMEM, tak to hlásí, že není deklarovaný. Toto mi občas dělá tak jak píše pavel1tu, když zapomenu na nějakou závorku. Ale já kopíruju funkční část kódu do funkčního kódu. Tak mne napadlo, nemůže to být tím, že jsem se s tím kopírováním zarazil u první chyby. Ale nemám nakopírovaný kód, který by měl ještě následovat, aby byl webserver funkční... Zkusím to dokopírovat...

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, 09:42

Takže to taky ne, chyba stále stejná. Pořád hlásí nedeklarovaný testTask.

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, 09:52

Tak jsem zkusil, jak psal kiRRow s tou deklarací po volání fce, deklarovat testTask() mezi setup() a loop() a zkompilováno. Otázka zní, proč to teď nejde, když bez serveru to jde? Mám s tím taskerem ještě takový prototyp řídící jednotky s asi osmi tasky, a tam mi to deklarování v záložkách nedělá problém. Je to pro mne pak snazší něco najít. Je nějaká možnost, jak bych to mohl mít rozdělené na ty záložky jako dřív?

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

Re: Tasker a web server

Příspěvek od kiRRow » 03 dub 2020, 10:46

To se občas stane, jak člověk začne zanořovat do projektu záložky a pak se snaží funkce z jedné záložky volat funkci z jiné záložky, jenže ta ještě nebyla naimportovaná a kompilátor je z toho značně zmaten.

Vysvětlit mu to můžeme třeba tak, že v hlavním souboru si všechny funkce nejprve deklarujeme, tím mu řeknem, že tam někde dál bude i definice funkce. Vypadá to asi tak nějak.

Kód: Vybrat vše

void testFunkce();
byte testNavratoveFunkce();
int testFCEsParametrem(float parametr);

#include "soubor_s_funkcemi.h"

setup...loop
v souboru s funkcemi pak bude samotná definice již dříve deklarované funkce

Kód: Vybrat vše

void testFunkce() {
  // delej nejaky veci
}

byte testNavratoveFunkce() {
  // delej neco
  byte vysledek = 5;
  return vysledek;
}

atd...
Ale to je postup docela na prasáka :)
Správnější postup je použít externí soubory dva. Jeden s koncovkou *.h - to je tzv hlavičkový soubor a ten by měl obsahovat všechny deklarace všech funkcích a proměnných - ten je vkládán do hlavního kódu a načítá do sebe druhý soubor. Druhý soubor je s koncovkou *.cpp a ten obsahuje definice.

Odpovědět

Kdo je online

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