Особливості створення програм у NODEMCU ESP8266 для «інтернету речей»

До вивчення можливостей мікросхеми ESP8266 я приступив пару місяців тому. Спочатку придбав, як і більшість, модуль ESP-01, але майже одразу знайшов нове на той момент рішення на основі модуля ESD-12 у вигляді DEVKIT і прошивкою nodeMCU, в яку вбудована VM LUA версії 5.1.4(без debug і OS*модулів).

image

Є кілька способів долучитися до світу прекрасного — «інтернету речей». Можна взяти модуль ESP-01, в якому 512 Кбайт флеш, є інтерфейс UART, пара контактів ESP, додати до нього інтерфейс USB надалі перепаяти флеш на більший обсяг. Для тих, у кого немає бажання, або вміння займатися доопрацюванням модуля, але хочеться долучитися і почати відразу програмувати, є інший спосіб — це зазначена вище плата DEVKIT.

Якщо врахувати різницю цін рішення в 10 доларів — вибір за вами.

Що ж хорошого в даному модулі DEVKIT?

По-перше, він вже містить інтерфейс UART-USB роз'ємом micro USB. Тому для його підключення до комп'ютера потрібен лише кабель USB-microUSB.

По друге, він має висновки всіх доступних сигналів з ESP8266. Ось моя схема підключення до модуля різних датчиків:



Для підключення датчиків до контактів плати DEVKIT я використовував шлейф від старого комп'ютера для підключення периферії (дисків, CDROM, портів і т. д.) Як бачите, я підключив до модулю все або майже все. У проекті — частотне керування двигуном і ПІД регулювання силовими установками (нагрівачами та вимикачами).

В-третіх, модуль вже має flash 4 Мбайт, а NODEMCU має вбудовану файлову систему spiffs.

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

В-п'ятих, можна створити безліч скриптів на LUA і записати їх у файлову систему.

Після чого через WIFI можна викликати потрібні скрипти на виконання.

Бібліотека розширення LUA містить наступні модулі:

json, file, timer, pwm, i2c, spi, 1-wire, net, mqtt, coap, gpio, wifi, adc, uart і system api.

Контракти плати можуть бути запрограмовані для gpio, i2c, pwm.
Доступні дві версії прошивки з форматом цілих, або дійсних чисел.

Слід зазначити, що можна програмувати свої розробки на СІ.
Але проблема в тому, що для налагодження кожної зміни у своїй програмі необхідно збирати прошивку об'ємом 200 КБ і вантажити в модуль приблизно 1 хвилину. Тобто скільки помилок — стільки хвилин.

Інший шлях — налагодження модулів на LUA і надалі (якщо є необхідність) перенесення їх на СІ з допомогою API СІ для LUA (я, власне, так і роблю).

Одна помилка — це приблизно 1-2КБ і завантаження 1-2 сек. Тобто скільки помилок — стільки секунд.

Які ж недоліки є у даного модуля

Основний недолік в тому, що VM LUA виконує LUA скрипти лише розміщені в оперативній пам'яті кристала. А цієї пам'яті для скриптів всього лише 20 Кбайт. Цього обсягу пам'яті вистачає на виконання скрипта приблизно в 110 рядків.
Тому створення порівняно великих скриптів для даного модуля має свою специфіку.

По-перше, необхідно алгоритм розділити на лінійні блоки.
По друге, записати ці блоки в окремі файли файлової системи модуля
В-третіх, виконувати ці модулі з допомогою оператора dofile.

При написанні модулів треба дотримуватися наступних правил:
— В кінці кожного модуля явно викликати збирач сміття;
— Для обміну даними між модулями використовувати глобальні змінні, а для обчислень всередині модулів-локальні.

У результаті основна програма на lua виглядає приблизно так (один з робочих варіантів):

dofile('nk_start.lc') — виклик модуля початкової ініціалізації датчиків
function cb() — колбек функція періодичного вимірювання показань датчиків
collectgarbage() — виклик збирача сміття
if ip==nil then
dofile('wifi_1.lua') — функція ініціалізації wifi станції або сервера
end
if ip~=nil and is==nil then
dofile('srv_1.lua'); — в даному варіанті реалізується web сервер
is=1;
end
dofile('cbAM2302.lc'); — отримання даних з датчика вологості і температури AM2302
dofile('cb18b20.lua'); — отримання показань з датчиків температури DS18B20(у мене їх три)
dofile('get_tp.lc'); dofile('norm.lc'); --отримання показань з датчиків тиску і температури(BMP180)
end
tmr.alarm(3,1000,1,cb) — таймер дискретизації — викликає колбек функцію. частота дискретизації 1 Гц

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

Якщо реалізувати алгоритм даної програми без використання розбивки на модулі, то в пам'яті модуля зможе розміститися програма лише для одного датчика (або AM2302, або 18b20, або BMP180).

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.