ESP8266 – Wifi konfigurace trochu jinak – podruhé a (snad) ještě lépe…

espwifisetupV2Před nedávnou dobou jsem uveřejnil Arduino knihovnu pro konfiguraci WiFi modulů, postavených na čipu ESP8266. Bohužel ale knihovna obsahovala jednu drobnou chybu – režim práce AP/STA se neuložil do EEPROM díky nutnosti volání metody Commit, na kterou jsem zapomněl. Protože ale mám teď bohužel díky mému zdravotnímu stavu a pokynům lékařů poněkud více času, který nemůžu věnovat práci, tak jsem se ke knihovně vrátil, stávající chybu opravil a modul vylepšil o lepší signalizaci do uživatelské aplikace.

Protože získání IP adresy a MAC adresy je díky dvěma možným režimům práce (AP/STA) také poněkud složitější, tak jsem knihovnu rozšířil i o metody, které celý mechanizmus zapouzdřují a umožní snadnější použití.

Nová knihovna je ke stažení jako obyvkle zde.

POZOR, POZOR!!! K dispozici je novější verze knihovny, umístěná zde.

WiFiConfig V2
WiFiConfig V2
WiFiConfig_V2.zip
5.4 KiB
2100 Downloads
Detaily

40 komentářů u „ESP8266 – Wifi konfigurace trochu jinak – podruhé a (snad) ještě lépe…“

  1. Chcem sa spítať či je možné poslať cez ESP8266 jednoducho data (len paket) cez router do dalšieho ESP8266, ako keby ce “serial port” ? Ďakujem za odpoveď

    1. Ano, tohle je možné a dokonce poměrně snadno. Také je možné to, že jeden ESP modul se chová jako AP a vytvoří miniaturní lokální síť pro další ESP moduly.

      1. Môžem Vás poprosť o jednoduchý návod alebo odkaz na stránky s touto tématikou pre začiatočníkov. Ďakujem

  2. Dobrý den, stává se mi, že asi po 10-ti hodinách provozu se mi ESP odpojí od WIFI (nebo zatuhne – nevím). Lze nakonfigurovat nějaký WatchDog, který by mi případně provedl reset? Díky za radu, David

    1. Dobrý den,
      nenapsal jste moc podrobností o aplikaci a použitém překladači, takže jen obecně – prověřte, zda máte volanou metodu wifi_station_set_auto_connect(true) po asociaci s AP – zajišťuje, že se při odpojení od WiFi AP pokusí znovu asociovat, dále zkuste během běhu aplikace občas prověřit stav WiFi spojení (pokud používáte Arduino, tak WiFi.status() by měl mít hodnotu WL_CONNECTED ). Neviděl bych to jako problém zatuhnutí modulu – ve většině aplikací běží watchdog automaticky…

      1. Dobrý den, díky za vstřícnou odpověd. Jedná se o mé první pokusy s ESP, proto se omlouvám za “školácké” chyby. Přesně toto “nakopnutí” jsem potřeboval. Pro své pokusy jsem použil scripty, kde se metoda wifi_station_set_auto_connect(true) nevolá. Což je špatně, otestuji to. Ještě bych požádal o jednu obecnou radu: Pokud nahraji do ESP nějaký .lua soubor s chybou, provádění programu po chybě “vytuhne” a mě se moc nedaří nahrát jiný soubor. Vždy musím cca 10x za sebou provádět HW reset ESP a snažit se spustit FORMAT. Teprve po úspěšném vymazání mohu opět experimentovat. V ESP mám nahraný init.lua, který následně spouští vlastní program. Jak správně postupovat při testování programu? Používám ESPlorer v0.2.0 a v ESP mám FW nodemcu_0_9_6, bez Arduina.

        1. Dobrý den,
          bohužel s LUA moc neporadím – po prvotním nadšení z toho interpreteru jsem ho opustil kvůli problémům s dlouhodobou stabilitou běhu a nemožností používat funkce z SDK API. Jeden nápad bych ale přece měl – do init.lua před spuštěním programu dejte zpoždění pár sekund. Vytvoří Vám to prostor pro ovládnutí modulu. Tuhle techniku jsme kdysi úspěšně používali i v práci…

  3. Dobrý den,
    pokouším se aplikovat Vaši knihovnu, ale bohužel se mi to nedaří. Používám modul na bázi ESP-07. Po nahraní projektu normálně naběhne AP pro nastavení Wifi. Vyberu svoji wifi síť a nic. Pouze na sériovém portu se objeví text
    ets Jan 8 2013,rst cause:4, boot mode:(1,6)
    wdt reset.
    Pokud projekt upravím bez Vaší knihovny tak je vše OK.
    Dočetl jsem se, ze by se GPIO0 měl podržet přes odpor na 3.3V. Ale to mi nedává smysl, neboť by to nefungovalo nikdy.
    Nemáte s tímto nějakou zkušenost.
    Děkuji

    1. Dobrý den,
      díky za podnět – wdt reset znamená, že se aktivoval vnitřní reset ESP modulu watchdogem. Nesetkal jsem se s tím, ale zkuste po volani WifiConfig.begin(…) do Vašeho zdrojového kódu napsat yield(); . Pokud to pomůže, tak je to tím, že další inicializace trvá tak dlouho, že přdiadný čas, strávený v .begin metodě už aktivuje wdt. Pokud to nepomůže, tak zkuste dopsat ladící sériové výstupy na místa do Vašeho kódu, abychom mohli detekovat zdroj problému. GPIO0 se skutečně připojuje přes odpor na +3V3. Je to z toho důvodu, že je tím garantovaná napěťová úroveň při startu a je tím zvýšena celková spolehlivost startu uživatelské aplikace.

      1. Dobrý den,
        děkuji za reakci. Každopádně chyba byla v chybějícím odporu z 3,3V na GPIO 0. Můj Nodemcu je na tomto pinu vybaven tlačítkem “Flash” a logikou pro ovládání nahrání programu z převodníku USB->Serial. Po dodání odporu je vše OK. Děkuji.

  4. Zajímavá věc, já bych potřeboval tento modul použít jako webserver, ve spojení s arduinem pro mini (asi se bez něj neobejdu kvůli pwm a počtu portů) a potřeboval bych zobrazovat na web stránce data, která pošlu po sériovém portu, příp z www stránky posílat data do arduina podobným způsobem, jak na to? ESP8266 jsem zatím zkoušel jenom v režimu AT příkazů.

  5. WIFI config už mi chodí, jenom otázečka: jak zajistit pevnou IP adresu pro webserver? jedna možnost je nastavit ve wifi routeru přiřazení podle mac, ale jiná možnost by nebyla? -třeba do wificofigu dodat zatržítko IP z DHCP serveru, a okýnko na IP adresu… pak by to podle mě bylo dokonalý.
    Pokud modul nenajde danou wifi síť, spustí se znovu konfigurační stránka? jestli jo, kde by se to dalo zrušit (funkce jenom na tlačítko, aby to někdo omylem nerozvrtal)

    1. S tím DHCP to není špatný nápad – původně jsem ale chtěl, aby ta knihovna byla co nejmenší. Dopíšu to (už tam stejně mám jako novinku Captive portal a DHCP registraci jména, takže aspoň toho bude na publikování víc). Pokud se modulu nepodaří připojit běhe startu, tak spustí konfigurační režim – takhle to bohužel je napsané, ale zkusím vymyslet, co by se s tím dalo udělat.

  6. Zdravím. Vyřešil jste to prosím nějak? Potřeboval bych, aby se to pořád pokoušelo připojit na uložené AP. Pouze po stisknutí tlačítka by přešlo do nastavavovacího modu.
    Děkuji

    1. Zatím pouze částečně – o víkendu bych chtěl “vypustit” verzi, ve které je i doplněná možnost statické ip konfigurace. Myslel jsem si, že to zvládnu přes svátky, ale dopadlo to jinak…

      1. Tak pánové nová verze tento víkend nebude. Je mi tak zle, že jsem rád, že jsem rád… Strpení prosím.

  7. Kdybych to na řádku 261 změnil na:
    if (false == testWifi(cb))
    //setupAP(cb); // modul se nepripojil – startujeme AP rezim
    ESP.reset(); //zkusime restartovat
    Tak by to mohlo fungovat?
    Mám to v rozvaděči a nějak se to asi restartuje a nepřipojí se to.

    1. Bude se to restartovat stále dokola, ale fungovat by to mohlo – já původně zamýšlel použití automatického znovupřipojení, ale pokud Vám to takhle stačí, tak proč ne… Není ten rozváděč náhodou plechový?

  8. Ano, je plechový. Nechal jsem sice otevřené dveře. Je tam spousta stykačů. Rušení?

    1. Pokud se ESP restartuje, tak ano. Pokud se navíc pak nepřipojí, tak je tam nejspíš moc plechu/kovu ve směru mezi ESP a anténou AP. Už jsem se s podobnou interferencí u ESP setkal. Pomohlo použití ESP-07 a externí antény, jeden obrovský elektrolyt na napájení a ošetření RESETu.

  9. Já mám wemoos D1 mini, to bude asi to samé?
    Jak velký elektrolyt?
    Ošetření RESETu – jako RST +3.3V přes 10K odpor?

    Tem wemos je poněkud divný. Dodělal jsem ladící výpisy do vaši knihovny (Serial.println) a záhadné chování:
    Na začátku se vypíše ve wificonfig ssid a password.
    A pak místo výpisů v testWifi to vypíše :
    ets Jan 8 2013,rst cause:2, boot mode:(3,7)

    load 0x4010f000, len 1264, room 16
    tail 0
    chksum 0x42
    csum 0x42
    ~ld

    a pořád dokola. To obyč ESP nedělalo. I když se mi aktualizovaly v IDE boards a jsou trochu jiné.

    1. Hmm, tak to pada na nejakou vyjimku. Jakou mate verzi IDE a jadra?
      Odpor jsem mel 2k2. Kondenzator byl 470uF – nemel jsem vetsi. Akorat ta desticka byla Witty. S Wemos jsem zatim nemel jediny zadrhel.

  10. Dodělejte prosím možnost mazat a editovat komentáře. Já něco po hodinách bádání napíši a když je to venku, tak většinou okamžitě zjistím, že jsem to zblbnul já a už to nejde vzít nazpět 🙂
    Chyběly doplnit závorky v if podmínce.

    1. Hlavně, že jste to vyřešil :-). S tou editací komentářů je problém – i takto mrňavý web bývá dost často terčem pokusů o prolomení (včera například 10 spamů a 2 pokusy o procházení adresářů), takže je přihlašování blokované.

  11. Já se teď taky k žádnýmu bastlení nepropracoval, protože mě skolila choroba a teď doháním povinnosti. Ale s tím ručním zadáním IP bych teda byl rád… Na vzhled bych se vybodl, havní je funkčnost. Spíš vidím problém se sw kontrolou toho, jestli to někdo napsal dobře, tj. udělat asi tři pole do kterejch se zapíše číslo a ověří se, že není větší než 255…nevím přesně, jestli http příkaz form umožňuje i tohle, ale asi ne. A tak jak psal šimoník, konfig s default ssid a IP znovu spustit po resetu se stisklým tlačítkem podle mě stačí, jsou takhle udělaný všechny wifi krabičky co znám, tak proč ne…

  12. Takže jestli to dobře chápu, tak se zadaná ip kontroluje pomocí
    něčeho, co je součástí prohlížeče, ne pomocí nějaké služby na webu? to vypadá zajímavě, to bych mohl využít i jinde…

    1. Ano, přesně tak – validace probíhá v prohlížeči a formulář není odeslán, pokud všechny validace neskončí úspěšně. POZOR!!! Zatím to údajně neumí Safari.

  13. Hoj vsem. Mam uz neco za sebou s ESP8266. Pouzivam NodeMCU. Muj problem je, ze nemuzu proste nahradit kabel RS232. Neco uplne jednoduchyho a je jedno jake zarizeni pripojim. Proste most RS232-WIFI-RS232. Poradi nekdo ? Diky moc. Jsem uz asi pako :-(.

    1. Ahoj Marku. Odpovím raději sem, než mailem, ať můžeme diskutovat všichni… Trochu nechápu, v čem je konkrétně problém – serverovou stranu vybagruj z projektu VSP (Virtuální sériový port), který na těchto stránkách je. Odstraň nepotřebnou NVT komunikaci a fixni přenosovou rychlost na 9600. Klienta napiš úplně stejně, akorát TCP spojení otevři aktívně a ne pasivně, jako na serveru. Největší potíž bude s lokalizací obou zařízení mezi sebou, ale zase jsou dvě možnosti – buď serverové ESP spustíš jako AP s vyhrazenou sítí pro tento účel (a pak máš pevně dané IP adresy), nebo si napiš jednoduchý Discovery protokol nad UDP a klient si server může vyhledat…

      1. Diky za odpoved, ale uz mi to asi nemysli, jaaaj. Udelam program na PC nebo na android a krasne komunikuju pres RS232 na procak (pic). Pripojim se na server ESP8266 a posilam a prijimam data. Delam vse v zakladu basic :-), hold stara skola. Ale jak mam sojit dve ESP8266, tak to ku…. nejde, ach jo. Oni se i spoji, nacte client adresu, kterou mu prideli server (192.168.4.2) server 192.168.4.1, ale kurna TS232 mlciiiiii. No nic, budu badat dal. 🙁

        1. Tak jo. Budeme postupovat per partes. Nakopiruj sem casti skriptu, ktere vystavuji pasivni spojeni a zpracovavaji data. Nejak to urcite dame dohromady…

          1. Pavle zjednodusene. Diky ze jses online 🙂 Ted jsem pustil soft na tabletu. Je to na muj projekt sekacka. ESP8266 jako server, posila to data na PIC. Pokud prijde (1) zacne posilat udaje o poloze. Proste sekacka na dalkove ovladani :-D. NO a do ESP8266 jsem nahral tohle:

            –Fafo sekacka
            wifi.setmode(wifi.SOFTAP)
            cfg={}
            cfg.ssid=”Fafo_sekacka”
            cfg.pwd=”xxxxxxxx”
            wifi.ap.config(cfg)
            print(wifi.ap.getip())
            server=net.createServer(net.TCP)
            server:listen(80,function(conn)
            conn:on(“receive”, function(conn, string)
            uart.setup(0, 9600, 8, 0, 1, 0)
            uart.write(0,string)
            uart.on(“data”, 0, function(data) conn:send(data)end, 0)
            end)
            end)

  14. Hoj. Je to NodeMCU 0.9.6 build 20150704 powered by Lua 5.1.4. Pavle tak zkus neco hodit v cecku, pokud to delas v c.
    Ja to tam narvu, problem v tom nebude. Pokud se Ti samo ze chce, budu Ti moc dluzen :-). Ja se samo ze podelim, se sekackou, az to dodelam :-). Diky Marek

  15. Jenom doplnim, tohle je client. Normalne se pripoji, vypise IP pohoda, ale proste pres uart nic neposle, pako :-(.

    wifi.sta.disconnect()
    wifi.setmode(wifi.STATION)
    wifi.sta.config(“Fafo_sekacka”,”xxxxxxxx”) — connecting to server
    wifi.sta.connect()
    tmr.alarm(1, 2000, 1, function()
    if(wifi.sta.getip()~=nil) then
    tmr.stop(1)
    print(“Pripojeno”)
    print(“IP :”,wifi.sta.getip())
    cl=net.createConnection(net.TCP, 0)
    cl:connect(80,”192.168.4.1″)
    tmr.alarm(2, 5000, 1, function()
    cl:send(“Cus”)
    end)
    else
    print(“Pripojuji…”)
    end
    end)

Komentáře nejsou povoleny.