• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Lua скрипты и модули

sevic

New member
Да, попробовал я вчерашнюю прошивку, действительно компилирует модули, но люто валится на операциях с числами. Вернусь пока на старую, без поддержки floating.
 

0tt0

New member
Добрый день! Подскажите, может есть у кого опыт работы с ThingSpeak TalkBack? Получилось организовать трекер температуры на ds18b20. Теперь задача организовать управление gpio через TalkBack. С lua никогда не работал и поэтому трудно мне понять конструкции языка. Ясно, что нужно сделать get запрос к серверу TalkBack и получить в качестве ответа (команды на управление gpio) заданную строку. Get запросы используются при работе с трекером температуры, но как организовать проверку возвращаемой при эом строки?
Прошу прощения за свою неосведомленность, ибо нуб...
 

mosvov

New member
А с датчиками dht1
Нашел на китайском форуме библиотеку для dht11
Код:
--  dht11 -- http://bbs.nodemcu.com/t/ding-shi-shang-chuan-dht11shu-ju-dao-lewei50/132
require("dht11");
getTempJsoon = function ()
  dht11.init(3)
  Temp = dht11.getTemp()
  Hum = dht11.getHumidity()
  PostData = "Температура: <b>" .. Temp .. "</b> <br> Влажность: <b>" .. Hum .. "</b>"
  return PostData
end
 

Вложения

sevic

New member
Ясно, что нужно сделать get запрос к серверу TalkBack и получить в качестве ответа (команды на управление gpio) заданную строку. Get запросы используются при работе с трекером температуры, но как организовать проверку возвращаемой при эом строки?
Прошу прощения за свою неосведомленность, ибо нуб...
Я не работал с ThingSpeak TalkBack, использую PushingBox, но в смысле реализации должно быть одинаково. У меня в модуле отправки есть фрагмент, похожий должен быть у Вас на отправку:
Код:
  local conn=net.createConnection(net.TCP, 0)
  conn:on("receive", function(conn, payload) print(payload) end)
  conn:connect(80,'213.186.33.19')
  conn:send("GET /pushingbox?devid="..datapush.." HTTP/1.1\r\n")
  conn:send("Host: api.pushingbox.com\r\n")
Думаю, что если после print(payload) вписать примитивный разбор текста типа
Код:
if string.find(payload,"load=1") then
  gpio.write(led_pin,gpio.HIGH);
должно сработать. на первых порах конечно придется посмотреть, что там и в каком виде шлет TalkBack , это подскажет что искать вместо "load=1" (это из моего проекта). Скорее всего строка будет как-то отформатирована, тогда для "вытягивания" нужного значения можно данных использовать что-то вроде такого:
Код:
if string.find(payload,'load=%d+') then
  -- parse load value
  load=  tonumber(string.match(string.match(payload,'thr=%d+'),'%d+'))
end
Это позволит считывать в переменную load числовое значение (например, 0 или 1)передаваемое строкой "load=.." и писать ее в gpio без лишних веток if/then. Переменную load надо обьявить на уровне функции conn и возвращать на выходе, иначе она "умрет" вместе с conn при ее завершении, и основная программа так и не узнает, что же ей делать ;) или вообще обьявить ее глобально и по таймеру проверять, изменилась или нет, если да - дергать gpio. А можно просто устанавливать gpio в заданное значение после парсинга load и ничего не возвращать, тут уж надо учитывать специфику решаемой задачи...
 
Последнее редактирование:

0tt0

New member
Спасибо за помощь! Все получилось. Поскольку по запросу GET возвращалось слово либо LED_ON, либо LEDOFF, то отловить его получилось так:
S = string.sub(payload,string.find(payload,"LED"),string.find(payload,"LED")+5)
 

sav13

New member
Код:
lua: error loading module 'bmp180' from file 'bmp180.lua':
    not enough memory
Подскажете в чем может быть косяк?
Подключил датчик BMP180
Загрузил файл bmp180.lua через программу ESPlorer.
Запускаю инициализацию модуля через консоль через консоль:

