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

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

TRO

Member
может это watchdog срабатывает? попробуйте навтыкать.....
Спасибо, я конечно воткну, но кажется мне это происходит когда прерывание случается во время работы функции которая на HTML запрос страницу выдает (которая тоже получается по прерываниям работает, от запросов). Или когда этот миллисекундный таймер срабатывает в то время когда по односекундному опрос аналоговый датчиков идет, там с паузами между выборками аналогового канала до 100 миллисекунд все затянутся может.
 
Последнее редактирование:

nikolz

Well-known member
1) вообще- то на луа время обработки одного прерывания примерно 50 мкс.
Если длительность импульсов более 50-100 мкс, то проблем нет в измерении частоты в 300 гц.
---------------------------------------
2) Но из своего опыта скажу, что низкие частоты лучше мерить через период.
Для примера берем 300 гц. чтобы получить погрешность 0.3% надо измерять 1 секунду.
Но если измеряем период, то при шаге дискретности 50 мкс для получения 0.3% погрешности надо измерять 15 мс.
т е мы должны посчитать интервал между пятью импульсами и время измерения будет в 60 раз меньше,
чем при измерении частоты.
-----------------------------------
2) Поставьте команду tmr.wdclr()
во всех кусках кода. Это сброс сторожевого таймера, который следит, чтобы процессор не зависал.
-------------------------------------
3) Вообще-то графики и вектора это не уровень данного процессора.
Так как вы используете внешний сервер, то эти действия надо делать на сервере.
 

xopek

New member
А где прочитать про режимы node.dsleep() и wifi.sleeptype()?
в апи как-то... тихо.
Хочу два варианта на либо:
Спим наглухо, каждые 10 минут просыпаемся и шлем данные.
Спим не отключая сети (sta) и просыпаемся-выдаем данные по обращению
В обоих вариантах должны обрабатываться варианты
 

xopek

New member
deep_sleep_set_option(0), RF_CAL or not after deep-sleep wake up, depends on init data byte 108.
deep_sleep_set_option(1), RF_CAL after deep-sleep wake up, there will be large current.
deep_sleep_set_option(2) , no RF_CAL after deep-sleep wake up, there will only be small current.
deep_sleep_set_option(4) , disable RF after deep-sleep wake up, just like modem sleep, there will be the smallest current.
Может кому пригодится. Это для node.dsleep()
А вот MODEM,LIGHT,NONE для wifi.sleeptype() я и в документации сдк не нашел. Т.е. там есть упоминания о них, а описания - нет.
 

JustACat

Moderator
Команда форума
Может кому пригодится.
Так оно же в API расписано: https://github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_en#nodedsleep или никто доку официальную не читает? :)
Про wifi.sleeptype там конечно мало: https://github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_en#wifisleeptype
Но если открыть, например, ESP8266_Beginners_Guide_V0.4.1.pdf то в нем есть пункт "2.5. Low Power Operation" - в котором расписаны эти режимы, по крайней мере в общих чертах.
 
Последнее редактирование:

TRO

Member
-------------------------------------
3) Вообще-то графики и вектора это не уровень данного процессора.
Так как вы используете внешний сервер, то эти действия надо делать на сервере.
Нету у меня никакого внешнего сервера, захожу с мобилы на модуль браузером, или с компа по вайфаю. Графики и шкалы рисую текстовым скриптом SVG, вставляя в нужные места переменные. Где то тут я уже постил скриншот где я выводил 20 точек АЦП осцилограмкой, чтобы проверить визуально частоту выборки АЦП.
 
Последнее редактирование:

TRO

Member
что-то здесь у Вас ошибка "мне ка-же т-ся" Так медленно только дельта ацп работают. У вас такое внешнее АЦП?
Нету у меня внешнего АЦП, оно внутреннее, работает быстро, в луа это максимум 2 килогерца выборка, просто у меня сумарные задержки на переключение внешнего самопального мультиплексора такие получились (он на дискретных транзисторах).

Кстати, а что будет если у меня в куске (файле) будет к примеру датчик опрашиватся, а в это время прерывание по таймеру или ножке прийдет, функция на который в главном файле прописана? С катушек не слетит?
 
Последнее редактирование:

boka17

New member
такое сообщение при запуске ds18b20-example.lua - это нормально? 20к памяти не хватает?
error loading module 'ds18b20' from file 'ds18b20.lua':
not enough memory
> =node.heap()
20432
>
причем, на предыдущей версии прошивки все работало, сегодня обновил до NodeMCU 0.9.5 build 20150214 powered by Lua 5.1.4
Запускаю такой пример для DS18B20 - банально складывать Т каждую минуту

Код:
t = require("ds18b20")
-- ESP-01 GPIO Mapping
gpio0 = 3
gpio2 = 4
cRST=0
t.setup(gpio2)
addrs = t.addrs()
if (addrs ~= nil) then
  --print("addrs "..addrs)
  print("Total DS18B20 sensors: "..table.getn(addrs))
  t=ds18b20.read()
