ESP8266 прошивка, програмування в Arduino IDE. ESP8266 - підключення та оновлення прошивки

Після своєї появи плати на базі Wifi чіпа ESP8266, стали по-справжньому народними. Величезні можливостіі мінімальна ціна, Що навіть на старті продажів і в роздріб не перевищувала 5 $ зробили свою справу. Навколо чіпа організувалися спільноти, в яких люди діляться інформацією та створюють програмне забезпечення.

У чому причина такої популярності, крім низької ціни?

Справа в тому, що плати на ESP8266 це не просто модулі для зв'язку по WiFi. Чіп по суті є мікроконтролером зі своїми інтерфейсами SPI, UART, а також портами GPIO, а це означає, що модуль можна використовувати автономно без Arduino та інших плат з мікроконтролерами.

Інформація

Наші китайські товариші вже виробляють близько дванадцяти різновидів плат на базі ESP8266: із підключенням зовнішньої антени, з керамічною антеною, з антеною PCB, без антени. Також на різних модулях виведено різна кількість GPIO. Детальніше, можна прочитати на російськомовному сайті.

У даному оглядія використовуватиму, одну з найперших плат ESP-01. Так само для повноцінної роботиз чіпом буде потрібно конвертер USB/UART, рекомендую, огляд якого вже був на mysku.

Підключення

Розпинування роз'єму ESP-01, представлене на малюнку:

Якщо у своїх проектах вам не вистачить двох виведених GPIO, а займатися «брудними хаками» немає бажання, то я рекомендую відразу купувати нові плати, наприклад ESP-07або ESP-12. Тільки майте на увазі, що ці плати вимагають самостійної розведення і у продажу для цього є спеціальні мінінабори.

Фотографії даних плат


ESP-01 hacked by Dave Allan, як приклад. Додатково ви отримуєте 4 GPIO: GPIO14, GPIO12, GPIO13 та GPIO15

Схема підключення:
- ESP-01 VCC до USB/UART VCC (+3.3В);
- ESP-01 GND до USB/UART GND;
- ESP-01 URXD до USB/UART TXD;
- ESP-01 UTXD до USB/UART RXD;
- ESP-01 CH_PD до USB/UART VCC (+3.3В);
- ESP-01 GPIO0 до USB/UART GND - тільки під час прошивки!

Прошивка

Для ESP8266 існує SDK і оригінальна прошивка від Espressif Systems, але багатьох вона не влаштовує зважаючи на свою «вогкість», тому випускаються не оригінальні прошивки, такі як NodeMCU, Frankenstein та інші.

У цьому огляді використовуватиметься не оригінальна прошивка NodeMCU. Список команд і прикладів можна подивитися на .

Оновлюємо оригінальну «заводську» прошивку на NodeMCU:
- Завантажуємо утиліту для прошивання -;
- завантажуємо прошивку -;
- Підключаємо по ESP-01 до USB/UART за схемою, яка представлена ​​вище. Не забуваймо підключити GPIO0 до GND. Вставляємо USB/UART у USB порт комп'ютера;
- Запускаємо XTCOM_UTIL.exe, переходимо в Tools -> Config Device, вибираємо COM-порт до якого підключена плата, ставимо швидкість порту 57600, тиснемо Open, потім Connect, програма повинна сказати "Connect with target OK!", Закриваємо вікно налаштувань. Переходимо в меню API TEST, вибираємо (4) Flash Image Download, вказуємо шлях до файлу "nodemcu_512k_latest.bin", адресу залишаємо 0x00000, тиснемо DownLoad. Повинне розпочатися завантаження прошивки, після закінчення буде видано повідомлення;
- Відключаємо живлення плати, висновок GPIO0 від'єднуємо від загального дроту, вмикаємо живлення. Запускаємо термінал Putty, CoolTerm або ін. (УВАГА! Змінюємо швидкість порту на 9600), перевіряємо готовність плати командою
> print(node.chipid())
10013490

Перший скрипт

Якщо при роботі зі скриптами у Вас будуть проблеми, рекомендується подати живлення 3.3V не від USB/UART, а від окремого джерела. Напруга має бути саме 3.3V, наприклад, через модуль стабілізованого живлення на AMS1117 3.3V 800ma.

Для написання та завантаження скриптів в ESP8266, буде використовуватися невелика та зручна IDE - :

Наш перший скрипт буде вимикати і включати світлодіод з періодичністю в 2 секунди:
- Відключаємо живлення, до GPIO2 підключаємо резистор та світлодіод. Включаємо живлення;
- Запускаємо ESPlorer, вибираємо потрібний COMта швидкість порту 9600, натискаємо Open;
- Вставляємо код та натискаємо Save To ESP;

Pin = 4 --GPIO2 gpio.mode(pin, gpio.OUTPUT) for i=1, 10, 1 do gpio.write(pin, gpio.LOW) tmr.delay(2000000) gpio.write(pin, gpio.HIGH ) tmr.delay(2000000) end
- Для повторного запуску натискаємо DoFile.

Підключаємо датчик DHT11

Щоб продемонструвати, більш просунуту роботу з прошивкою NodeMCU підключимо до ESP-01 датчик DHT11:
- DHT11 VCC до USB/UART VCC
- DHT11 GND до USB/UART GND
- DHT11 Out до USB/UART GPIO2

Код користувача Pigs Fly з форуму ESP8266.com

