ESP8266 pro začátečníka – jak to vlastně zapojit

esphowto_webV posledních dnech jsem se několikrát setkal s problémem, že někteří čtenáři by chtěli použít samostatný modul ESP8266 (většinou ESP-12), ale netuší, jak ho zapojit, aby správně a hlavně spolehlivě pracoval. Rozhodl jsem se tedy, že napíšu článek, ve kterém se pokusím shrnout moje zkušenosti a popsat zapojení, které používám a se kterým jsem spokojený.

Nejdříve několik poučení:

  1. NIKDY nepřipojujte GPIO vývody ESP přímo na 3V3, nebo GND!!! Na některé z nich jsou při startu programu generovány signály, které můžou poškodit vnitřní tranzistory, pokud jsou zapojeny “natvrdo”.
  2. POUŽÍVEJTE KVALITNÍ NAPÁJECÍ ZDROJ – viděl jsem zoufalce, co se snažili o napájení ESP jen z 3V3 výstupu z FTDI převodníku – tohle (možná) může fungovat při nahrávání FW, ale určitě to bude zlobit při běžném běhu procesoru! Napájecí zdroje mám dimenzované na 3V3/500mA

Základní zapojení hardware vychází z doporučeného zapojení, které je vyobrazené v dokumentaci k Arduino jádru pro ESP8266

ESP_improved_stability

Postupem času jsem dospěl k mírným úpravám hodnot součástek, které popíšu dále, nejdříve ale k významu jednotlivých prvků:

Odpor R4 slouží k definování správné klidové úrovně na vstupu RESET SoC. Hodnota 10k je dostačující v laboratorních podmínkách, ale pro umístění do terénu, nebo průmyslového prostředí se mi osvědčilo snížit velikost na 4k7.

Odpor R1 slouží k definování úrovně na CHIP POWER DOWN vstupu, weak pull-up, který je integrovaný uvnitř SoC nestačí, takže je třeba připojit externí odpor 10k.

Odpory R2 a R3, společně s hodnotou na GPIO2, určují, jakým způsobem se SoC chová při zapnutí napájení. Možnosti jsou:

GPIO 0 GPIO 2 GPIO 15
UART Download Mode (Programming) 0 1 0
Flash Startup (Normal) 1 1 0
SD-Card Boot 0 0 1

Pro nás tedy připadají v úvahu UART Download Mode pro nahrávání firmware a Flash Startup pro běžný provoz. Hodnoty odporů, které se mi osvědčily jsou 4k7 jako R2 a 2k2 jako R3. Dále dávám ještě pull-up odpor 4k7 na GPIO2 – tento odpor ale není nutný, protože ESP12 zde má připojenou modrou signalizační LED, která zajistí správnou úroveň. Pokud chci ESP naprogramovat, tak to udělám tak, že GPIO0 stáhnu na GND přes odpor 120 ohmů a zapnu napájení. Počkám na probliknutí LED, GPIO0 uvolním a začnu hned nahrávat firmware.

Kondenzátor C1 slouží pro blokování napájecího napětí – multimetrem sice naměříte odběr cca 60mA, ale ve skutečnosti jsou v okamžicích vysílání proudové špičky, které sahají i přes 300mA. Proto k tomuto kondenzátoru dávám ještě paralelně kvalitní elektrolyt s kapacitou minimálně 47uF – velice hezké video s vysvětlením na toto téma je k dispozici třeba zde .

Snížená spotřeba – režim Deep Sleep

