Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "NodeMCU", создана пользователем Victor, 9 дек 2014.

  1. Victor

    Victor Administrator Команда форума

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

    Я начну с примера использования из wiki модуля для DS18B20
    Код (Text):
    1. t=require("ds18b20")
    2. t.setup(9)
    3. addrs=t.addrs()
    4. -- Total DS18B20 numbers, assume it is 2
    5. print(table.getn(addrs))
    6. -- The first DS18B20
    7. print(t.read(addrs[1],t.C))
    8. print(t.read(addrs[1],t.F))
    9. print(t.read(addrs[1],t.K))
    10. -- The second DS18B20
    11. print(t.read(addrs[2],t.C))
    12. print(t.read(addrs[2],t.F))
    13. print(t.read(addrs[2],t.K))
    14. -- Just read
    15. print(t.read())
    16. -- Just read as centigrade
    17. print(t.read(nil,t.C))
     
  2. skylocker

    skylocker Новичок

    Сообщения:
    49
    Симпатии:
    0
    А у Вас так получилось нормально температуру получить?

    У меня при использовании этой промежуточной библы все время 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 с чем может быть связана?
     
    Последнее редактирование: 9 дек 2014
  3. CHERTS

    CHERTS Moderator Команда форума

    Сообщения:
    483
    Симпатии:
    108
  4. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.983
    Симпатии:
    1.301
    С "неправильной" терминальной программой. Например с XTCOM_UTIL. Используйте нормальные программы COM терминалов...
     
  5. skylocker

    skylocker Новичок

    Сообщения:
    49
    Симпатии:
    0
    Кто знает.. Исходники-то закрыты. Вполне допускаю, что адаптировали Arduino-библиотеку.
     
  6. skylocker

    skylocker Новичок

    Сообщения:
    49
    Симпатии:
    0
    Я использую CoolTerm. Зря? Посоветуйте что-то более подходящее, плз.

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

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

    pvvx Активный участник сообщества

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

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

    skylocker Новичок

    Сообщения:
    49
    Симпатии:
    0
    Спасибо за помощь. Наверное, действительно беда в недрах винды. Извините за оффтоп.
     
  9. hav0k

    hav0k Читатель

    Сообщения:
    47
    Симпатии:
    8
    Новости ну очень радостные.

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

    Код (Text):
    1. function HTTPd()
    2.   print('start http serv')
    3.   srv=net.createServer(net.TCP, 5)
    4.   srv:listen(80,function(conn)
    5.     conn:on("receive",function(conn,payload)
    6.       print(payload)
    7.  
    8.       if string.find(payload, "key="..c_api_key) then
    9.         msg = "key_ok"
    10.         if string.find(payload,"mode=on") then
    11.           on()
    12.         else
    13.           if string.find(payload,"mode=off") then
    14.             tmr.stop()
    15.             off()
    16.           else
    17.             if string.find(payload, "mode=party") then
    18.               party(200)
    19.             end
    20.           end
    21.         end
    22.       else
    23.         msg = "error_key"
    24.       end
    25.       conn:send("<html><head></head><body><h1> mode=[on,off,party] key='api_key' </h1><p>"..msg.."</p></body></html>")
    26.     end)
    27.     conn:on("sent",function(conn) conn:close() end)
    28.   end)
    29. end
    Хочю функцию сериализации/десериализации мож тыкнете. Есть что то по приятнее чем string.find(payload, "substr")? Видал модули JSON но мне показался слишком тяжелым. Даже загрузить не смог.

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

    skylocker Новичок

    Сообщения:
    49
    Симпатии:
    0
    Это, скорее, вопрос к pvvx - он в дебрях Си-шного кода может в стек TCP/IP посмотреть..
     
  11. skylocker

    skylocker Новичок

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

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

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

    pvvx Активный участник сообщества

    Сообщения:
    8.983
    Симпатии:
    1.301
    Нет, не отвечают.
    Как определить, если устройства не соединены в единую сеть? Если все коннектятся к одной базе, а она имеет известное распределение DHCP сервером по адресам, то на Lua пишите опрос каждого адреса каждым девайсом и по наличию заранее готового ответа (открытого порта со спец ответом в lua) определите, какие модули есть в сети :) И так через каждый момент времени, когда надо знать какие девайсы в сети, пока от Lua тошнить не будет :)
    Это и так работает, но... их много "но".
     
  13. skylocker

    skylocker Новичок

    Сообщения:
    49
    Симпатии:
    0
    Каких? Поделитесь, плз, - мож по схеме пины какие нужно соединить или что программно активировать нужно?
     
  14. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.983
    Симпатии:
    1.301
    Не знаю, как в конкретной Lua прошивке, но когда зависает, то срабатывает watchdog и всё перезагружается. На процесс перезагрузки могут влиять ножки, с уровнем ноль. Если все в единичке, то перезагружается всегда нормально... Тут надо конкретно смотреть, что там у вас и как :(
     
  15. hav0k

    hav0k Читатель

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

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

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

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


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

    skylocker Новичок

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

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

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

    pvvx Активный участник сообщества

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

    skylocker Новичок

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

    При чем тут RX?
     
  19. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.983
    Симпатии:
    1.301
    Системный 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.
     
  20. skylocker

    skylocker Новичок

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

Поделиться этой страницей