Код:
--print("BMP85 INIT")
OSS = 1 -- oversampling setting (0-3)
SDA_PIN = 4 -- sda pin, GPIO2
SCL_PIN = 3 -- scl pin, GPIO0
bmp180 = require("bmp180")
bmp180.init(SDA_PIN, SCL_PIN)
Затем считываю показания

Код:
bmp180.read(OSS)
t = bmp180.getTemperature()
p = bmp180.getPressure()
print("Temperature: "..(t/10).."  C")
print("Pressure: "..(p * 75 / 10000).." mmHg")
Все нормально работает
Пытаюсь запихнуть инициализацию в файл init.lua
Получаю:
Код:
lua: error loading module 'bmp180' from file 'bmp180.lua':
    not enough memory
 

NeoroN

Member
а код кто оптимизировать будет? Вобщем то что вы там накорябали не лезет в память, которой 22кб и любой скрипт LUA отжирает оч много.
 

sav13

New member
а код кто оптимизировать будет? Вобщем то что вы там накорябали не лезет в память, которой 22кб и любой скрипт LUA отжирает оч много.
С оптимизацией попробую, хотя там меньше 5К.
Штатный модуль BMP085.lua из проекта NodeMCU то же самое выдает.
Интересно, почему с консоли данный модуль нормально грузится и работает, а изinit.lua не хочет?
 

TRO

Member
У меня тоже проэктик размером в 4+ килобайта, и тоже так ругается на память, вручную запускается, а автоматом после сброса не хочет. Думал надурить и запустить командой дофиле из инит.луа , но не прокатило. Поубирал кучу пробелов и отладочных принтов, стал запускатся и так и так. Потом добавил еще кода и глобальных переменых, теперь автоматом запускается, а вручную не хочет. Уменьшил количество символов одновременно пихаемых в строковую переменную (разбил на более мелкие пачки), добавил еще кода, теперь ни автоматом ни в ручную уже не стартует (приходится резать уже функционал). А print (node.heap ()) внутри кода выдает 12тыщ при старте проги, и падает до 9тыщ при подключении веб клиента .

При использовании прерываний по переключению входа периодически наблюдаю вылеты с разными ошибками (пока на ножку частоту не подавать работает вроде стабильно). А мне надо мерять частоту до 500+ Гц.
 
Последнее редактирование:

TRO

Member
Я так понял что нужно уменьшать не только объем кода, а и количество потребляемой им оперативки (количество глобальных переменных).
 

sav13

New member
Я так понял что нужно уменьшать не только объем кода, а и количество потребляемой им оперативки (количество глобальных переменных).
Если это стандартный модуль из NodeMCU проекта. Что там уменьшать?
Кто то же его писал и отлаживал
 

TRO

Member
Форматировать пробовали? У меня было что файлов вроде нет, а записать проэкт нельзя, файловая система порушилась немного, даже перепрошится не давало, после форматирования все ок.
Можно еще попробовать на старых версиях прошивки запустить.
 
Последнее редактирование:

sav13

New member
Форматировать пробовали? У меня было что файлов вроде нет, а записать проэкт нельзя, файловая система порушилась немного, даже перепрошится не давало, после форматирования все ок.
Можно еще попробовать на старых версиях прошивки запустить.
В общем нормально заработало, когда в init запустил инициализацию через таймер с пятисекундной задержкой
Поднял простенький WEB-сервер. Отдельно сервер и BMP180 работают

При попытке проинициализировать WEB-сервер и датчик одновременно выдает
Код:
PANIC: unprotected error in call to Lua API (error loading module 'bmp180' from file 'bmp180.lua':
    not enough memory)
Код ужал как мог. Лишних переменных не нашел. Видимо, NodeMCU не приспособлена для каких то нормальных проектов кроме как включать/выключать GPIO
 

sevic

