ESP8266 pro začátečníka – jednoduchý server s čidlem DHT11/22

DHTSSDostal jsem mailem dotaz, zda nemám nějaký příklad pro začátečníka na Arduino ESP8266, který by obsahoval obsluhu webového serveru a čtení čidla relativní vlhkosti a teploty DHT11/22. Odpověděl jsem mu, že si myslím, že by neměl být problém něco vzorového “spíchnout”, ale teprve při psaní jsem si uvědomil, že to není jen tak. Napsat ošetření serveru opravdu je jednoduché, vyčítání hodnot také není problém. Potíž ovšem nastává v okamžiku, kdy je třeba tohle všechno nějak seskládat tak, aby to bylo snadno konfigurovatelné, snadno aktualizovatelné, zobrazení hodnot vypadalo aspoň trošku slušně a přitom načítání stránky netrvalo věčnost.

Klíčem k dosažení tohoto cíle bylo sehnat vhodný hardware, na kterém bych mohl začít. Protože jsem doma měl destičku Wemos D1 mini s DHT shieldem a nechtěl jsem zbytečně trávit čas nad zapojováním breadboardu, byla volba jasná.

IMG_9781_web_cropIMG_9780_web_crop

Další moje úvahy směřovaly ke snadné konfigurovatelnosti – takže jsem použil moji knihovnu WiFiConfig, snadné aktualizaci firmware – pomocí ArduinoOTA. Na čem jsem se ale zarazil bylo to hezké zobrazení a rychlé načítání stránky. Naštěstí jsem našel na internetu zmínku o SVG (Scalable Vector Graphic), což je textový popis grafiky v syntaxi XML (http://www.w3schools.com/svg/svg_inhtml.asp), který umí vykreslit všechny moderní prohlížeče. Výhodou je, že popis jednoduchých grafických prvků není příliš velký (rychlost načítání) a může být přímo vložený do HTML kódu (vystačíme si s jedním requestem na stránku). Po chvíli hledání jsem objevil projekt, jehož webovou aplikaci jsem “přiohnul” k požadovanému stavu. No buďme upřímní – v podstatě jsem jen trošku jinak poskládal už hotové prvky (za což původnímu autorovi děkuji), převedl je do PROGMEM, abych nemusel používat souborový systém a celý příklad byl snadnější ke studiu a nakonec jsem pouze napsal generování JSON výsledku měření. Pro jednoduchou diagnostiku a snadnější pochopení je skript doplněný ladícími výpisy na sériový port.

Takže použité moduly jsou:

  • WiFiConfig – stará se o připojení k WiFi síti, vytváří v případě potřeby konfigurační www server a ukládá/načítá konfiguraci WiFi do (simulované) EEPROM
  • espnbns – slouží pro snadnou lokalizaci zařízení v síti Windows a v kombinaci s ArduinoOTA pak umožňuje lokalizovat modul pomocí např. http://<jméno modulu> (síť Windows), nebo http://<jméno modulu>.local (sítě Linux/Mac)
  • interval – časuje přístupy na čidlo DHT, protože rychlost dotazování může být max. jednou za cca 2 sekundy

Mimoto jsou použity Adafruit knihovny pro obsluhu DHT a standardní Arduino ESP8266 knihovny pro OTA a komunikaci. Všechny použité knihovny mimo standardních jsou přímo obsaženy v adresářové struktuře projektu.

Finální testování probíhalo pomocí USB Powerbanky, protože jsem také chtěl ověřit spolehlivost běhu (zatím běží cca 5 hodin v kuse…)

IMG_9783_web

A na závěr, před odkazem ke stažení, jako obvykle použitá konfigurace:

OS Windows 7 x64 Professional SP1

Arduino IDE 1.6.9 (Portable konfigurace)

ESP8266 Core v 2.3.0-rc1

Odkaz do obchodu pro zakoupení modulu Wemos D1

Wemos D1 mini V2 4M bytes

No a teď už jen archív ke stažení, získaný funkcí “Archivovat projekt” z IDE

 

 

Dhts-160527a
Dhts-160527a
dhts-160527a.zip
32.9 KiB
3256 Downloads
Detaily
Dhts-181201a
Dhts-181201a
dhts-181201a.zip
28.0 KiB
821 Downloads
Detaily

79 komentářů u „ESP8266 pro začátečníka – jednoduchý server s čidlem DHT11/22“

  1. Dobrý den
    Mám ide 1.6.8 s modulem NodeMCU 1.0 ESP12E a při kompilaci projektu mi to vypisuje tuto chybu:

    C:\Users\uziv\Documents\Arduino\dhts_ESP\dhts_ESP.ino:16:31: fatal error: libraries/DHT/DHT.h: No such file or directory
    #include “libraries/DHT/DHT.h”
    compilation terminated.
    exit status 1
    Error compiling for board NodeMCU 1.0 (ESP-12E Module).

    1. Ještě dodatek jak se mi tam podařilo dodat knihovnu DHT hned začala stávkovat knihovna interval.h.

      1. To skutečně vypadá, že se Vám nerozbalil adresář libraries – ten musí být přímo v adresáři projektu (nikam se nepřesunuje).

    2. Dobrý den,
      archív obsahuje všechny potřebné knihovny ve správných verzích. Nejdříve ověřte, zda se rozbalily všechny knihovny správně, pokud ano, tak zkuste nainstalovat mnou používanou verzi Arduina ve verzi Portable a do ní odpovídající Core ESP8266. Překlad musí proběhnout správně (ověřeno na dvou strojích s Windows W7 x64Pro a W8.1).

  2. Pěkný, prohlídl jsem si html, je to něco jinýho než holý tagy. Jen nechápu, jak může být DHT11/22 tak populární. Vyzkoušel jsem jich několik a nakonec jsem musel přejít na HTU21. Nestabilita byla nepřijatelná. SVG jsem si zkusil taky, je to jedna z cest, jak udělat přijatelně vypadající a přijatelně rychlý webový rozhraní pro ESP8266. Tys šel cestou moderního designu, já si chtěl připomenout starý dobrý časy. Podívej se na můj barometr.
    Jinak tě chválím za nezištnou popularizaci zajímavé techniky. Sleduji zajímavý efekt. Arduino je tak populární, že se kombinací HW Arduino + ESP8266 řeší věci, na které by ESP8266 stačilo desetkrát samo. A ještě jedna věc je velmi patrná. Arduino zpřístupnilo programování masám, což je dobře, ale podstatná část těchto uživatelů nemá ani elementární znalosti o elektronice a příšerně tápou i na maličkostech.
    Měj se Pavel

    1. Ahoj, díky za pochvalu. Barometr máš moc pěkný, určitě se rychle zobrazí. Stránky krásně spartánské – zjevně čisté HTML. DHT jsem použil, protože to byl požadavek – já osobně preferuju sensirion čidla, ale ta láce 🙁 … A o těch nezkušených bych mohl psát dlouho 🙂 Naštěstí se to většinou nějak podařilo vyřešit.
      Taky se měj
      Pavel

    2. Zdravim mohl by jsi zde zveřejnit tvuj program na ten barometr?
      S temi zacatečníky maš pravdu, taky se k nim řadim, ale jak jinak ziskat zkušenosti a vědomosti když v době meho studia se první mikroprocesory teprve vyvíjely.

          1. Ono je to stejně na jedno brdo… Od Jirky tady mám stále půjčené tuším BMP280, nebo podobné čidlo – mám z toho zkusit udělat další díl “Projekty pro začátečníky”?

          1. Jaká stránka neexistuje? … aha, odkaz je upravený (jinak příště stačí hledat googlem (já to tak udělal a našel)…)

  3. Ahoj,
    pokoušel jsem se sestavit si vlastní aplikací s Tvými knihovnami, které vypadají teda parádně :-). Nepodařilo se mi ale rozjet OTA. Zkusil jsem ještě nahrát tento projekt s ESP8266 Core v 2.3.0-rc1 a IDE 1.6.9.
    Při pokusu o upload se v IDE zobrazí ERROR : No respose from device. Zapl jsem si debug a OTA vypise Connect Failed
    ERROR[0]: No Error. ESP mam zapnute v AP modu. Nemůže být v tom problém? Díky 🙂

    1. Ahoj. Někteří lidé uvádějí, že jim OTA v AP režimu nepracuje, ale já tu zkušenost nemám… Mám jeden projekt pouze s AP režimem a OTA normálně pracuje. Zkusím z něj udělat příklad pro testování…
      Ještě jedna věc – vidíš zařízení v sériových portech?

      1. ano, to prave vidim, vidim tam i muj nazev zarizeni, ktery jsem si zadal. Kdyz se pokusim o upload nejaky connect zrejme probehne, protoze se mi pak na seriovku od ESP vypise hlaska, ze nastala chyba. Zkousel jsem core 2.2.0, 2.1.0 a tu posledni 2.3.0 a IDE .7 a .9 na konci Zkousel 2 notebooky s W7 a W10 a chova se to stejne.V tom AP modu mi nefunguje ani mDNS. Resp. jednou se to samo rozjelo, ze jsem i prikazem ping videl nazev zarizeni, ale pak uz nikdy vice . Ale to OTA me v tuto chvili trapi vice 🙂 Po nedeli vyzkousim teda v klasickem client rezimu.

          1. super, dekuji moc!!! Ja to hned v pondeli testnu. Hraji si s ESP a Arduinem vubec teprve chvili. Tvuj konfigurator me opravdu nadchnul 🙂 Zprovoznim si nejaky jiny AP a vyzkousim klient rezim. O tom mDNS si prectu. Ale jak rikam, jednou se to i tak rozjelo, fungoval ping i nazev stranky v mozile. Do prvniho restartu nebo noveho uploadu, to uz nevim.

  4. Dobrý den
    rozhodně přivítám jakýkoliv další projekt pro začátečníky. Čtu zde o problému s AP mě se to rozjelo docela dobře a i fungovalo (než mi odešel stabilizátor na 3,3V 🙁 ) tak že ted čekám na nový modul a uvidím.

  5. Po delší odmlce sleduju dění – je to zrovna něco, co bych rád použil, dělám termostat pro spínání oběh. čerpadla bazénu, čidla DS18B20, I2C displej, relé – tohle všechno mám na ESP funkční, jenom bych rád web rozhraní, a trochu nechápu program – když načítání hodnot z čidla je jenom ve void setup, jak to, že se to obnovuje? Co má za funkci v embHTML h na začátku: PROGMEM = R”=====( ?
    – Pokud do html doplním nějakej vstup, třeba radiobuton, nebo pole formuláře, jak to dostanu do proměnné pouzitelné v IDE? (HTTP GET) – chtěl bych tím zároveň něco ovládat…
    Dík za info.

    1. Takže popořadě:
      1. načítání ve skutečnosti není v setup(), je tam jen definice toho, co má server udělat, když zjistí dotaz na teplotu (server.on() ). To, co je za tím je ekvivalent zápisu metody – konkrétně tohohle:
      void getTemp(void)
      {
      read_sensor();
      char response[50];
      snprintf(response, sizeof(response), "Temperature: %s °C", str_temperature);
      server.send(200, "text/plain", response);
      }
      ...
      server.on("/temp", getTemp);

      Můj názor je, že to je kvůli líným programátorům 🙂
      2. R” slouží (tuším od c++11) pro snadnější definici raw řetězců (string literal) – více třeba zde http://en.cppreference.com/w/cpp/language/string_literal
      3. tlačítko, nebo pole formuláře se přenáší jako parametr GET/POST a hodnota je dostupná pomocí .arg() metod webového serveru – je potřeba nastudovat knihovnu ESP8266WebServer a příklady k ní

      1. tak to první jsem přehlídl…
        Zkouším něco najít k ESP8266webserver library, a krom příkladů, co mám v IDE jsem nic k počtení neobjevil, asi neumím ten gůgl správně nakrmit… Něco s ..arg() jsem našel v příkladu simply authentication, ale to asi nedám. Zkusím zatím aspoň aby to malovalo teploty z čidel a tohle budu řešit až potom. Dík za bleskovou odpověď.

        1. Dokumentace ke knihovnám ve čtecí formě nejspíš nikde nebude, “nastudovat” jsem myslel třeba to, jak to dělám já – procházím zdrojáky příkladů, k tomu si otevřu hlavičkový soubor knihovny a snažím se pochopit, jak pracuje. Popřípadě se pro upřesnění kouknu přímo do zdrojáku knihovny, jestli jsou moje úvahy správné…

  6. POZOR! Jeden ze čtenářů mi hlásil potíže s projektem, které se najednou objevily. Znovu jsem celý projekt prošel a objevil chybu, kdy mi v řádku server.send(200, "text/html", PAGE_INDEX); chybí uvedení FPSTR – správně tedy server.send(200, "text/html", FPSTR(PAGE_INDEX)); . Překladač to sice zvládne přeložit a většinou to funguje, nicméně chyba to je 🙁 Za chybu se omlouvám, archív ke stažení byl opravený…

  7. zdravím
    Pár dni si hraju s deskou wemos D1 mini. Stáhl sem si váš projekt, ale bohužel nejde zkompilovat a vyhazuje mi toto:
    sketch\dhts.ino.cpp.o:(.text._Z11read_sensorv+0x30): undefined reference to Interval::expired()'

    sketch\dhts.ino.cpp.o:(.text._Z11read_sensorv+0x34): undefined reference to Interval::set(unsigned int)’

    sketch\dhts.ino.cpp.o:(.text._Z11read_sensorv+0x38): undefined reference to DHT::readHumidity(bool)'

    sketch\dhts.ino.cpp.o:(.text._Z11read_sensorv+0x3c): undefined reference to DHT::readTemperature(bool, bool)’

    sketch\dhts.ino.cpp.o:(.text._Z11read_sensorv+0x54): undefined reference to Interval::expired()'

    sketch\dhts.ino.cpp.o:(.text._Z11read_sensorv+0x62): undefined reference to Interval::set(unsigned int)’

    sketch\dhts.ino.cpp.o:(.text._Z11read_sensorv+0x6f): undefined reference to DHT::readHumidity(bool)'

    sketch\dhts.ino.cpp.o: In function read_sensor()’:

    E:\arduino-1.6.13\Portable\sketchbook\dhts/dhts.ino:40: undefined reference to DHT::readTemperature(bool, bool)'

    sketch\dhts.ino.cpp.o:(.text.setup+0x44): undefined reference to getOurIP()’

    sketch\dhts.ino.cpp.o:(.text.setup+0x48): undefined reference to DHT::begin()'

    sketch\dhts.ino.cpp.o:(.text.setup+0x8a): undefined reference to getOurIP()’

    sketch\dhts.ino.cpp.o:(.text.setup+0x9d): undefined reference to DHT::begin()'

    sketch\dhts.ino.cpp.o: In function loop’:

    E:\arduino-1.6.13\Portable\sketchbook\dhts/dhts.ino:103: undefined reference to DHT::DHT(unsigned char, unsigned char, unsigned char)'

    sketch\dhts.ino.cpp.o: In function function’:

    e:\arduino-1.6.13\portable\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2/functional:2452: undefined reference to DHT::DHT(unsigned char, unsigned char, unsigned char)'

    sketch\nbnsota.cpp.o:(.irom0.text+0x0): undefined reference to WiFiDeviceName’

    sketch\nbnsota.cpp.o:(.irom0.text+0x8): undefined reference to WiFiConfig::begin(int, unsigned char, void (*)(wificonfigstate_t))'

    sketch\nbnsota.cpp.o:(.irom0.text+0xc): undefined reference to NBNS::begin(char const*)’

    sketch\nbnsota.cpp.o: In function nbnsotasetup(void (*)(wificonfigstate_t))':

    sketch/nbnsota.cpp:19: undefined reference to WiFiConfig::begin(int, unsigned char, void (*)(wificonfigstate_t))’

    sketch/nbnsota.cpp:19: undefined reference to NBNS::begin(char const*)'

    sketch\nbnsota.cpp.o:(.text._Z11nbnsotaloopv+0x8): undefined reference to NBNS::poll()’

    sketch\nbnsota.cpp.o: In function nbnsotaloop()':

    sketch/nbnsota.cpp:33: undefined reference to NBNS::poll()’

    collect2.exe: error: ld returned 1 exit status

    exit status 1
    Nastala chyba při kompilaci u desky WeMos D1 R2 & mini.

    Mohl by jste me prosím nakopnout kde muže být problém?
    knihovny mych měl mít správné, testovací program pro DHT zkompilovat jde

    děkuji

    1. Dobrý den,
      problém bude asi v Arduino preprocesoru, přesneji v jeho autorech. On se totiž chová verze od verze trošku jinak (a Vy používáte jinou verzi IDE), takže přejmenujte adresář libraries na src a opravte odkazy v dhts.ino, nbnsota.h, nbns.cpp. Pak by už mělo být vše ok.

      1. Měl jsem nepořádek v knihovnách IDE, tak jsem ho dočista odinstaloval a nahrál nové. A první jsem chtěl vyzkoušet tvůj příklad. (Poté, co jsem zjistil, že balíček obsahuje opravdu všechny potřebné komponenty.) To mě na Arduinu trochu děsí, když musím laborovat a hledat, jaké knihovny autor měl na mysli. Taky rychlost ladění je v případě Lua nesrovnatelně rychlejší. Poctivě jsem podle návodu instaloval tvoji zazipovanou knihovnu a sputsil kompilaci. Samozřejmě to skončilo chybou, s kterou bych si neporadil. Ale prošel jsem si tuto diskuzi a zjistil, že nejsem první. Stejná chyba je tu už popsána. Bez tvého popisu bych to vzdal, ale jdu zkoušet server, právě mě doběhla kompilace.

      2. Ahoj, chtěl jsem tento projekt použít jako studijní příklad, jsem v Arduino IDE naprostý začátečník, ale se změnami popsanými výše jsem si poradil (přejmenujte adresář libraries na src a opravte odkazy v dhts.ino, nbnsota.h, nbns.cpp).
        Nicméně stále to nelze zkompilovat, skončím s chybou:
        sketch/src/interval/interval.cpp:6:21: fatal error: arduino.h: No such file or directory
        #include

        ^
        compilation terminated.
        exit status 1
        Předpokládám, že se opět jedná o nějakou změnu v chování Arduino IDE, já mám verzi 1.8.2.
        Mohl bych poprosit o kontrolu popřípadě o aktualizaci projektu? Děkuju pěkně předem

          1. A koukám, že to tu žere špičaté závorky i s obsahem… no přišel jsem na to, že musí být #include Arduino.h, byla chybka v malém “a”. A poprosím o konsolidaci postů, ať tu nespamuju 🙂

        1. Ahoj,
          je to na Windows, nebo na Linuxu? Na Linuxu to je takhle odjakživa, ale na Windows to tak nebývalo…

          1. na Linuxu. Nojo, k programování se vracím po dlouhé době, tak mi to někdy nedochází tak rychle. Ale aspoň je tady na to taky už upozorněno, když je to v tom příkladu na stažení – já vim, je to určitě schválně jako test ostražitosti 🙂
            Každopádně děkuji za články o ESP8266, já se o této prima věcičce dozvěděl teprve nedávno a zaujalo mě to natolik, že jsem oprášil i Raspberry, koupil Wemos D1 mini a pár dalších hračiček a zase si hraju. Jednou z toho bude snad i něco užitečného 🙂

  8. Dobrý den, mám takový blbý dotaz. Pročítal jsem vaše stránky, možná jsem to přehlídl. Nahrál jsem váš fimware, funguje bez problému. Nastavil jsem AP, ale potřebuji změnit nastavení sítě. Jakou adresu má konfigurace?
    Děkuji za vaši odpověd.

    1. Dobrý den,
      pokud je zařízení už asociované, tak se změnit konfigurace bohužel nedá. Můžete ale vyvolat nové nastavení aktivací parametru forceConfigure při volání begin(…) – většinou tento parametr nastavuji dle nějakého uživatelského tlačítka, takže pokud ho držím stisknuté při zapnutí napájení, tak se spustí konfigurace. V ní se pak dá nastavit i statická adresa.

  9. Děkuji za vaši odpověď. Ještě bych měl na vás dotaz. S Wemos D1 pracuji krátce ,jakým způsobem lze vymazat program z paměti. Konkrétně smazat na tovární hodnoty celý chip.
    Děkuji.

    1. Program lze vymazat pouze přehráním jiným programem, nebo pomocí nástroje ESP Flash tool za použití blank_xM.bin (hledejte na internetu). Další možností je pak výmaz pomocí esptool.py (je na Githubu). Pokud máte na mysli výmaz uložených parametrů pro připojení k WiFi, tak stačí použít WiFi.disconnect()

  10. Právě nastala situace, že jsem nahrál jiný program. Ale stále je aktivní wifi síť ESPPBSetup. Takže by to chtělo kompletně smazat. Děkuji za vaši ochotu.

    1. To vypadá na uložené parametry v SDK oblasti (i když zrovna ESPPBSetup se neukládá, protože je WiFi.persistent(false), takže je to přece jen trošku podivné). Zkuste použít WiFi.persistent(true) Wifi.mode(WIFI_STA) a WiFi.disconnect() – tohle by mělo vymazat všechna uložená nastavení…

  11. Dobrý den,
    měl bych dotaz k zobrazované teplotě… ukazuje to bez problému i záporné teploty? – mráz?

    Nahrál jsem program bez změn, ale nejnižší teplotu mi to ukazuje 1.

    Nemáte někdo podobný problém? 🙂

    Děkuji

    1. Dobrý večer,
      program vypisuje měřené hodnoty i na sériový port (rychlost je 9600Bd), takže se zkuste podívat, jestli tam záporná čísla jsou. Pokud tam nebudou (a být by určitě měly), tak může být problém v převodních funkcích dtostrf()…

      1. Dobrý den,
        tak jsem se k tomu dostal a serial port vypisuje toto:

        Program started…
        Our IP: 192.168.1.171
        Humidity: 30.00 % Temperature: 1.00 °C
        HTTP server started
        Humidity: 30.00 % Temperature: 1.00 °C
        Humidity: 30.00 % Temperature: 1.00 °C

        testováno se dvěma DHT11 – vyloučena chyba kusu.

        Ještě se na to pokusím podívat večer s jiným čidlem co tu mám

        1. Hmm, tak to vypadá na problém dstrtof – bohužel implementace pro ESP8266 už dříve měla chybu, takže je možné, že není stále vše dotažené. Zkuste místo toho skript upravit a použít vestavěného převodu v objektu String – asi nějak takhle:
          1. teplotu a vlhkost z pole char předělejte na String
          2. místo dstrtof použijte String(f, 2)
          snad se to spraví…

  12. Právě zkouším něco napsat ve Wiring, ale moc se mi teda nedaří. Mám docela problémy. Mimo jiné i s formátováním výstupu. Můžeš mi prosím přiblížit, co jsi myslel tím String(f,2)?
    Když jsem potřeboval oříznout float, tak jsem na to vymýšlel funkci, protože v popise jazyka jsem nic rozumného nenašel.

    String crop(float numb, int how) {
    String Spom =String(numb).substring(0, String(numb).indexOf(“.”)+how);
    return Spom;
    }

  13. Děkuji, předtím jsem na to koukal, ale float jsem přehlédl, je to poslední položka v příkladech. Takhle to bude hodně snadné.
    Dovolil bych si ještě nějaké otázky. Hovořím teď o ESP8266 embed Arduino. Jako v podstatě svůj první pokus jsem přepsal vlhkoměr s DHT11 z Lua do Arduina. Použil jsem standardní knihovny
    #include //Adafruit
    #include
    #include
    Protože chci, aby byla rychlá odezva, tak jsem zkoumal možnost trvalého spojení definicí server.sendHeader(“Connection”, “Keep-Alive”);
    Ale v hlavičce odpovědi serveru se objevilo něco takového: “Connection : Keep-Alive, close”. To je jedna věc, ale druhá asi zásadnější je, že nevím jestli server spojení po každé odpovědi uzavírá nebo ne. Pokud uzavírá, pak se nemusím párat s hlavičkami. S tím souvisí také skutečnost, že jsem někde četl, že server akceptuje pouze jednoho klienta. Je to pravda? Pak by spojení Keep-Alive nebylo možné použít vůbec. A poslední věc, používám funkci
    server.on(“/”, HTTP_GET, []() {
    }); ale netuším, co znamenají ty hranaté a kulaté závorky v poli parametrů, hledal jsem, ale asi ne dost dobře.

    1. Přiznám se, že netuším, jestli server spojení uzavře – koukni do zdrojáků, tam by to mohlo být zřejmé. V každém případě je pravda, že server běží přes jedno spojení.
      Zápis []() je zápis tuším tzv. lambda výrazů (od C++v11), kde [] znamená… ále – mnohem dokonalejší popis, než bych sesmolil já je třeba tady http://en.cppreference.com/w/cpp/language/lambda . Zkráceně to znamená, že líní programátoři můžou zapisovat krátké funkce přímo, aniž by museli nejdříve napsat a pojmenovat funkci a pak její volání přiřadit 🙂 Pokud chceš, aby vlhkoměr byl pro více klientů, tak bych to asi udělal tak, že se nejdřív natáhne hlavní stránka a hodnoty se budou přenášet AJAXem s tím, že to bude minimalistický přenos. Další možností pak je použít pro přenos hodnoty websocket (a nezapomínat soket ihned po přenosu uzavřít).

  14. Dík za odpověď. Když jsem koukal do tvojí Arduino šablony, tak jsem se ujistil, že jsme vlastně staří známí. Tušil jsem to, ale copyright mě utvrdil. Pokud si dobře vzpomínám, tak od tebe jsem měl plošný spoj na tu obrovskou paměťovou desku k Sordu, kterou jsem si dělal včetně WD FDD řadiče a pak s ní natěšeně provozoval CPM.
    Hezký den Pavel

  15. Dobrý den.
    Vyzkoušel jsem Vaše řešení a funguje výborně.
    Jen bych chtěl poprosit jak zajistit aby se stránky samy refrešovaly bez tlačítka?
    Předem díky.

    1. Dobrý den,
      myslím, že se hodnoty občerstvují po 100ms – koukněte do embHTML.h – je to tam v JavaScriptu a je použita setTimeout() metoda (tedy pokud jsem to takto uveřejnil a není to jen nějaká moje novější pokusná verze. A jinak nejprimitivnější metoda je použití meta tagu refresh, třeba takto
      [zobak vlevo]meta http-equiv="refresh" content="5"[zobak vpravo]

      1. Se setTimeout() jsem si hrál, ale nějak to nešlo.
        Meta tag funguje. Díky moc.
        Jen dotaz: Nepřemýšlíte o tvorbě jednoduché adnroid app propojené s ESP8266?
        Na internetu jsem pár projektů našel, ale většinou je to dost chaotické.

        1. Není zač. O tvorbě aplikace jsem zatím neuvažoval, ale jdou mi z Číny plošné spoje na zařízení, ke kterému je android widget pro zobrazování. Hardware bude pod open source licencí, firmware (pravděpodobně) také uveřejním a pokud dostanu svolení od autora widgetu, tak ho zveřejním také.

  16. Hezký den. Ten projekt je fajn, překopal jsem jej na BME280, jen by jsem potřeboval aby se údaje v prohlížeči aktualizovaly automaticky v nějaké periodě místo klikání na tlačítko. Poradíte? Děkuji

    1. Dobrý den,
      máte několik možností:
      1. doplnit meta tag refresh do HTML, pak se bude stránka občerstvovat sama. Nevýhody: občerstvuje se sama 🙂 (překresluje se celá) a minimální občerstvení je 1 sekunda, Výhody: nejjednodušší úprava
      2. přepsat html stránku na AJAX (tzn. doplnit Javascript, doplnit na server stránku jen s daty). Nevýhody: složitější úpravy kódu, Výhody: volně nastavitelná doba občerstvování, nepřekresluje se celá stránka
      3. přepracovat projekt na použití webových soketů. Nevýhody: nejsložitější zásah, Výhody: flexibilita, rychlost – pokud to jednou uděláte takto, tak už nebudete chtít měnit 🙂

  17. Dobrý den.
    Toto mne zaujalo a tak sem si to chtěl jen tak postavit, jenže nevím co mam kde spatně háže mi to tuto chybu.

    exit status 1
    Nastala chyba při kompilaci u desky NodeMCU 0.9 (ESP-12 Module).

    1. Dobrý den,
      to je způsobené tím, že je projekt 2 roky starý a mezitím došlo ke změně jak chování IDE (nutnost přejmenovat adresář), tak změně ESP8266 Core (integrace NBNS do jádra). Do článku jsem uložil upravený projekt, testovaný pod IDE 1.8.7 a s ESP8266 Core 2.4.2…

  18. Ahoj asi budu znit hloupe ( dneska jsem se na to po 1 podival ) ale jakym zpusobem bez nastaveni ssid a hesla muzu nastavit pripojeni k wifi siti ……. ….. nastavit wifi pres wifi ? 🙂
    Dik

    Kompilace je ok, ale pri otevreni terminalu jedine co ziskam je ze vypise text ze program funguje…….

    1. Ahoj,
      jasně, WiFi se konfiguruje přes WiFi – pokud se zařízení nedokáže připojit do sítě, tak vytvoří vlastní AP s otevřeným přihlašováním s webovým serverem, přes který se dá celé připojení nakonfigurovat. Je to zmíněno i v textu – knihovna WiFiConfig.

  19. Zdravím,děkuji za pěkný návod.
    Bohužel jsem nepoužil Wemos, tak nevím jak mám zapojit čidlo DH11
    Nemáte někdo pinout? 🙂

  20. Dobrý den,

    nemáte prosím dostupný kód pro dhts s více komentáři pro lepší pochopení celého programu. Děkuji za odpověď.

      1. Dobrý den,

        Tento program se mi velmi líbí (ten wificofig je super) ale jsem bohužel začátečník, a není mi jasná část s těmi obslužnými handlery. Zkouším udělat ovládání vjezdové brány (tři relé – otevři, zavři, částečně otevři) se zpětnou informací o stavu brány (jazýčkový kontakt v poloze zavřeno) a když už tam to ESP bude tak bych měřil teplotu a vlhkost. částečně to již má za pomoci aplikace blynk ale zvažuji že webserver s jednoduchou html by byl asi lepší. Stává se mi ale že html stránka nelze po každé načíst, načítá se sporadicky, seriová linka ale vypisuje chod programu tak jak má. zkoušel jsem to nahrát i do jiného esp. Nevím zda je problém v prohlížeči nebo v nastavení routeru?

        Děkuji za odpověď.

        1. Dobrý večer,
          dobře, takže: k WiFiConfig – nejnovější verzi naleznete vždy na https://git.xpablo.cz – je ve veřejných repozitářích, stejně jako knihovna interval. Co se týče handlerů – předpokládám, že jde o server.on() konstrukce a není jasná lambda funkce – lambdu můžete nahradit normální funkcí – prostě to, co je mezi {} přesuňte do funkce, kterou budete volat místo celé konstrukce [](){….}. Ta funkce se zavolá, pokud webový server detekuje, že URI končí na zadaný endpoint. Pokud se webová stránka načítá sporadicky, tak to může být tím, že v obslužné metodě na něco dlouho čekáte – obsluha musí být co nejkratší. Více poradit bez konkrétních informací nedokážu…

  21. Dobrý večer,
    děkuji za informace, s tím načítání html stránky je to tak že mi to dělá i když tam nahraji Váš příklad bez zásahu do něj s wificonfigem není problém, ale pak je problém načíst stránku s informací o teplotě. Zkoušel jsem nahrát i fukční příklady z jiných webů a načtení stránky je také problémové, přesto že dle sériového monitoru program běží.

    1. Tohle vypadá na problém s uspáváním WiFi – pro klientskou aplikaci se hodí kvůli úspoře energie, ale pro serverovou aplikaci nikoliv. Poznáte to relativně snadno – zkuste si pingat na to ESP, pokud se bude odezva lišit v cca ve dvou řádech, tak je WiFi část uspávaná a je třeba ji nechat trvale zapnutou.

      1. Dobrý den,
        Ping je:
        Ping statistics:
        Packets: Sent = 100, Received = 100, Lost = 0 (0% loss),
        Approximate round trip times in milli-seconds:
        Minimum = 1ms, Maximum = 70ms, Average = 6ms

        O dva řády to není, zeptám se v tom vašem příkladu je to uspávání nastaveno? Případně zda by jste mě prosím mohl navést na nějaký příklad kde je to řešeno. Děkuji.

  22. Ahoj Pavle, mám prosbu. Hrál jsem si s vlhkoměrem:
    https://www.fancon.cz/esp8266-humi-server-klient/arduino-humi-server-client.html
    Všechno opravdu krásně funguje. Jen jediná věc mi kazí radost. Jednou za čas se perfektní odezva serverové části změní z cca 80 – 200ms na 5s + (80 až 200ms). Prostě najednou naroste o 5s. Zkoušel jsem zjistit kde to vázne a taky hledal hodiny na webu, ale na nic jsem nepřišel. Nesetkal ses s tím někdy, je to odstranitelné? Na druhé straně je pravda, že to jinak nádherně funguje a je to i s touto vyjímkou dokonale stabilní. Ale i tak bych to rád napravil.

    1. Ahoj Pavle. Původně jsem si myslel, že to může způsobovat uspávání WiFi (wifi sleep mode), ale to rozhodně neudělá 5 sekund, tak maximálně 2. Pokud můžeš, tak zkus zjistit, jestli se zpomalí GetSensor(), nebo SendData() – někde to zpomalení vidět bude. Já například sleduji počet průchodů loop() smyčkou a měřím tím (primitivně) zatížení CPU, takže bych zkusil sledovat, jak dlouho trvá vykonání těch funkcí a zobrazil to třeba do webu.

  23. Právě že měření času nikde neukazuje prodlevu, to jsem zkoušel jako první. Všechno se koná v řádu ms. Vypadá to, jako kdyby se v té prodlevě zastavilo čítání millis.

    1. To by znamenalo, že některá knihovna zakazuje přerušení a na něco čeká. Teoreticky by to mohlo být kvůli clock stretching na I2C, ale nesetkal jsem se s tím. Jaké máš popotahováky na SDA a SCL?

  24. Jsou tam klasicky 2x4k7. Asi jediná cesta bude si to čidlo přinést, dát si ho na serial a nechat vypisovat tracing se zapnutým časem na konzole. Těch 5 s musí být někde vidět. No, mám na to čas. Mám covid a tak jsem v karanténě.

  25. Tak jsem disabloval všechno, jen http server běžel a dělalo to totéž. Buď http server nebo nějakej WiFi management.

Komentáře nejsou povoleny.