end

function sendData()
t=ds18b20.read()
print("Temp:"..t.."C")
-- conection to thingspeak.com
print("Sending data to thingspeak.com")
conn=net.createConnection(net.TCP, 0)
conn:eek:n("receive", function(conn, payload) print(payload) end)
-- api.thingspeak.com 184.106.153.149
conn:connect(80,'184.106.153.149')
conn:send("GET /update?key=X832343Y86QOOGK&field1="..t.." HTTP/1.1\r\n")
conn:send("Host: api.thingspeak.com\r\n")
conn:send("Accept: */*\r\n")
conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n")
conn:send("\r\n")
conn:eek:n("sent",function(conn)
                      print("Closing connection")
                      conn:close()
                  end)
conn:eek:n("disconnection", function(conn)
                                print("Got disconnection...\n")
  end)
cRST=cRST+1
--print("RST"..cRST.."\n")
if (cRST>60) then  node.restart()
   end
end

-- send data every 60000 ms to thing speak
tmr.alarm(0, 60000, 1, function() sendData() end )

получаю нехватку памяти....... просто запуск ds18b20-example.lua работает, а чуть больше файл -все , приехали.
Что я пропустил и делаю не так?
Сейчас откатил на старую прошивку(январь) -эти же файлы заработали.....

NodeMCU 0.9.5 build 20150127 powered by Lua 5.1.4
Total DS18B20 sensors: 1
> =node.heap()
10936
> Temp:20.8125C
Sending data to thingspeak.com
Closing connection
Got disconnection...
 
Последнее редактирование:

nikolz

Well-known member
какой размер файла в байтах и сколько размер данных в таблицах?
 

nikolz

Well-known member
1)можно скомпилировать программу
2) если данные хранить в памяти то примерно 200 значений
 

boka17

New member
файлы, которые в ESP - лог прямо с экрана ESPlorera

print(node.heap())
9256
>
> for n,s in pairs(file.list()) do print(n.." size: "..s) end
httpsendtemp.lua size: 1219
ds18b20-example.lua size: 367
init.lua size: 450
ds18b20.lua size: 3437

на прошивке NodeMCU 0.9.5 build 20150127 powered by Lua 5.1.4 все работает,
а ставлю последнюю - эти-же файлы загружаю, получаю нехватку памяти.....
 

nikolz

Well-known member
1) ds18b20.lua size: 3437 -этот файл рекомендую разделить
2) в начале, либо конце, каждого исполняемого через dofile файла поставьте collectgarbage ("collect")
 

Serenity

New member
Простенький HTTP замкнуть/разомкнуть диод, кому интересно.
По запросу на адрес (в моем случае 192.168.1.99) гаснет/горит диод
Работает как часы.
Код:
gpio.mode(3, gpio.OUTPUT)
function onoff()
gpio.read(3)
if gpio.read(3) == 0 then gpio.write(3, gpio.HIGH) else gpio.write(3, gpio.LOW) end
end

wifi.setmode(wifi.STATION)
wifi.sta.config("netid","pass")
print(wifi.sta.getip())
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
    conn:on("receive",function(conn)
    onoff()
    end)
end)
 

boka17

New member
Не выходит каменный цветок у меня....
Задачка вроде простая - беру из примеров файл работы с температурным датчиком ds18b20.lua и ds18b20-example.lua
запускаю example - все работает, вижу в терминале температуру.
Это работает и на прошивке build 20150127 и на последней build 20150214.
Немного усложняю - делаю выгрузку температуры через GET на thingspeak.com раз в минуту (код выкладывал в ответе [HASHTAG]#191[/HASHTAG] чуть выше)
На январской прошивке все работает. Единственное - иногда, через 3...6 часов работы, данные перестают передаваться (но, могут и трое суток без сбоев быть)
Пока решил "в лоб" - каждый час делаю node.restart(). Неделю эта поделка складывает данные нормально.
Обновляю прошивку до build 20150214 и получаю
NodeMCU 0.9.5 build 20150214 powered by Lua 5.1.4
lua: error loading module 'ds18b20' from file 'ds18b20.lua':
not enough memory

с теми-же файлами....
На сколько я понимаю, дело не в размере файла, а в количестве RAM, которое он использует, и с новой прошивкой этой памяти уже не хватает для вызова ds18b20.lua
из моего httpsend.
Что тут можно уменьшить ? - ума не приложу.
По сути - одна функция SendData вызывается раз в минуту. Перелопачивать ds18b20.lua не вижу смысла - все равно у меня "лучше" не получится.
Предполагаю, что RAM нещадно съедается константами типа conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n")
Эти константы в lua возможно переместить во flash ? , как у той-же Arduino ( F("...") )
Пока получается, что сделать даже простой собиратель Т силами одной ESP не так и просто - надо оствить в ней только WiFi соединение и снаружи ставить ещё MCU для остальных "рюшечек"
 

nikolz

Well-known member
1) скомпилируйте как можно больше файлов
т е сделайте node.compile("ds18b20.lua")
2) в dofile замените расширения .lua скомпилированных файлов на .lc
-------------------------------
поясняю.
Когда Вы используете .lua, то сначала грузится ваш файл (например ds18b20.lua size: 3437)
вызывается компилятор и создается байт-код (расширение .lc)
Как правило байт код бывает такой же размером.
Т е для файла ds18b20.lua надо при запуске с расширением .lua примерно 7 кбайт оперативной памяти.
А если вы скомпилировали заранее, то для запуска потребуется в два раза меньше.
Вот Вам и свободная память.
-------------------------------------
Далее.
---------------------------------
В программах датчиков бывает много настроек и последовательного расчетного кода (линейный алгоритм)
Это значит что разовый (настроечный код) можно вызвать один раз без вызова расчетной части,
а после настройки вызывать расчетную часть.
В результате получим экономию на размер меньшей из частей.
----------------------------------------
Можете сделать это для ds18b20 и показать мне, я объясню ошибки, если будут.
------------------------------------------------
 

