• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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?
 
Сверху Снизу