Prakticky jediná zatím prozkoumaná metoda, jak snížit odběr a tím umožnit alespoň nějaký provoz na baterie je využití DeepSleep režimu. Princip je jednoduchý – před přechodem do DeepSleep, který v podstatě celý systém zastaví, se nastaví časovač na požadovaný čas. Po jeho vypršení se na vývodu GPIO16 objeví úroveň L. Spojením GPIO16 s vývodem RESET přes odpor (bohužel hodnota odporu se občas musí laborovat – mě se zatím osvědčila hodnota 150 ohmů), docílíme restartu celého obvodu po vypršení timeoutu. Vše tedy funguje tak, že ESP je v zadaných periodách resetováno – zde musím trošku odbočit k firmware. Zjistilo se totiž, že pokud po každém startu znovu nastavujeme WiFi část pro připojení k AP, tak SDK stále přepisuje svoji vnitřní konfiguraci, která je uložená ve Flash paměti. Bohužel ale má tato paměť omezený počet přepisů, což při bateriovém napájení a častém používání Deep Sleep může vést k rychlému poškození paměti a výpadku zařízení. Obejít se to dá tak, že se zakáže SDK ukládání konfigurace do flash. Na konci článku je ke stažení nová verze knihovny WiFiConfig, která to již má takto ošetřeno (současně ošetřuje občasné poškození WiFi flash konfigurace, na které narazil pan Šimoník).

No a to je vlastně všechno… Nebo vlastně ještě ne – byl jsem jedním čtenářem, začátečníkem, požádán, abych věci ještě zjednodušoval a více vysvětloval. Víte bohužel o tomto tenhle web být neměl – nechci zde vysvětlovat základní programové konstrukce, nebo funkce všech knihoven, které jsem použil, k tomu se necítím být způsobilý – zejména pokud jsem je nenapsal já a jejich funkci znám jen ze studia jejich zdrojového kódu. Milerád vysvětlím, co bude třeba, ale rozhodně ne jako primární náplň, protože to bych nedělal nic jiného a moje projekty by stály 🙁 ledaže by pomohl někdo další…

WiFiConfig
WiFiConfig
WiFiConfig_4.3.zip
Version: 4.3
11.3 KiB
697 Downloads
Details

