ESP-8266/ESP32 NodeMCU Lua: азы программирования.

Тема в разделе "ESP8266, ESP32", создана пользователем ИгорьК, 25 июл 2017.

  1. y4ixer

    y4ixer Нуб

    Как раз этим и занимаюсь! Спасибо Вам за помощь :)
     
  2. ИгорьК

    ИгорьК Гуру

    А может лучше перепродумать устройство? Зачем вам прозрачный уарт? Вы по нему звук гоняете? Наверняка какие-то стандартные данные.
     
  3. y4ixer

    y4ixer Нуб

    Удлинитель ком-порта. Вместо RS232 использовать WiFi :) Такова задача.
    В принципе, того, что есть сейчас достаточно (поток клиент - сервер). Но хотелось бы сделать законченное решение.
     
  4. y4ixer

    y4ixer Нуб

    [​IMG]
    Пошаманил немного код. Теперь он выглядит вот так. Вынес событие получения данных по uart отдельно.
    P.S. Всё равно требует перевод строки :(
    Код (Lua):

    global_sv = nil

    sv = net.createServer(net.TCP,timeout)
    sv:listen(80,function(c)

        if global_sv~=nil then
        global_sv:close()
        end
        global_sv = c
        global_sv:on("receive",function(c,l)
            uart.write(0, l)
            blink(pin1)
        end)
       end)
        uart.on("data", 0,
            function(data)
            if global_sv~=nil then
            global_sv:send(data)
            blink(pin2)
            print("DATA = "..data)
            end
        end, 0)
     
    Blink() это Ваша функция из примеров на 1 странице. Выяснилась интересная вещь.

    При отправке данных с клиента callback global_sv:eek:n("receive",function(c,l) uart.write(0, l) blink(pin1) end) вызывается 1 раз. Отправляю 1 символ - вызывается callback и соответственно функция blink. Диод загорается либо гаснет.

    А вот при отправке данных с сервера (соответственно с переводом строки) callback uart.on("data", 0, function(data) blink(pin2) global_sv:send(data) end, 0) вызывается 2 раза (распечатка два раза выводится о смене состояния пина). Отправляю 1 символ - вызывается callback и функция blink, только это происходит с задержкой, т.к. я вижу мигание диода. Если бы это происходило быстро, думаю для меня он был бы постоянно погашен. Вывел распечатку получаемых данных с uart после отправки в соккет. Выглядит это дело вот так
    uart.JPG
     
    Последнее редактирование: 7 июн 2019
  5. Chewing

    Chewing Нуб

    Это всё замечательно, НО. Соединяться с сервером где то там я тысячу раз уже могу, и через ESPlorer и через ардуино иде. Не сказать что профи, но факт был неоднократный. Использовать ESP как контроллер предположим тоже могу. Но все это мне сто раз не принципиально. А вот что нужно где и как написать что бы получить по вай фай хотя бы один байт от рядом стоящего такого же модуля так никто и не рассказывает. Ну либо я тупой и не могу этого понять, что вероятнее)
    Ясен перец один модуль точка доступа второй подключается к нему как клиент. Как я понял тисипи айпи соединение это и есть такая связка. Предположим я могу это сделать. А дальше то что? как послать байт моей личной инфы с одного устройства и как её получить на другом устройстве?
    Причем способы отправки данных на сервер и получение данных с сервера что работали в ардуино иде в связке двух esp почему то не работают. в lua я эти фокусы пока не успел испробовать.

    Расскажите, пожалуйста, а?!

    На заметку, из примеров, приведенных в этой теме ни один не работает. приходится каждый раз корректировать код, например таймер у меня работает никак иначе кроме как tmr.alarm(1,1000,1,function) 1-е 2-е и 4-е как пример, 3-е так и не понял зачем нужна эта единичка, но полагаю вопрос исчезнет когда всерьез возьмусь за сам язык. но таймер через create.alarm и другими способами тупо не работает. Если конечно в коде в примерах нет ловушечек для дурака, тогда после изучения lua этот вопрос отпадет тоже)
     
    Последнее редактирование: 11 июн 2019
  6. ИгорьК

    ИгорьК Гуру

    Просто у вас старая версия прошивки 1.5.4:
    https://nodemcu.readthedocs.io/en/1.5.4.1-final/

    Там в разделе про таймер все объясняется.

    Как отправлять байтик от одной ESP-8266 к другой здесь действительно не описано, потому что тема просто о языке Lua, о том как писать на нем код.
     
  7. Chewing

    Chewing Нуб

    И? подумал я сначала. А потом с УДИВЛЕНИЕМ обнаружил что на этом форуме есть и другие темы)) В общем спасибо за легкий пинок, вроде пока есть мысли куда дальше двигаться.
     
  8. swc

    swc Гик

    Здесь много интересного. В том числе и ответы на Ваши вопросы.
    https://nodemcu.readthedocs.io/en/master/
     
  9. ИгорьК

    ИгорьК Гуру

    Вот что написано в посте N2 этой темы:
    SmartSelect_20190620-231632_Samsung Internet.jpg

    Да... ничего не поделать с этим. Каждый читает что ему здесь и сейчас нравится.
     
    swc нравится это.
  10. Костя++

    Костя++ Нерд

    Приветствую! Стоит задача ограничить несанкционированный доступ по rs232 на ESP8266(nodemcu), программно. Если кто, что подскажет буду признателен.

    Вдруг кому пригодится, искал решение подсчет CRC16 для MODBUS_RTU, не нашел, написал свое(чтоб не с пустыми руками...).
    Код (Lua):
    function CRC16(data)
        local crc16 = 65535
        local H
        local L
        local byte
        for i = 1, data:len() do
            byte = data:byte(i)
            for b = 0, 7 do
                if bit.isset(bit.bxor(byte,crc16),0) then
                    crc16 = bit.rshift(crc16,1)
                    crc16 = bit.bxor(crc16,40961)
                else
                    crc16 = bit.rshift(crc16,1)
                end
                byte = bit.rshift(byte,1)
            end
        end
        H = bit.rshift(crc16,8)
        L = bit.clear(crc16,8,9,10,11,12,13,14,15)
        return H,L      
    end
     
    ИгорьК нравится это.
  11. ИгорьК

    ИгорьК Гуру

    Ни разу не понял.


    Где-то на этом сайте я публиковал. Надо сравнить :)
     
  12. Костя++

    Костя++ Нерд

    Что бы перед обменом по rs232 нужно было сначала авторизоваться. ну я в принципе и сам знаю как это сделать, но может есть специфический модуль для этого написанный на C? Простом языком ввел логин и пароль, потом делай что хочешь, а до тех пор никаких данных получить нельзя.
     
  13. ИгорьК

    ИгорьК Гуру

    О, нашёл в запасах:

    Код (Lua):
    do
    function process_crc(aData)
        local crc = 0xFFFF

        for i = 1, #aData do
            crc = bit.bxor(crc, string.byte(aData, i))
            for j = 0, 7 do
                if bit.band(crc, 1) > 0 then
                    crc = bit.rshift(crc, 1)
                    crc = bit.bxor(crc, 0xA001)
                else
                    crc = bit.rshift(crc, 1)
                end
            end
        end
        return crc
    end
    a = '\001\006\000\001\008\252'
    print(string.format('%X',process_crc(a)))
    end
     
  14. ИгорьК

    ИгорьК Гуру

    Модуля на Си не встречал.
     
  15. parovoZZ

    parovoZZ Гуру

    а зачем это?
     
  16. Костя++

    Костя++ Нерд

    Работодателю надо зачем то...
     
  17. ИгорьК

    ИгорьК Гуру

    Ну а в чем проблема то? Модуль слушает uart и пока не получит json, что у него записан заранее, в порт больше ничего не выводит.
     
  18. Костя++

    Костя++ Нерд

    Ну это не проблема вовсе, думал может есть специализированный модуль, потому и спросил. Сам я не сижу на этой железке, только время от времени проектов много...
     
  19. swc

    swc Гик

    Lua - интерпретатор. Это свойство открывает возможности, недостижимые компиляторам. Вы можете выполнять команды "на лету". Ваш вариант: Извне, по UART вы можете разместить в SPIFFS файл скрипта проверки пароля. При старте он активируется. Событие порта вызывает функцию проверки пароля и все Ок. Пароль можно по по UART менять хоть каждый час.
     
    ИгорьК нравится это.
  20. Костя++

    Костя++ Нерд

    Я примерно так и планировал реализовать, спасибо за Ваш ответ!