Works for DHT11 on ESP-07 (version w/16pins) and ESP-01 --Тільки 20141219 firmware tested. --Data stream acquisition timing is critical. The's --barely enough speed to work with to make this happen. --Pre-allocate vars used in loop. = 4;gpio.mode(pin,gpio.OUTPUT) gpio.write gpio.mode(pin, gpio.INPUT) --bus will always let up eventually, don"t bother with timeout while (gpio_read(pin)==0) do end c=0 while (gpio_read(pin)= =1 and c<100) do c=c+1 end --bus will always let up eventually, don"t bother with timeout while (gpio_read(pin)==0) do end c=0 while (gpio_read(pin)==1 and c<100) do c=c+1 end --acquisition loop for j = 1, 40, 1 do while (gpio_read(pin)==1 and bitlength<10) do bitlength=bitlength+1 end bitStream[j]=bitlength bitlength=0 --bus will always let up eventually, don"t bother with timeout while (gpio_read(pin)==0) do end end --DHT data acquired, process. Humidity = 0 HumidityDec=0 Temperature = 0 TemperatureDec=0 Checksum = 0 ChecksumTest=0 for i = 1, 8, 1 do if (bitStream >2) then Humidity = Humidity+2^(8-i) end end for i = 1, 8, 1 do if (bitStream > 2) then HumidityDec = HumidityDec+2^(8-i) end end for i = 1, 8, 1 do if (bitStream > 2) then Temperature = Temperature+2^(8-i) end end for i = 1, 8, 1 do if (bitStream > 2) then TemperatureDec = TemperatureDec+2^(8-i ) end end for i = 1, 8, 1 do if (bitStream > 2) the Checksum = Checksum+2^(8-i) end end ChecksumTest=(Humidity+HumidityDec+Temperature+TemperatureDec) % 0xFF print ("Temperature: "..Temperature.."."..TemperatureDec) print ("Humidity: "..Humidity.."."..HumidityDec) print ("ChecksumReceived: "..Checksum) print ("ChecksumTest: "..ChecksumTest )


Перепрошую за якість відео, знімав на телефон.

HTTP сервер

Приклад підключення до Wifi точки доступу та відповідь на запит по HTTP.