49 thoughts on “ESP8266 pro začátečníka – jak to vlastně zapojit”

  1. Super článek. Na mnoha webech jsem se dočetl právě o použití přímo napájecího napětí na pinech Gpio0 i CH_pd na E-12e označeného jako EN. Gpio15 pak mají přímo na zem. S takto bez odporů připojenými piny se celý modul začne dost hřát ale pokud to nemáte zapnuté dlouho přežije. Dokonce se mi podařilo zapojit omylem na pár vteřin na napájení 5V a modul to přežil a funguje – rozhodně to ale nedoporučuji nikomu zkoušet 🙂 .

  2. Ještě dodatek, já využívám jako zdroj pulsní měnič step Down odtud
    http://www.aliexpress.com/item/15924-Free-shipping-DC-DC-Step-Down-Converter-Module-LM2596-DC-4-0-40-to-1/32354635261.html?spm=2114.10010108.1000014.1.iDvQhg&scm=1007.13338.35813.0&pvid=ebdefc85-008a-413f-92e3-fae309bb566d&tpp=0

    Ale pozor tento měnič je výborný při připojení na vyšší stabilní napětí pokud ho připojíte třeba na solar a napětí bude stoupat pomalu může měnič nejprve začít kmitat na nižší frekvenci a než najede na správnou dojde k překmitum napětí oproti nastavenému až o 0,7V. Potom je vhodné použít spíše toto

    http://www.aliexpress.com/item/DC-DC-Step-Down-Power-Supply-Buck-Module-For-Arduino-4-5V-7V-to-3-3V/32593069829.html?spm=2114.30010308.3.36.QXaAvg&ws_ab_test=searchweb201556_0,searchweb201602_3_10037_10017_405_404_407_10033_406_10032_10040,searchweb201603_4&btsid=9ae1318a-62b8-4542-b4b0-499975edfdd9

  3. Je pravda, že ty největší pitomosti se webem šíří nejrychleji. Někdo namaluje GPIO zapojený přímo na Vcc nebo GND a všichni ve snaze ušetřit jeden rezistor to kopírují.
    Já bych hodnoty rezistorů viděl méně kriticky než ty, držím se spíš těch 10K. Pro wakeup jsem zkoušel rezistory cca 330R až 3K3 a vždy to spolehlivě fungovalo. Ale fajn, že šíříš osvětu, jak neustále s překvapením zjišťuji, je to velmi třeba.

  4. Jaké všechny piny je možné na esp12e použít bez omezení?
    Zkouším tlačítko na pin 16 a nějak se mi nedaří, ani základní funkce digital read. Že fungují dle očekávání piny GPIO 4,5,12,13,14 mám ověřeno, ale je třeba nějak možno využít i GPIO2,15, a zatím jsem netestoval ADC, to bude v IDE jako A0 ? A nebo jej lze použít jako další digitální pin?

  5. Ještě k tě pinům dle netu jsou D0,1,2,3,4,5,12,13,14,15,16 jen jako digitální I/O piny. TO by znamenalo že analogově lze použít ten ADC a to je vše? Nelze ty digitální piny překonfigurovat na DAC či ADC převodníky?

  6. mám vyzkoušeno analog write na 12,13,14,15
    na 4,5 I2C a dál už není skoro kam něco připojit
    pokud potřebuješ více analog vstupů stačí vybrat nějakej 3.3V I2C převodník.
    PWM na esp má možnost nastavit kmitočet a rozsah příkazy: analogWriteFreq(500);
    analogWriteRange(255); – tohle je jako klasické arduino – ale je tam trochu ošizené řešení s mízkými střídami – impils se přestane zkracovat, ale začnou být impulzy vynechávány, takže se snižuje pwm kmitočet. Testoval jsem to s 1000Hz a 1000 rozsahem pro led stmívač, a pobliknutí bylo patrné jenom když mělo ESP moc práce s webem. Gpio 16 mi nefunguje jako vstup, ale to jsem jaksi vytušil z dokumentace výše, že mě to nemá překvapovat. Tak mám vstup na gpio 2 a při stisku tlačítka se rozsvítí led na esp jako bonus…

  7. Dobrý den
    Tím analogovým výstupem na 12,13,14 a 15 myslíte to že mají DAC převodníky? V manuálu jsem to nějak nenašel. Pokud ano chodí do 3V? Díky za odpověď.

  8. Zdravím.
    Jsem bastlíř amatér a momentálně si hraji s dvěma Wemos D1 mini + DHT11 a Relay. Snažím si vyrobit “bezdrátový” termostat k plynovému kotli. Původní mi na jaře odešel 😉
    Chtěl bych se zeptat zda problém s přepisem flash při DeepSleep a konfiguraci WiFi se týká i v případě, že používám standardní knihovny? Děkuji za odpověď.

    1. Dobrý den,
      problém s přepisem se týká i vestavěného WiFi objektu, pokud používáte po každém probuzení nové nastavení konfigurace. Pracuji na řešení, ale nevím, kdy bude hotové.

      1. Díky za odpověď.
        Pokusil jsem se udělat proměnnou, která když bude na startu rovna 0, tak se provede nastavení WiFi a doufal jsem, že před uspáním tuto proměnnou změním na 1, tak aby se po probuzení již nevolala procedura pro nastavení WiFi. Doufal jsem, že tím zabezpečím, že WiFi nastavení se nastaví jednou “navždy”. Po spuštění se mi ovšem zdá, že po probuzení je proměnná vždy rovna 0 a tak i přes můj pokus dochází k novému nastavení WiFi.

        1. To se nedivte. Probuzení z deep sleep je de facto normalni reset, který nuluje ram. Zkuste využít paměť, která je v RTC oblasti… ta není po resetu modifikovaná.

          1. Tak nakonec jsem to vyřešil (opětovná konfigurace Wifi při probuzení po DeepSleep) tak, že na začátku v setup() zjišťuji informaci o typu provedeného resetu (rst_info* resetInfo = system_get_rst_info();) a v případě, že se jedná o probuzení z DeepSleep (REASON_DEEP_SLEEP_AWAKE = 5) tak se neprovádí konfigurace Wifi (standardně pomocí IF).

          2. Hele to je super nápad. Já to sice v poslední verzi WiFiConfig taky nějak (částečně) vyřešil (viz. poslední článek o šabloně), ale spokojený vůbec nejsem. Tohle je fakt dobrá vychytávka – nevěděl jsem, že mezi důvody resetu je vzbuzení z deep sleep. Díky.

        2. Mohly bych se zeptat jak presne vypadá kod pro to aby nebolo třebapři probuzeni konfigurovat wifi, neco sem vymyslel, ale nejsem si jist jestli je to spravně

          1. V setup():
            ————–
            rst_info* rinfo = ESP.getResetInfoPtr();
            reset_Info = rinfo->reason;

            if(reset_Info != 5) {
            spln(“Start…”);

            sp(F(“ResetInfo.reason = “));
            sp(reset_Info);
            sp(F(” …. “));
            sp(interval/1000);
            spln(F(” seconds waiting.”));
            delay(interval);

            spf( “Connection to %s “, ssid );
            WiFi.mode(WIFI_STA);
            WiFi.begin(ssid, password);
            while (WiFi.status() != WL_CONNECTED) {
            delay(500);
            sp(“.”);
            countConnect += 1;
            if(countConnect == 120) ESP.restart(); //Restart ESP po 60sec nepripojeni k WiFi
            }
            } else {
            spln(“Wake up from DeepSleep…”);

            sp(F(“ResetInfo.reason = “));
            sp(reset_Info);
            sp(F(” .”));

            spf( “Restoration of connection to %s “, ssid );
            }
            ————-
            Doufám, že to pomůže. I když trochu pozdě 😉

  9. REASON_DEFAULT_RST = 0
    REASON_WDT_RST = 1
    REASON_EXCEPTION_RST = 2
    REASON_SOFT_WDT_RST = 3
    REASON_SOFT_RESTART = 4
    REASON_DEEP_SLEEP_AWAKE = 5
    REASON_EXT_SYS_RST = 6

  10. Rád bych se zde zeptal na jednu věc, snad to napíšu dobře.
    Hraju si s ESP, ale rád bych přešel na praktické použití. A narazil jsem na problém s napájením. Ať už se jedná o spínání relé, nebo měření teploty, na určeném místě obvykle není 3.3V.
    Nejednoduší by bylo napájet to přímo z 230V -> 3.3V. Našel jsem zdroj/konvertor na ebay. Teoreticky by měl fungovat.
    Nicméně se chci zeptat jestli neexistuje nějaká jiné cesta. Někde jsem viděl zdroj 230v->5v ->3.3V. Ale nebylo tam vidět co používají.
    Snad jsem to napsal k pochopení a za případné chyby v termínech se omlouvám.

    1. Dobrý den,
      hodně záleží na tom, na co si troufáte a jaké máte zkušenosti s napájením z 230V. Pokud jste schopný bastlíř můžete použít napájecí zdroje jako je např. tento https://www.aliexpress.com/item/HLK-PM03-AC-DC-220V-to-3-3V-Step-Down-Buck-Power-Supply-Module-Intelligent-Household/32598030662.html?spm=2114.01010208.3.50.sD9bTw&ws_ab_test=searchweb0_0,searchweb201602_3_10056_10065_10055_10068_10054_10069_10059_10073_10017_10070_10060_10061_10052_10062_10053_10050_10051,searchweb201603_7&btsid=d94c9be8-7708-4338-8036-cf76627dbcb9 (obecně zdroje z Hi-Linku nemají špatné reference – hezká konstrukce je např. zde http://hristoborisov.com/index.php/projects/switcher-a-wifi-open-source-power-switch/ ), pokud však nemáte zkušenosti, doporučuji použít vnější zdroj, třeba 12, nebo 5V a k ESP8266 doplnit malý stabilizátor na 3.3V.

      1. Rozumím, zase tolik zkušeností s 230V nemám.
        Na ty HiLinky jsem koukal a libí se mi, pokud by zapojení bylo jen takovéhle co jsem našel http://www.fery-borec.cz/wp-content/uploads/zapojení.jpg pak by to nebylo těžké. Jestli by to takhle dostačovalo. Což nedovedu posoudit.
        Našel jsem i tyhle moduly http://www.ebay.com/itm/1PCS-AC-DC-Power-Supply-Buck-Converter-Step-Down-Module-Chip-3-5W-700mA-5V-/181946900693?hash=item2a5ce160d5 jen nevím jak jsou na tom kvalitně.

        1. No přiznám se, že v tom zapojení se moc nevyznám – nejsou popsány vývody. O tom modulu, co jste poslal odkaz nevím vůbec nic – můj názor je, že ušetříte necelý dolar za cenu velkého rizika…

          1. Díky, za odpovědi. Snad vše dopadne dobře 🙂 Šetřit se nevyplatí na tohle místě.

  11. Měl bych začátečnický dotaz, protože přecházím z AVR.
    U tohoto modulu nemusí být pro nahrání programu pomocí seriové linky žádný “bootloader”? Při správném zapojení prostě jenom přepínáním GPIO 0 určuji, zda se programuje prázdný čip, nebo používá dříve nahraný program?

    1. Bootloader je obsažený v interní ROM SoC a obsahuje sériový zavaděč, SDIO klienta a SPI flash zavaděč, jeho funkce je ovládána GPIO0, GPIO2 a GPIO15 při startu systému.

      1. Děkuji za odpověď a mám další začátečnický dotaz.

        Při programování v Arduino IDE musím u “Generic ESP8266 module” zadat také nějaké další parametry jako např. flash mode, flash freqvency, CPU frequency a flash size. Jak je mohu zjistit? Přiznám se, že u všech si nejsem jistý co přesně znamenají.

        V mém případě mám “bílé čínské” moduly označované jako ESP-201. Procesor ESP8266EX, flash paměť 25Q41BT + krystal 26MHz.
        A co znamená u flash paměti v datasheetu označení velikosti číslo v závorce 4Mb(512KB)?

        1. Na většinu těchto dotazů se dá najít odpověď na internetu – zkuste příště prosím nejdřív hledat odpovědi s pomocí google. Takže k dotazům:
          U Generic ESP8266 je většina implicitního nastavení správná, mění se pouze velikost dostupné Flash paměti dle Vašeho modulu společně s rozdělením této paměti (velikost SPIFFS) dle potřeby aplikace. Kmitočet hodin ESP nechávám na 80MHz, pouze pro časově náročné aplikace (přehrávání MP3) zvedám kmitočet na 160MHz. Reset metodu dávám na nodeMCU, ale to opět záleží na desce, kterou máte připojenou. Upload Speed dávám na 256000 (Windows) 230400(Linux) … to jsem zde ale tuším už někomu psal (nebo to bylo mailem?…. – uff, těch dotazů je už fakt hodně).
          Co se týče velikosti Flash paměti, tak ke studiu třeba zde https://www.oempcworld.com/support/mb_vs_mbits.html

  12. A jó, já jsem si nevšiml, že velikost paměti je v Mega bitech a nikoliv Mega Bajtech 🙂
    Tak to je jasná věc a moje chyba.

    Nicméně opravdu jsem dost Googloval, než jsem se osmělil zde zeptat 🙁

  13. Zdravím,
    jedná se mi o Wemos D1 mini. Když to napájím přes USB konektor /jak z PC tak z adaptéru), tak připojené relé funguje (napětí na 5V pinu je 4,48V). Když to napájím přímo do pinu 5V (naměřemo ale 5.3V) z adaptéru pro nějaký telefon, tak relé nereaguje na stav ovládacího pinu.
    Co by tam mohlo být za zádrhel? Je to tím vyšším napětím?
    Děkuji.

    1. Dobrý den,
      tady těžko radit – myslím, že pomůže jen měření. Zkuste osciloskopem měřit napětí na modulu s relé, jestli se nezhoupne. Zkuste připojit blokovací kondenzátory (spíš elektrolyty, aby byla pokrytá impulzní spotřeba při přitažení relé)… Vyšší napětí by vadit nemělo, ale bohužel v tom nevidím logiku, protože jediný rozdíl mezi napájením z USB a z +5V pinu je dioda, osazená na Wemos D1 mini (aspoň dle schématu).

  14. Díky. Nemám osciloskop, a tak jsem zkusil přepájet jiný zdroj. Začalo to fungovat, ale stále trochu podivně. Mám to na pinu D4 a stav je tedy indikován modrou led. Když dám pin do nuly, tak se ledka rozsvítí a ihned reaguje rele. Když nastavím do 1, tak ledka zhasne a rele zareaguje až po 5s. Je to podobné relé, jako je http://www.ebay.com/itm/5V-12V-24V-30A-1-Channel-Relay-Module-Optocoupler-H-L-Level-Triger-for-Arduino-/131585071322?var=&hash=item0

    Takové podivné to stále je.

    1. Hmm, tohle vypadá, jak kdyby byl přetížený výstup ESP (vstup pro ovládání relé bral příliš velký proud a chvíli trvá, než se nabije nějaká vnitřní kapacita). Nemáte náhodou odkaz na tu destičku s relé? … ještě moment – Vy to máte připojené na GPIO2? Pokud ano, zkuste použít jiný výstup (nejlépe nějaký, který nemá ani pull-up, ani pull-down). Předpokládám, že výstup (pinMode) jste neopomenul nastavit do režimu OUTPUT.

  15. Přepájel jsem to na volný D0, ale je to ještě horší. Teď neodpadne vůbec.
    Ale divné je, že když jsem ten zdroj použil přes usb (než jsem ho rozkuchal), tak to chodí jak má. Mezi tím USB konektorem a pinem 5V něco asi musí být.

  16. Tak jsem to proměřil. Při H bylo na D0 3.344V a při L pak 112,2mV.
    Potom jsem přehodil propojku způsobu ovládání relé a ejhle, už to funguje (na tom původním pinu D4 to ale nemělo vliv).
    Teď je při H těch 3.34V ale při L pak 0 a dokonce to problikává do mínusu. Už jsem měl připravenou schottkyho diodu, že ji tam ze zoufalství dám.
    Už to funguje i když mi to chování není jasné. To relé je dobré, že dokáže spínat 30A.
    Už jsem se sice ptal, ale nevím, zda jsme se pochopili. Program jde nahrát přes OTA, ale když pak zvolím Seriál monitor, tak to chce Zadejte heslo ke konzoli vývojové desky, ale i po zadání hesla se to objeví znova. Asi to takto jednoduše nejde?
    To asi nemá stejné možnosti jak port Com, aby to
    Díky

    1. Sériový monitor nejde při použití OTA použít přímo. Musíte buď vybrat zpět sériový port, nebo použijte makro TRACE a webovou stránku /trace pro výpis – sám to tak používám.

  17. zdravim, mam dotaz na ESP8266 v provedeni s vystupem na ext.antenu, pouzil jsem vzorove zapojen pro vyzkouseni funkce, vse se zobrazilo tak jak ma,nazev WiFi ale nelze se k ni pripojit pres Operu a pro zadani adresy bz se mel obevit v prohlizeci text testu, ten tam neni, asi delam nekde chybu ale nevim kde…..

    1. Dobrý den,
      asi někde chybu děláte, ale z napsaného nedokážu určit kde. V kontaktech je na mě mail – zkuste mi napsat víc informací a můžu se na to podívat…

  18. dobry den,
    prosim o radu. Mam propojene arduino s ESP8266, ktery ovladam pres AT prikazy. Modul esp8266 nastavim do deep sleep modu ( s parametrem 0 ms) a potrebuji ho probudit vzdy nejakou externi udalosti. U mne pri zaznamenanim pohybu na detektoru pohybu (pripojenem k arduinu). Nicmene jsem nepochopil jak to zapojit. V dokumentaci jsem nasel informaci: “In Deep-sleep mode, the chip can be woken up and initialized by a low-level pulse generated on the EXT_RSTB pin via an external IO.” Kdyz jsem googlil, tak jsem nasel par tipu, ale nebyl jsem z nich moc moudry, jak to cele zprovoznit.
    Kdyz propojim nejaky digitalni vystup na arduinu s RST pinem na ESP modulu (za predpokladu ze nemam propojen RST s GPIO16) a nastavim ho na HIGH a pak na LOW, tak to vypada, ze nejaky reset probehne jenze nejde se pripojit na wifi. Jinak zapojeni ESP-12 mam stejne jako doporucujete v tomto clanku.
    Dekuji.

  19. ja som pouzil esp8266 12 jako logger. Strasne mi to blbe, nekdy skolabuje a piše v serial monitoru take blbé riadky furt. Moze byt problém v breadboarde (nepájive pole) a v kontaktoch medzi kablom a plieškom na breadboarde?

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *