Особенности создания программ в 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 Mбайт, а 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 KБ и грузить в модуль примерно 1 минуту. Т.е. сколько ошибок — столько минут.

Другой путь — отладка модулей на LUA и в последствии (если есть необходимость) перенос их на СИ с помощью API CИ для 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).
Share post

Similar posts

Comments 16

    0
    А нельзя запускать LUA скрипты на компьютере без загрузки в ESP? Это же ведь скрипт и, по идее, может выполняться просто в интерпретаторе LUA?
      0
      Да, таким образом можно легко тестировать логику.
      Но рано или поздно натыкаешься на факт того, что что-то работает в коллбеке чего-то, и забрасываешь эту идею.
        0
        У одного меня NodeMCU DevBoard перезагружается при каждом подключении к com порту (один раз) или это нормально?
        Приходится городить еще один USB/Serial интерфейс…
          0
          Вы подали мне замечательную идею… Спасибо )

          Если же быть конкретным, то github.com/wip-studio/esp.js — в планах довести до альфы за апрель
        +1
        Закончил знакомство с nodemcu на ошибке «not enough memory» не поняв, о какой памяти идёт речь. А всего то нужно было разделить один скрипт на несколько небольших файлов. И наверное к лучшему, Си как то понятнее кажется, чем Lua.
          0
          С другими прошивками для ESP8266 можно использовать JS или чистый C или Arduino IDE.
            0
            ESD-12

            Это опечатка и речь про ESP-12?
              0
              Другой путь — отладка модулей на LUA и в последствии (если есть необходимость) перенос их на СИ с помощью API CИ для LUA (я, собственно, так и делаю).

              Т.е. можно скомпилировать C'шный код, и дёрнуть его из LUA? А где про это можно прочитать?
                0
                IDE ESP8266 с диаграммами (Визуальное программирование). Возможно, хорошая возможность приблизить к нуждам народа устройства на ESP8266.
                github.com/microflo/microflo/tree/esp8266
                  0
                  о VM LUA исполняет LUA скрипты лишь размещенные в оперативной памяти

                  Я так понимаю, из -за того что код нужно компилировать. Но LUA также может исполнять уже предкомпилированый код. Никто не интересовался работает ли это на NODEMCU и могут такие скрипты исполнятся без полной загрузки в память?
                    +1
                    Я собрал отдельно кросс-компилятор под виндой для nodemcu и загружаю в ESP байт-код.
                      0
                      А как?
                        0
                        написал мейк-файл и собрал.
                        почитать про кросс-компилятор можно здесь.
                        http://www.eluaproject.net/

                    Only users with full accounts can post comments. Log in, please.