nikolz

Well-known member
Предполагаю, что RAM нещадно съедается константами типа conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n")
Эти константы в lua возможно переместить во flash ? , как у той-же Arduino ( F("...") )
Пока получается, что сделать даже простой собиратель Т силами одной ESP не так и просто - надо оствить в ней только WiFi соединение и снаружи ставить ещё MCU для остальных "рюшечек"
Не совсем так.
1) Для хранения текстов в луа используется хэш-код. Поэтому текст хранится экономно, без повторений.
2) Мое мнение - на ESP можно сделать все, что не требует скорости дискретизации больше, чем 1 гц.
---------------------------------------
Лирическое отступление:
Вообще-то написание программ, как написание художественных произведений на каком-либо языке.
Например, чтобы написать на японском, надо пригласить писателя -японца или написать рассказ на русском,
а потом найти хорошего переводчика.
К сожалению большинство программистов-любителей смело пишут рассказы на любом языке методом выбора слов из словаря.
А потом ругают языки( путаница у них в японском), или авторучку (типа мало чернил в ней и перо кривое) ну и т далее
-------------------------
 

boka17

New member
Благодарю nikolz за детальный анализ моих проблем с кодом!
Надо попробовать скомпилировать в .lc - так ещё не делал.
По поводу работы с датчиком - я беру ds18b20.lua из NodeMCU\nodemcu-firmware-master\lua_modules\ds18b20\ как он лежит на гитхабе.
Когда в NodeMCU добавили float, эта библиотека стала некорректно возвращать температуру - исправил сам, причем так-же, как потом исправили и на сайте :)
Делать "с нуля" свою библиотеку ..... зачем, если есть готовая в примерах? Для моих поделок хватит за глаза.
Написать свой код "на японском" :) у меня точно не получится лучше, хотя я и разбирался (ранее) с этим DS18B20 до бита и его 1wire мне понятен.
Разбирать систему команд процессора ESP досконально у меня нет возможности/времени (да и особой необходимости тоже нет - хобби)
Я воспринимаю NodeMCU как "кубик" с некоторым набором интересных свойств, которые я хочу применить в своём "примитивном" поделии.
И совершенно не ругаю и не пинаю этот "японский язык", если что-то не получается.
"Безумство и отвага" - вот девиз настоящего любителя :) при желании освоить/написать программу на новом языке.
Выжимать все из камушка с весьма ограниченным объемом памяти и числом ног можно только при четком понимании, зачем это нужно.
Самого сильно раздражает, когда для простейшей задачи - подрыгать ногой и помигать светодиодом, применяют мощнейший 32 разрядный CPU ,
обвешанный , как спецназовец оружием, всякими интерфейсами и фичами -мол, это круто и сейчас легко доступно.
И чтобы написать код для него надо освоить новую "экосистему" в программировании, а на выходе будет все те-же PIN=1 delay PIN=0.
Для себя начинаю убеждаться, что с ESP надо переходить на AT прошивки, все делать снаружи другим CPU , а ESP использовать только как WiFi мост.
Мои простые задачки не соизмеримы по затратам усилий на их доскональную оптимизацию внутри ESP.
 

nikolz

Well-known member
boka17,
Информация к размышлению.(совершенно секретно)
-------------------------------------
У меня модуль ds18b20.lua имеет размер 560 байт,
вместо указанного Вами из примера: ds18b20.lua size: 3437 байт.
------------------------------------------------
Кроме того, программа в примере задерживает работу процессора на 750 ms для готовности датчика
У меня задержки нет, а на опрос датчиков dS тратится 40 ms (сейчас датчиков три).
И все это сделано на луа.
-
 
Сверху Снизу