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

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

Victor

Administrator
Команда форума
Предлагаю выкладывать сюда ваши находки и собственные разработки LUA скриптов для NodeMCU.
Несмотря на очень либеральные устои нашего форума, просьба вести обсуждение скриптов и вопросы по ним задавать в других темах, чтобы не засорять эту.

Я начну с примера использования из wiki модуля для DS18B20
Код:
t=require("ds18b20")
t.setup(9)
addrs=t.addrs()
-- Total DS18B20 numbers, assume it is 2
print(table.getn(addrs))
-- The first DS18B20
print(t.read(addrs[1],t.C))
print(t.read(addrs[1],t.F))
print(t.read(addrs[1],t.K))
-- The second DS18B20
print(t.read(addrs[2],t.C))
print(t.read(addrs[2],t.F))
print(t.read(addrs[2],t.K))
-- Just read
print(t.read())
-- Just read as centigrade
print(t.read(nil,t.C))
 

skylocker

Member
А у Вас так получилось нормально температуру получить?

У меня при использовании этой промежуточной библы все время 85 выдает, а другой пример (в исходниках, ds18b20-example.lua, с прямыми вызовами методов ow. (ow.setup, ow.reset_search, ow.search, ...)) нормально заработал - показывает реальную температуру, только зацикливается - думаю, в примере ошибка и вместо
until((addr ~= nil) or (count > 100))
правильно использовать
until((addr ~= nil) and (count < 5))

Еще не проверял - в очередной раз что-то с COM-портом (при вытыкании USB-COM переходника COM-порт не освобождается системой), нужно перезагружаться, да и уже поздно. Кстати, такая беда с COM с чем может быть связана?
 
Последнее редактирование:

pvvx

Активный участник сообщества
Еще не проверял - в очередной раз что-то с COM-портом (при вытыкании USB-COM переходника COM-порт не освобождается системой), нужно перезагружаться, да и уже поздно. Кстати, такая беда с COM с чем может быть связана?
С "неправильной" терминальной программой. Например с XTCOM_UTIL. Используйте нормальные программы COM терминалов...
 

skylocker

Member
Вообще разработчикам nodeMCU нужно сделать Ата та по поводу DS18B20, библиотеку наверняка стырили у Андрея и выдали за свою, оригинал -> https://github.com/nekromant/esp8266-frankenstein/blob/master/src/cmd_ds18b20.c
Некрасиво с их стороны.
Кто знает.. Исходники-то закрыты. Вполне допускаю, что адаптировали Arduino-библиотеку.
 

skylocker

Member
С "неправильной" терминальной программой. Например с XTCOM_UTIL. Используйте нормальные программы COM терминалов...
Я использую CoolTerm. Зря? Посоветуйте что-то более подходящее, плз.

К слову, я ни разу не видел чего-либо после node.restart() - проблема тоже в терминале (COM-порт вроде не отваливается)?