New member
Код ужал как мог. Лишних переменных не нашел. Видимо, NodeMCU не приспособлена для каких то нормальных проектов кроме как включать/выключать GPIO
Я пришел к абсолютно таким-же неутешительным выводам.. Я делал очень похожую штуку : термостат на базе ds18b20 + простейший web server для управления + периодическая отсылка температуры в google tables. Могу сказать, что термостат уже неделю пашет в полностью автономном режиме и почти без перезагрузок. Вначале нарывался на те же грабли - спорадическая перезагрузка модуля из-за нехватки heap. В итоге заработало более -менее стабильно (если можно так сказать в данном случае) после того как :
- модуль ds18b20.lua был нещадно "выпилен" , вместо него я накидал простой исполняемый файл, кот просто меряет и возвращает температуру. Выполняется через dofile();
- отправка отчетов осталась в виде модуля, болтается в памяти ну да фиг с ней
- web server упрощен донельзя, он умеет только выдавать html -страницу из флеша, да и то посрочно, дабы не жрать память. Полезные данные вживляются в код html функцией eval, т.е. где надо я в файл вставляю фрагмент кода и он выполняется "на лету" в момент отдачи в браузер. Обратные запросы обрабатываются двумя if-then, мне больше не надо...
- измерения температуры и термостатирование делаются раз в минуту, отправка раз в 15 мин.
Такая конструкция заработала, главное чтобы не совпали во времени все три события - измерение температуры, отправка отчета и обработка запроса браузера. В этом случае "падеж" гарантирован. Если же совпадают только два из трех процессов, система, как правило,"выживает", хотя heap падает в такие моменты до 4кбайт, в то время как в режиме ожидания около 12-14 кбайт.
Чуствую, что это предел для nodeMCU , разве что появится (или сам соберу) прошивка без floating но с предкомпиляцией модулей. В общем, если хочется выжать всю мощу ESP, путь только один - писать на C. А так да, NodeMCU годится (по крайней мере, сейчас) только для нечастого мигания светодиодом и подсаживания таких как мы "любителей халявы Lua" на С. ;) Надеюсь, никого не обидел.
P.S. самое смешное, что рабочие копии Lua-скриптов у меня остались только в модуле, на диске компа "похерились" в силу моей лени сбекапить работающий вариант куда-нить от греха подальше. Так что не повторяйте моих ошибок
 
Последнее редактирование:

Victor

Administrator
Команда форума
самое смешное, что рабочие копии Lua-скриптов у меня остались только в модуле, на диске компа "похерились" в силу моей лени сбекапить работающий вариант куда-нить от греха подальше. Так что не повторяйте моих ошибок
Запускаете ESPlorer, создаете пустой файл на диске с таким же именем как в ESP (тут аккуратно! не загрузите случайно пустой файл в ESP), затем делаете CAT и ESPlorer вываливает в терминал содержимое файла - делаете там COPY и в пустом окне файла на диске PASTE, сохраняете файл на диске.

Кстати, компилировать скрипты не пробовали - сколько памяти освобождается?
 

skylocker

Member
Хотел контролировать напряжение батареек, не используя единственный ADC.

Скажите, кто-то пробовал вызывать node.readvdd33()?

У меня стабильно беда какая-то с ним - в одном случае из 5-6 попыток показывает числа - от 700 на двух батарейках до 800 на трех батарейках, иногда - около 1500. В оставшихся 80% случаев модуль просто ребутится...
Прошивка последняя - 20150213, питание стабилизированное.

Что я делаю не так?
 

TRO

Member
......питание стабилизированное.
,,,,node.readvdd33(),,,,
Что я делаю не так?
Мало читаете форум.
node.readvdd33() частично связано с единственным ADC, и меняется вместе с ним в определенных пределах, короче показывает туфту, лучше не пользоватся.
 

skylocker

Member
Беда-беда, тогда лучше самому делитель сделать и на adc завести.. (
А я-то хотел температуру там измерять - чтоб не убить всю память на работу с ds18b20...

А, может, у кого есть схемы, чтоб по другой ноге переключать попеременно - то делитель питалова, то термодатчик к ADC?
 
Сверху Снизу