Wifi.setmode(wifi.STATION) wifi.sta.config("SSID","password") print(wifi.sta.getip()) srv:listen(80,function(conn) conn:on("receive", function(conn,payload) print(payload) conn:send("

Hello, User.

") end) end)

Епілог

Чіп ESP8266 це безумовно прорив, насамперед у співвідношенні ціна/якість. Звичайно, варто згадати про існуючі проблеми в оригінальних і не оригінальних прошивках, але роботи ведуться і я сподіваюся, що в майбутньому подібні чіпи будуть вбудовані в кожен чайник. Планую купити +156 Додати в обране Огляд сподобався +103 +196

Для роботи з RemoteXY модуль ESP8266 повинен мати версію прошивки за допомогою AT команд не нижче v0.40. Для перевірки версії модуля, а також для зміни прошивки у разі потреби підключіть модуль до комп'ютера через послідовний порт. Модуль можна підключити через плату Arduinoабо через USB-UART адаптер.

Підключення через плату Arduino

При використання Arduinoосновний чіп ATmega переводиться в режим скидання, активним залишається лише вбудований USB-UART перетворювач. Для цього контакт RESETз'єднується із землею. Контакти RX і TX підключаються до ESP8266 безпосередньо, а не хрест навхрест, ніби вони підключалися до роботи з контролером.

Підключення через USB-UART адаптер

Перетворювач повинен мати вихід джерела 3.3V для живлення ESP8266. Також це джерело має забезпечити необхідний струм не менше 200мА.



Контакт CPIO0 визначає режим роботи модуля. При не підключеному контакті модуль працює в штатному режиміта виконує AT команди. При замиканні контакту на землю модуль переводиться в режим оновлення вбудованої прошивки. Переведення модуля в режим прошивки вимагає, щоб контакт CPIO0 був підключений до «землі» в момент подачі живлення на модуль. Якщо замикати контакт при працюючому модулі, переведення модуля в режим оновлення прошивки не відбудеться.

Перевірка поточної версії

Для надсилання AT команд та перегляду відповідей необхідно використовувати будь-яку програму монітора послідовного порту. Дуже добре підходить термінальна програма з Arduino IDE. У програмі необхідно встановити режим відправлення команд із завершальним символом перекладу рядка та поверненням каретки. Швидкість роботи модуля за замовчуванням 115 200 біт/сек. Для роботи модуля в штатному режимі контакт CPIO0 має бути вимкнений.

Перевірити поточну версію прошивки можна, виконавши AT команду: AT+GMR. Приклад відповіді модуля:

AT version:0.40.0.0(Aug 8 2015 14:45:58)
SDK version:1.3.0

Build:1.3.0.2 Sep 11 2015 11:48:04
OK

Також варто дізнатися розмір флеш пам'яті вашого модуля, від цього залежить налаштування адрес завантаження даних при оновленні прошивки. У цій інструкції описано прошивку модуля з розміром флеш пам'яті 8Mbit(512KB+512KB) або 16Mbit(1024KB+1024KB), як найпоширеніших. Розмір флеш пам'яті можна дізнатися, виконавши команду AT скидання модуля: AT + RST.

Ets Jan 8 2013,rst cause:2, boot mode:(3,1)

Load 0x40100000, len 1396, room 16
tail 4
chksum 0x89
load 0x3ffe8000, len 776, room 4
tail 4
chksum 0xe8
load 0x3ffe8308, len 540, room 4
tail 8
chksum 0xc0
csum 0xc0

2nd boot version: 1.4(b1)
SPI Speed: 40MHz
SPI Mode: DIO
SPI Flash Size & Map: 8Mbit(512KB+512KB)
jump to run user1 @ 1000

#t#n"t use rtc mem data
slПrlМене
Ai-Thinker Technology Co.,Ltd.

Програма для прошивки

Для оновлення прошивки необхідно завантажити програму для прошивки та саму прошивку. Програма для прошивки ESP8266 буде використовувати Flash Download Tools v2.4 з офіційного сайту Espressif Systems. Посилання на сторінку завантаження на офіційному сайті: . Необхідно перейти до розділу "Tools".

Посилання на програму у нашому файлове сховище: FLASH_DOWNLOAD_TOOLS_v2.4_150924.rar

Прошивка

Прошивку також можна завантажити з офіційного сайту. Посилання на сторінку завантаження на офіційному сайті: . Необхідно перейти в розділ «SDKs & Demos» та завантажити прошивку ESP8266 NONOS SDK версії щонайменше v1.3.0. Саме з цієї версії прошивки реалізовано підтримку AT команд v0.40 і більше.

Посилання на прошивку у нашому файловому сховищі: esp8266_nonos_sdk_v1.4.0_15_09_18_0.rar

Усі завантажені файли необхідно розпакувати та помістити в каталог, де повний шляхдо файлів складається лише з латинських символів, тобто символів локалізації мови.

Налаштування

Запускаємо програму прошивки Flash Download Tools v2.4 (одноіменний.exe файл). У вікні необхідно правильно вказати завантажені файли та налаштування з'єднання.


Завантажені файли розміщуються в каталозі bin архіву з прошивкою. Для кожного файлу потрібно вказати правильна адресазавантаження. Використовуйте наступну таблицю для вибору файлів та призначення адрес:

Встановіть наступні параметриналаштування:

  • SPIAutoSet – встановлений;
  • CrystalFreq - 26M;
  • FLASH SIZE – 8Mbit або 16Mbit залежно від розміру флеш-пам'яті;
  • COM PORT – виберіть порт, до якого підключено ESP;
  • BAUDRATE – 115200

Для старту прошивки необхідно натиснути кнопку "START".

Послідовність кроків для прошивки ESP8266

1. Підключіть модуль до комп'ютера згідно зі схемою підключення в цій статті.

2. Запустіть послідовний монітор. Виконайте AT команди AT+RST та AT+GMR для визначення поточної версіїпрошивки та розміру пам'яті модуля. Цей крок також дозволяє перевірити правильність підключення модуля.

3. Запустіть програму прошивки Flash Download Tools, правильно налаштуйте файли, що завантажуються, встановіть налаштування.

4. Вимкніть живлення модуля ESP8266.

5. З'єднайте контакт CPIO0 на землю.

6. Подайте живлення на модуль ESP8266.

7. Натисніть на програму прошивки кнопку START

8. Дочекайтесь закінчення прошивки модуля. Після прошивки з'явиться напис FINISH зеленого кольору.

9. Від'єднайте живлення модуля ESP8266. Від'єднайте землю від контакту CPIO0.

10. Увімкніть модуль, запустіть послідовний монітор. Переконайтеся в працездатності модуля та нової версії прошивки, виконавши AT команду AT+GMR.

… Втім, цей матеріал не обмежується лише однією темою Ардуїно.

Тема ESP8266 - досить непроста. Але якщо працювати з цими Wi-Fi модулямисеред розробки Arduino IDE - поріг входження опускається до прийнятного для звичайного ардуинщика рівня. Та й не тільки ардуїнщика, а будь-якої людини, яка має бажання зварганити щось по темі, причому не витрачаючи багато часу читаючи документацію для мікросхеми та вивчення API для цих модулів.

Дане відео повністю дублює матеріал, представлений у статті нижче.

Ну що ж, ми вже вміємо підключати ESP8266 і переводити його в режим програмування, тепер перейдемо до чогось кориснішого.

Скажу відразу - один раз запрограмувавши модуль у середовищі розробки Ардуїно, ми зносимо рідну прошивку, і у нас зникне можливість працювати з модулем за допомогою AT-команд. Особисто мені, від цього, не холодно/не жарко, але якщо комусь це буде потрібно - ближче до кінця статті я покажу, як назад прошити в модуль рідну прошивку, чи якийсь загручик типу NodeMcu.

Для початку, на оф.сайті качаємо останню версію Arduino IDE, на Наразіце 1.6.7. Старіші версії типу 1.0.5. не підійдуть, бо банально не мають потрібного функціоналу, а танці з бубном нас не цікавлять, чи не так?

Запускаємо середовище розробки і відразу йдемо у Файл/Налаштування:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Потім йдемо Інструменти/Плата:/Менеджер плат...:

Перед нами з'явиться вікно менеджера плат, гортаємо його до самого низу, і якщо все зроблено правильно ми побачимо щось подібне до цього:

Клацаємо курсором за написом " esp8266 by ESP8266 Communityпісля цього, у нас з'явилася кнопка «Установка», вибираєте потрібну версіюя беру останню, на сьогоднішній день це 2.1.0. та встановлюю її. Середовище розробки закачає необхідні їй файли (близько 150 мегабайт) і навпаки написи " esp8266 by ESP8266 Community" з'явиться "INSTALLED" тобто встановлено:

Гортаємо список плат вниз і бачимо, що в списку у нас з'явилося багато різних ESP, беремо "Generic ESP8266 Module":

Ідемо в «Інструменти» і вибираємо потрібний COM порт (у мене це COM32), потім ставимо Upload Speed: «115200»:

Виставляємо швидкість 74880 і «NL & CR» і знову ж таки відключаємо і подаємо харчування і він відповість деякою налагоджувальною інформацією:

Зауважте, 74880 - не основна швидкість ESP8266, просто він лише на ній відправляє налагоджувальну інформацію. Якщо модуль нічого не відправляє в консоль, тоді можливо щось підключили не так, як треба.

За замовчуванням швидкість повинна бути 115200, але в окремих випадкахможе бути і 9600 та інші… Так що спробуйте підібрати.

Після підбору потрібної швидкостівідправляємо модулю "AT" і він повинен відповісти що все "ОК". Команда «AT+GMR» виводить інформацію про прошивку.

Перш ніж почати прошивати ESP8266 в Arduino IDE, я раджу дочитати статтю до кінця.

Тепер спробуємо прошити ESP8266 через Arduino IDE. Переводимо модуль у режим програмування (як це зробити я писав у ).

Давайте зашиємо мигалку штатним світлодіодом:

// By MrПоделкинЦ youtube.com/RazniePodelki // special to сайт/post/271754/ #define TXD 1 // GPIO1/TXD01 void setup() ( pinMode(TXD, OUTPUT); ) void loop() ( digitalWrite(TXD, HIGH);delay(1000);digitalWrite(TXD, LOW);delay(1000);

Замиготів? Значить, все зроблено правильно. Звідки я взяв що світлодіод підключений до першого пін? У попередній статті є картинка з розпинуванням різних модулів і там є розмітка портів, при використанні завантажувача Arduino (піни відзначені рожевим кольором).

Блимання світлодіодом це звичайно добре, але треба якийсь веб-сервер закласти або почати керувати світлодіодом хоча б за допомогою кнопок у браузері, чи не так? Але про це я розповім вже якось іншим разом.

А зараз як прошити назад рідну прошивку, та й як взагалі прошивати модуль сторонніми завантажувачами. Для ESP8266 є така програма як NodeMCU Flasher, яка спочатку призначена для прошивки завантажувача NodeMCU. Але як виявилося, вона добре прошиває й інші прошивки.

Я прикріплю до статті архів з даною програмою та прошивкою для зручності, але завжди можна завантажити нову версію NodeMCU Flasher.

У папці "nodemcu-flasher-master" є 2 папки Win64 і Win32 і залежно від того, яка розрядність у вашої ОС вибираємо потрібну. Далі в папці Release запускаємо "ESP8266Flasher.exe" і бачимо інтерфейс програми:

Вибираємо потрібний COM порт і йдемо у вкладку Config, прибираємо хрестик біля INTERNAL://NODEMCU і ставимо його на один пункт нижче, як на скрині:

(Якщо захочете прошити завантажувач NodeMCU – прибираєте хрестик там, де його не було, і ставите – де він був, тобто біля «INTERNAL://NODEMCU»).

Потім тиснемо по шестерні і вибираємо де лежить наша прошивка, прошивка як правило у форматі *.bin (у прикріпленому архіві це "v0.9.5.2 AT Firmware.bin" яка лежить в основній папці), і так само вибираємо "0x00000" як і вище.

Повертаємось знову на вкладку «Operation» переводимо модуль у режим програмування і тиснемо «Flash»:

Все, модуль почав прошиватися, після перепрошивки не забуваємо перезавантажити модуль і вуаля, він прошитиме потрібною нам прошивкою.

Перевіряємо AT-командою «AT+GMR» чи зробили ми все правильно:

Як бачите, все нормально прошилося.

Настільки велика, що окрім прошивок для використання ESP8266 як WiFi-модуля під керуванням зовнішнього мікроконтролера, існує маса прошивок для використання його і як мікроконтролера з різними цільовими призначеннями, у тому числі й у сфері інтернет речей. У цьому циклі статей ми вивчатимемо можливості ESP8266з прошивкою NodeMCUі вивчимо скриптову мову LUA.

Що таке ESP8266?

ESP8266 – це мікроконтролер із WiFi інтерфейсом. Його можна використовувати як WiFi модульі як мікроконтролер.

Плюси ESP8266: WiFi інтерфейс, 32-розрядне ядро ​​з достатньою продуктивністю, низька ціна.
Мінуси: У порівнянні з іншими 32-розрядними мікроконтролерами периферія не викликає захоплення.

ESP8266 ідеально підходить для домашніх проектів, інтернет речей. ESP8266 програмується через послідовний порт UART, тому для його прошивки не потрібно спеціального програматора. Особливість цього мікроконтролера полягає в тому, що він може виконувати програму, розташовану на зовнішній Flash пам'яті. Це дозволяє виробнику "нарощувати" обсяг Флеша, що також є плюсом.

На базі ESP8266 випускаються різні модулі:

ESP-01
ESP-02
ESP-03
ESP-04
ESP-05
ESP-06
ESP-07
ESP-08
ESP-09
ESP-10
ESP-11
ESP-12S
ESP-12E
ESP-12F

Існує різні версіїплат із вже запаяними модулями ESP8266, стабілізаторами напруги, мікросхемою для забезпечення роботи послідовного порту UART через USB та розведеними на гребінку висновками, кнопками тощо. Для роботи з такими платами достатньо підключити їх до USB портукомп'ютера. Ніякого додаткового обладнанняне вимагається. Це дуже зручно. Одна з таких плат – NodeMCU. У прикладах я використовуватиму плату NodeMCU з модулем ESP-12F. Але Ви цілком можете взяти модуль, скажімо ESP-01, підключити до нього UART-USB перехідник і працювати з ним аналогічним чином. ESP-01 матиме менше пам'яті і менше висновків, які можна задіяти, але в іншому робота з ним аналогічна.


Що таке NodeMCU?

NodeMCU - відкритий безкоштовний проектна основі скриптової мови Lua. Прошивка досить потужна і дозволяє швидко реалізовувати різні типові проекти. Наприклад, сьогодні, як знайомство, ми зробимо WiFi розетку з керуванням з мобільного телефоната з Web-інтерфейсом. Прошивка вміє виконувати Lua-скрипти як із послідовного UART порту (аналогічно AT-командам) так і з внутрішньої flash пам'яті(виконуючи скрипти). Lua скрипти зберігаються у Flash у внутрішній файловій системі. Файлова система пласка, спрощена. Тобто. без підкаталогів. Проте – це круто. Не варто забувати, що ESP8266 – це лише мікроконтролер. Зі скриптів так само можна отримати доступ до файлів, читати і зберігати різну інформацію. NodeMCU модульна. Що з одного боку дозволяє нарощувати функціонал, а з іншого зібрати прошивку тільки з необхідних модулів, не витрачаючи даремно пам'ять.

NodeMCU працює з протоколами обміну даними – HTTP, MQTT, JSON, CoAP.
Підтримуються різні датчики
акселерометри ADXL345,
магнітометри HMC5883L,
гіроскопи L3G4200D,
датчики температури та вологості AM2320, DHT11, DHT21, DHT22, DHT33, DHT44
датчики температури, вологості, атмосферного тиску BME280,
датчики температури, атмосферного тиску BMP085,
безліч дисплеїв працюючих по шинах I2C, SPI. З можливістю роботи з різними шрифтами.
TFT дисплеї ILI9163, ILI9341, PCF8833, SEPS225, SSD1331, SSD1351, ST7735,
розумні світлодіоди та LED контролери – WS2812, tm1829, WS2801, WS2812,
підтримуються інтерфейси - 1-Wire, I2C, SPI, UART,

Також можна задіяти модуль шифрування, планувальник завдань, годинник реального часу, протокол синхронізації годинника через інтернет SNTP, таймери, АЦП канал (один), програвати аудіо файли, формувати на виходах ШІМ-сигнал (до 6), використовувати сокети, є підтримка FatFS, тобто можна підключати SD-картки і таке інше.

Що таке мова Lua?

Lua – це інтерпретована мова, яка, як і більшість сучасних інтерпретованих мов, може зберігати скомпіловані версії скриптів. Це дозволяє збільшити швидкість роботи. Lua позиціонується як мультипарадигмовий. Він не складний, і якщо Ви вже програмували будь-якою мовою, то Lua Ви вивчите дуже швидко. Якщо Ви тільки починаєте програмувати, тоді Lua здивує Вас доступністю для початківців.

Є деякі особливості при роботі з Lua на NodeMCU. В основному це пов'язано з кінцевим об'ємом мікроконтролера ESP8266. Потрібно дотримуватись простих правилта витримувати стиль роботи з Lua. Про ці правила розповім трохи пізніше. Якщо ж зберігати такий самий стиль, як і при написанні програм на С, то Вам не вдасться відчути всієї сили Lua і прошивки NodeMCU. Коли Ви починаєте писати на Lua, це захоплює, і Ви починаєте втілювати в життя більш об'ємні завдання. Ви втрачаєте відчуття того, що ви працюєте з мікроконтролером і мимоволі навантажуєте завданнями, які не під силу мікроконтролеру. Потрібно пам'ятати, що ESP8266 має обмежені ресурси і не слід його вантажити завданнями, які під силу виконати мікрокомп'ютерам або повноцінним комп'ютерам.

Документація з LUA російською мовою: http://www.lua.ru/doc/
Вивчаємо LUA за 15 хвилин: http://tylerneylon.com/a/learn-lua/

Де завантажити NodeMCU?

Звичайно, можна завантажити вихідні коди NodeMCU (https://github.com/nodemcu/nodemcu-firmware/releases/) і скомпілювати з потрібними параметрами. Але ми не будемо так робити. Існує сайт https://nodemcu-build.com, на якому можна зібрати NodeMCU із необхідними Вам модулями. Ви просто відзначаєте ті модулі, які Вам потрібно, вказуєте свій e-mail і натискаєте кнопку “ Start ysour build“. Спочатку на вказаний e-mailнадходить лист про те, що збірка почалася. А потім повідомлення про закінчення та посилання для скачування integerі floatверсій. Якщо у своєму проекті Ви не використовуватимете обчислення з плаваючою комою, тоді качайте “ integer“. Не варто скупитися та включати ті модулі, які Ви не збираєтеся використовувати. Будь-якої миті можна зібрати нову прошивку, додавши відсутній модуль. Для прикладів я зібрав NodeMCU з такими модулями:

Як залити NodeMCU на ESP8266?

Тепер, коли ми маємо файл прошивки NodeMCU, його потрібно залити в ESP8266. Насамперед, при підключенні плати NodeMCU до комп'ютера має з'явитися віртуальний Comпорт. Як правило, останні версії Windowsустановки драйверів не вимагають. Ubuntu відразу розпізнає підключений пристрій.

Прошивка NodeMCU під Windows

git clone https://github.com/themadinventor/esptool.git

Прошити командою:

Sudo python esptool.py --port /dev/ttyUSB0 write_flash 0x00000 The_Path_To_The_NodeMCU_Firmware.bin

/Dev/ttyUSB0– порт, на якому висить ESP8266.
The_Path_To_The_NodeMCU_Firmware.bin- Шлях до файлу прошивки.

До речі, esptoolможна використовувати під Windows. esptoolнаписаний на Pyton, для роботи під Windows необхідно встановити Pyton.

esptoolнагоді нам для заливання бінарних файлівна файлову систему NodeMCU. Можна заливати будь-які файли, зокрема скрипти. Скрипти можна писати хоч у Notepad, але я віддаю перевагу ESPlorer.

ESPlorer, init.lua – пишемо перший скрипт

Для написання та заливки скриптів будемо використовувати програму ESPlorer. Це кросплатформова програма написана на Javaі так само не потребує встановлення. Працює однаково як під Windows, так і під Ubuntu.

Розпаковуємо архів.

Під Windows запускаємо файл ESPlorer.bat

Sudo java-jar ESPlorer.jar

Вказуємо порт та швидкість 9600 :

І натискаємо “ Open“. Побачимо наступне

У ESPlorer виявилася паршива особливість. Він не завжди чітко підключається до NodeMCU. Якщо спробувати надіслати будь-яку команду (кнопкою Send) у консолі пролітає сміття замість нормальної відповіді. Іноді після кількох повторів все налагоджується. Якщо це Вас турбує, спробуйте змінити швидкість підключення на 115200.


Приступимо до створення першого скрипта мовою Lua. Скрипт з ім'ям init.luaстартує автоматично після запуску NodeMCU. Створимо файл init.lua.

надрукуємо всього один рядок:

Print("Yes it works!")

Зберігаємо файл як init.lua. Після збереження файл виконатись і ми повинні побачити роботу першого скрипта.

За замовчуванням файл зберігається на диск комп'ютера і заливається на ESP8266.

Тепер про найбільшу неприємність, яка є у NodeMCU. При деяких критичних помилках (це трапляється не так часто, але якщо трапляється, то запам'ятовується довго) NodeMCU може перезавантажуватися. І найстрашніше, що може статися – це циклічне перезавантаження. Це трапляється якщо допустити критичну помилкуу скрипті який стартує автоматично. NodeMCU стартує, виконує "глючний" скрипт, наривається на критичну помилку і йде в перезавантаження. І так до безкінечності.

Для того, щоб убезпечити себе на етапі вивчення NodeMCU, я використовую наведений нижче прийом. У стартовому скрипті init.luaзапускаємо таймер, який спрацює лише один раз і через вказаний часданому випадкучерез 5 секунд) виконає процедуру запуску іншого скрипта (у цьому випадку main.lua). Більше нічого у скрипті init.luaне робимо. Усі операції виконуються у скрипті main.lua. Таким чином, якщо ми припустимося помилки в скрипті main.lua, і NodeMCU піде в циклічне перезавантаженняПісля перезавантаження у нас буде 5 секунд для того, щоб видалити або виправити “глючний” скрипт.

Текст init.lua:

Print ("Waiting ...") tmr.register (0, 5000, tmr.ALARM_SINGLE, function (t) tmr.unregister (0); print ("Starting ..."); dofile ("main.lua") end) tmr.start (0)

Крім того, такий підхід дозволяє легко включати в автозавантаження потрібний скриптдостатньо у файлі init.luaзамість main.luaвказати ім'я іншого скрипта. Це дуже зручно, коли ви на одній платі тестуєте кілька проектів чи кілька версій скрипту.

Підключаємось до Wifi або створюємо свою Wifi точку

Для підключення до WiFi створюємо main.lua та пишемо:

WiFi Settup wifi.setmode(wifi.STATION) local cfg=() cfg.ssid="MyWiFi" cfg.pwd="MyWiFiPassword" wifi.sta.config(cfg) cfg = nil collectgarbage()

Після успішного підключення модуль отримати IP-адресу. Дізнатися його можна за допомогою команди:

Wifi.sta.getip()

Якщо ми хочемо, ESP8266 створив свою власну WiFi точку:

WiFi AP Settup wifi.setmode(wifi.STATIONAP) cfg=() cfg.ssid="ESPWIFI" cfg.pwd="1234567890" wifi.ap.config(cfg) cfg = nil collectgarbage()

Примітка: WiFi точка не підніметься, якщо пароль коротше 8 символів. За замовчуванням IP-адреса точки завжди 192.168.4.1

Його можна дізнатися командою:

Wifi.ap.getip()

Що таке collectgarbage()? Функція collectgarbage- Це збирач сміття. Її слід викликати наприкінці кожного скрипта. Зверніть увагу, змінна cfgоголошено як local. Вона буде доступна лише у поточному скрипті. Якщо localприбрати, то змінна cfgбула б глобальною та доступною в інших скриптах.

GPIO. Блимаємо світлодіодом

Для управління реле (адже ми зібралися робити WiFi розетку) потрібно вивчити роботу з висновками GPIO. Поки що спробуємо використати GPIOвиведення в якості виходу та встановлювати високий та низький рівень сигналу. Для наочності підключимо світлодіод, як показано на схемі.

My_pin_nummber = 1 -- Встановлюємо режим роботи як вихід gpio.mode (my_pin_nummber, gpio.OUTPUT) -- Задати високий рівень gpio.write (my_pin_nummber, gpio.HIGH) -- Задати низький рівень gpio.write (my_pin_nummber, gpio.write -- Блимаємо світлодіодом 10 разів gpio.serout (1, gpio.HIGH, (+990000,990000), 10, 1)

Нумерація висновків:

IO indexESP8266 pin
0 GPIO16
1 GPIO5
2 GPIO4
3 GPIO0
4 GPIO2
5 GPIO14
6 GPIO12
7 GPIO13
8 GPIO15
9 GPIO3
10 GPIO1
11 GPIO9
12 GPIO10

D0(GPIO16) може тільки бути використаний як gpio read/write. No support for open-drain/interrupt/pwm/i2c/ow

Плата NodeMCU

Примітка: Існує декілька версій плат Nodemcu. Розпинування Вашої плати може відрізнятись.

Websocket

Тепер зробимо сервер, який працюватиме на вказаному порту (нехай буде 333). Потім ми за допомогою термінальної програми підключимося до нашого сервера, вказавши його IP та порт. І потім обмінюватимемося даними.

Скрипт main.lua:

WiFi AP Settup wifi.setmode(wifi.STATIONAP) cfg=() cfg.ssid="ESPTEST" cfg.pwd="1234567890" wifi.ap.config(cfg) --Create Server sv=net.createServer(net.TCP ) function receiver(sck, data) -- Print received data print(data) -- Send reply sck:send("Recived: ". ("receive", receiver) conn:send("Hello!") end) end print("Started.")

Тепер наш скрипт піднімає Wi-Fi точку, створює сервер, який на порту 333 очікує на підключення. У момент підключення сервер надішле клієнту рядок “ Hello!", а прийнявши від клієнта дані, поверне йому рядок" Recived:” далі все, що він прийняв.

Тепер ми можемо підключитися до мобільного телефону до Wi-Fi точці ESP8266. В принципі створювати крапку не обов'язково. Ви можете переписати скрипт та зробити так, щоб ESP8266 підключався до Вашого WiFi мережі. Тоді Вам потрібно дізнатися його IP і далі використовувати його замість 192.168.4.1, який використовується в прикладах.

Але нам ще потрібна термінальна програма для підключення на IP адресу ESP8266 (192.168.4.1) та вказаний порт (333). На звичайному комп'ютері можна встановити PuTTY. Для мобільних телефонів під Android я використовую JuiceSSH.

Передача даних із мобільного телефону за допомогою JuiceSSH

Встановлюємо та запускаємо RoboRemoFree

Створюємо підключення до сервера. Бажано щоб мобільний телефон/планшет був підключений до тієї ж WiFi мережі, де знаходиться сервер. У цьому випадку наш ESP8266. Заходимо до “Menu”, вибираємо пункт “connect”

Вибираємо тип підключення "Internet (TCP)"

Вказуємо IP та порт

Вибираємо інтерфейс. Програма дозволяє створювати кілька інтерфейсів із різними органами управління.

Потім переходимо в режим редагування інтерфейсу

Натискаємо на вільному просторі та вибираємо, що ми хочемо встановити. Ми будемо використовувати кнопки. Вибираємо "button"

Після цього на інтерфейс буде встановлена ​​кнопка. Її можна переміщати та змінювати її розміри.

Щоб змінити назву на кнопці, потрібно натиснути на неї і вибрати пункт “Set text”

Потім вкажемо ще один параметр - "set press action". Задамо "1". При натисканні кнопки буде надіслано вказаний рядок за створеним нами підключенням. Тобто. Наш ESP8266 отримає символ “1” та увімкне світлодіод.

Аналогічно створимо кнопку “Off” та встановимо set press action “0”.

Наш інтерфейс готовий. Виходимо з режиму редагування, виконавши пункт меню “don't edit ui”.

Якщо підключення до сервера (ESP8266) було успішним, можна скористатися. Після натискання кнопки “On” світлодіод повинен спалахнути, після натискання кнопки “Off” світлодіод повинен згаснути.

Web інтерфейс

Є й інший шлях – можна зробити Web інтерфейста керувати світлодіодом ще й через браузер.

Той самий скрипт + Web інтерфейс:

WiFi AP Settup wifi.setmode(wifi.STATIONAP) cfg=() cfg.ssid="ESPTEST" cfg.pwd="1234567890" wifi.ap.config(cfg) --Set Pin mode my_pin_nummber = 1 gpio.mode(my_pin_nu , gpio.OUTPUT) --Create Server sv=net.createServer(net.TCP) функція receiver(sck, data) if string.sub (data, 0, 1) == "1" then gpio.write(my_pin_nummber, gpio .HIGH) else if string.sub (data, 0, 1) == "0" . ) conn:on("receive", receiver) conn:send("Hello!") end) end --Create HTTP Server http=net.createServer(net.TCP) function receive_http(sck, data) local request = string. match(data,"([^\r,\n]*)[\r,\n]",1) if request == "GET /on HTTP/1.1" then gpio.write(my_pin_nummber, gpio.HIGH) end if request == "GET /off HTTP/1.1" then gpio.write(my_pin_nummber, gpio.LOW) end sck:on("sent", function(sck) sck:close() end) local response = "HTTP/ 1.0 200 OK\r\nServer: NodeMCU on ESP8266\r\nContent-Type: text/html\r\n\r".. " NodeMCU on ESP8266".. "

NodeMCU on ESP8266

".. "
".. "On Off".. "" sck:send(response) end if http then http:listen(80, function(conn) conn:on("receive", receive_http) end) end print("Started.")

Невелике пояснення, як працює web-сервер взагалі, і наш скрипт зокрема. Стандартний портдля Web-сервера - 80. Тобто. коли Ви в браузері набираєте http://192.168.4.1/, то браузер підключається до сервера (192.168.4.1) на порт 80 і надсилає запит. Запит виглядає приблизно так:

GET / HTTP / 1.1 Host: 192.168.4.1 User-Agent: Mozilla / 5.0 (Windows NT 5.1; rv: 2.0.1) Gecko / 20100101 Firefox Accept: text / html, application / xhtml + xml, ap q = 0.9, * / *; q = 0.8 Accept-Language: ru-RU, ru; q = 0.8, en-US; q = 0.5, en; q = 0.3 Accept-Encoding: gzip, deflate Connection: keep-alive Upgrade-Insecure-Requests: 1

Для нас цікавить перший рядок запиту: “ GET/HTTP/1.1“. У ній вказано URL-адресу. Якщо у браузері набрати http://192.168.4.1/ on , тоді в першому рядку запиту буде “ GET /on HTTP/1.1“. А якщо у браузері набрати http://192.168.4.1/ off тоді буде “ GET / off HTTP/1.1“. Саме цей рядок і аналізує скрипт і в залежності від отриманого URL-адреси включає або відключає світлодіод.

Далі скрипт відправляє html сторінку. Але після надсилання потрібно розірвати підключення. Оскільки відправка займає деякий час, а чекати на закінчення відправки технічно безглуздо, на подію “ sent” (відправлено) підключимо функцію з рядком sck:close(). Це робиться у рядку: sck:on(“sent”, function(sck) sck:close() end). Ппісля чого виконується відправка htmlсторінки sck: send (response). Зкрипт продовжує роботу. Коли відповідь буде повністю надіслана, спрацює sck:close().

Сторінки великого розміру в такий спосіб відправити не вийде. Вагомий вміст потрібно надсилати шматками. Докладніше про це буде розказано в іншій статті.

Підключаємо реле із навантаженням

Увага! Напруга понад 40 Вольт небезпечна для життя людини! Будьте уважні та акуратні, збираючи схему та підключаючи побутові прилади. Не торкайтеся струмовідних частин.

А тепер замість світлодіода підключимо модуль реле, а як навантаження – скажімо лампу, обігрівач, компресор для акваріума, вентилятор і т.п.

При підключенні реле може бути нюанси. Якщо блок реле з оптичною розв'язкою (з оптопарою), то швидше за все, Вам нічого переробляти не доведеться. Якщо блок реле без оптичної розв'язки, як у мене, то доведеться переробити роботу з GPIO, оскільки в перших реле включається низьким рівнем, а не високим, а по-друге високий рівень ESP8266 – це 3.3В, для 5-вольтового блоку реле цього не достатньо, тому мені довелося налаштувати вихід як OPENDRAIN, після чого все запрацювало як треба.

Фінальна версія скрипта виглядає так:

WiFi AP Settup wifi.setmode(wifi.STATIONAP) cfg=() cfg.ssid="ESPTEST" cfg.pwd="1234567890" wifi.ap.config(cfg) --Set Pin mode my_pin_nummber = 1 --gpio.mode (my_pin_nummber, gpio.OUTPUT) gpio.mode(my_pin_nummber, gpio.OPENDRAIN) --Create Server sv=net.createServer(net.TCP) функція receiver(sck, data) if string.sub (data, 0, 1) = = "1" then --gpio.write(my_pin_nummber, gpio.HIGH) gpio.write(my_pin_nummber, gpio.LOW) else if string.sub (data, 0, 1) == "0" then --gpio.write (my_pin_nummber, gpio.LOW) gpio.write(my_pin_nummber, gpio.HIGH) end end print(data) end if sv then sv:listen(333, function(conn) conn:on("receive", receiver) conn:send ("Hello!") end) end --Create HTTP Server http=net.createServer(net.TCP) function receive_http(sck, data) print(data) local request = string.match(data,"([^\r ,\n]*)[\r,\n]",1) if request == "GET /on HTTP/1.1" then --gpio.write(my_pin_nummber, gpio.HIGH) gpio.write(my_pin_nummber, gpio. LOW) end if request == "GET /off HTTP/1.1" then --gpio.write(my_pin_nummber, gpio.LOW) gpio.write(my_pin_nummber, gpio.HIGH) end sck:on("sent", function(sck) ) sck:close() collectgarbage() end) local response = "HTTP/1.0 200 OK\r\nServer: NodeMCU on ESP8266\r\nContent-Type: text/html\r\n\r\n".. " NodeMCU on ESP8266".. "

NodeMCU on ESP8266

".. "
".. "On Off".. "

" sck:send(response) end if http then http:listen(80, function(conn) conn:on("receive", receive_http) end) end print("Started.")

Тепер ми можемо вмикати та вимикати “розетку” з мобільного телефону за допомогою програми RoboRemoFree або за допомогою браузера. Зрозуміло, з звичайного комп'ютерачерез браузер також можна керувати.



Все це добре, але що далі? Якщо у нас буде 5, 10, 20 подібних пристроїв? Як їх поєднати, щоб не треба було підключатися до кожного пристрою окремо. Існує протокол MQTT, але це буде окрема тема. А поки що ми вивчимо можливості ESP8266 і NodeMCU.

Деякі правила роботи з мовою Lua на NodeMCU

1. Не пишіть довгі скрипти. Розмір пам'яті ESP8266 не безкінечний. Розбивайте програму на функціональні модулі та робіть їх у вигляді окремих скриптів, запускаючи їх за допомогою dofile(). Наприклад, код підключення до Wifi:

WiFi Settup wifi.setmode (wifi.STATION) local cfg = () cfg.ssid = "MyWiFi" cfg.pwd = "MyWiFiPassword" wifi.sta.config (cfg) cfg = nil collectgarbage ()

можна винести в окремий скрипт “ wifi.lua” та виконати його з основного скрипта командою dofile("wifi.lua").

2. Змінні, які використовуються тільки в поточному скрипті, оголошуйте як local. Наприкінці скрипта, коли змінна вже не потрібна, надавайте їй значення nilі явно викликайте збирач сміття collectgarbage()