Из железа (вдруг это тоже на что-то влияет) использую пока что ESP-01 и пробовал два USB/TTL переходника (один на Prolific 2303, второй на Silicon CP2102) - результат один.. :(
 

pvvx

Активный участник сообщества
Возможная причина - в windows, при отключении USB-COM переходника надо закрывать COM порт. При последующем включении переходника, если COM порт не закрыт в программе терминала, то его не будет в системе. Терминал должен отслеживать отключение и закрывать порт.
При таких условиях, нормально работает этот https://sites.google.com/site/terminalbpp/

Но не последняя версия. В последней версии, у меня, на win64, ошибки cавтоскролингом. Использовал предыдущую версию...
 
Последнее редактирование:

skylocker

Member
Спасибо за помощь. Наверное, действительно беда в недрах винды. Извините за оффтоп.
 

hav0k

New member
Новости ну очень радостные.

Пример http сервера : http://10.10.10.xxx/?mode=[on,off,party]&key='api_key'

Код:
function HTTPd()
  print('start http serv')
  srv=net.createServer(net.TCP, 5)
  srv:listen(80,function(conn)
    conn:on("receive",function(conn,payload)
      print(payload)

      if string.find(payload, "key="..c_api_key) then
        msg = "key_ok" 
        if string.find(payload,"mode=on") then
          on()
        else
          if string.find(payload,"mode=off") then
            tmr.stop()
            off()
          else
            if string.find(payload, "mode=party") then
              party(200)
            end
          end
        end
      else
        msg = "error_key"
      end
      conn:send("<html><head></head><body><h1> mode=[on,off,party] key='api_key' </h1><p>"..msg.."</p></body></html>")
    end)
    conn:on("sent",function(conn) conn:close() end)
  end)
end
Хочю функцию сериализации/десериализации мож тыкнете. Есть что то по приятнее чем string.find(payload, "substr")? Видал модули JSON но мне показался слишком тяжелым. Даже загрузить не смог.

Так же интересует вопрос отвечают ли датчики по широковещательному адресу( и как реализовать на nodeMCU), нужно определить есть ли еше кто в текущей подсети.
 
Последнее редактирование:

skylocker

Member
Так же интересует вопрос отвечают ли датчики по широковещательному адресу( и как реализовать на nodeMCU), нужно определить есть ли еше кто в текущей подсети.
Это, скорее, вопрос к pvvx - он в дебрях Си-шного кода может в стек TCP/IP посмотреть..
 

skylocker

Member
У меня другой вопрос - вдруг кто знает ответ: как активировать watchdog в nodemcu?

Нутром чую, он должен быть по дефолту включен (т.к. есть только ф-ция сброса таймера), но глазами вижу, что, когда девайс зависает, помогает только отключение питания.. (передергиваю USB) ((

Как сделать так, чтобы при зависании железка сама ребутилась через некоторое время? (всякое бывает, но если это - stand alone девайс, будет нехорошо руками его передергивать каждый раз)
 

pvvx

Активный участник сообщества
Новости ну очень радостные.
Так же интересует вопрос отвечают ли датчики по широковещательному адресу( и как реализовать на nodeMCU), нужно определить есть ли еше кто в текущей подсети.
Нет, не отвечают.
Как определить, если устройства не соединены в единую сеть? Если все коннектятся к одной базе, а она имеет известное распределение DHCP сервером по адресам, то на Lua пишите опрос каждого адреса каждым девайсом и по наличию заранее готового ответа (открытого порта со спец ответом в lua) определите, какие модули есть в сети :) И так через каждый момент времени, когда надо знать какие девайсы в сети, пока от Lua тошнить не будет :)
Как сделать так, чтобы при зависании железка сама ребутилась через некоторое время? (всякое бывает, но если это - stand alone девайс, будет нехорошо руками его передергивать каждый раз)
Это и так работает, но... их много "но".
 

pvvx

Активный участник сообщества
Каких? Поделитесь, плз, - мож по схеме пины какие нужно соединить или что программно активировать нужно?
Не знаю, как в конкретной Lua прошивке, но когда зависает, то срабатывает watchdog и всё перезагружается. На процесс перезагрузки могут влиять ножки, с уровнем ноль. Если все в единичке, то перезагружается всегда нормально... Тут надо конкретно смотреть, что там у вас и как :(
 

hav0k

New member
Надеюсь микро питон меня спасет меня или буду учить си, когда от Lua не будет торкать.
Получается нужен внешний трекер, а хотелось отказаться от интрнета.

Датчики не знают друг о друге, но после включения в течении 5 мин должны обменяться табличкой аля DHT, при условии о wifi знаем только (ssid и ключ).

Тут у меня только два варианта это "облачный трекер" или пинг всей подсети, ладно если подсесть 24 не так страшно, но этож ацкиий костыль, да и зачем с сеть срать.

А пока на выходны займусь модулем сериализации.


Skylocker, по поводу ищейки она у меня наоборот срабатывала когда не надо.
 
Последнее редактирование:

skylocker

Member
Хм.. возможно, и у меня WD срабатывал - по симптомам похоже на Ваше "срабатывала когда не надо" - в длительных операциях, когда я не делал tmr.wdclr(), в консоль вываливался какой-нибудь символ и на GPIO появлялся HIGH (на нулевом - точно, у меня туда LED подключен - он загорался). После этого интерпретатор lua не воркал (COM-порт не отваливался, но и консоль не откликалась).

Что всегда смущало (почему я и думал, что все зависло намертво и WDT не работает) - то, что софт-переподключение COM-порта не оживляло консоль, приходилось передергивать USB2TTL.. Также, по всем сиптомам init.lua не отрабатывал (для теста модуль коннектился к серверу и отправлял пекетики - при аппаратной перезагрузке их отправка возобновлялась, при зависании/возможном срабатывании WDT - нет).

Вот я и подумал, что, наверное, WDT не срабатывает - зависает..
По поводу "срабатывала когда не надо" - у меня только с опросом кнопки было замечено подобное гарантированное "зависание", которое не ушло даже при юзании tmr.wdclr()
 

pvvx

Активный участник сообщества
По поводу "срабатывала когда не надо" ...
Исходников lua нет и сказать точно ничего нельзя. Если дернуть ногу RX системного UART порта (если он не отключен и не сняты другие прерывания с ножек портов при инициализации в прошивке Lua) то происходит перезагрузка модуля. При этом, если нога boot-а опущена (уже и не помню какая, т.к. модули вставляю в давно подготовленную макетку со всеми подключениями и 2-мя RS-TTL, включая логический анализатор всех I/O) , то всё идет на начальный загрузчик flash и там и остается, в ожидании приема новой программы... Я это использую, когда частая отладка и прошивка модуля - программа программатора дергает ножку RX и всё само перезагружается в режим программирования.
 

skylocker

Member
Как я понимаю, под boot-pin Вы имеете в виду pin8 (XPD_DCDC), который обычно должен быть законнекчен на pin32 (EXT_RSTB). В nodeMCU указано, что в случае такого подключения, короткое прижимание к земле вызовет рестарт, длинное (>3 сек) - изменение частоты моргания светодиода... Оба события можно переназначить.

При чем тут RX?
 

pvvx

Активный участник сообщества
Системный UART имеет RX и TX ноги. По старту, в оба UART идет информация вида:
ets Jan 8 2013,rst cause:2, boot mode:(1,7)
На 74880 Baud. Это если опущен boot. Если нет, то:

ets Jan 8 2013,rst cause:2, boot mode:(3,7)

load 0x40100000, len 25880, room 16
tail 8
chksum 0xee
load 0x3ffe8000, len 2932, room 0
tail 4
chksum 0x6f
load 0x3ffe8b80, len 7632, room 4
tail 12
chksum 0x02
csum 0x02
И оба порта работают, пока не переназначены их функции. Обычно переназначают один порт, а второй остается принимать по той пресловутой RX.
 

skylocker

Member
Спасибо за пояснения.. А на каких ногах второй UART?
По распиновке SoC я вижу лишь один UART - на 25 и 26 ногах (U0TXD и U0RXD соответственно)
 
Сверху Снизу