сайт для палких паяльників

ESP8622 имеет один полноценный UART порт. NodeMCU позволяет использовать еще один UART порт, который может только передавать данные, но нас интересует полноценный порт. Небольшая сложность использования UART порта возникает из-за того, что по этому же порту происходит программирование платы NodeMCU. Когда запускается скрипт, который использует UART, скрипт перехватывает весь ввод по порту UART, и NodeMCU не будет выполнять никаких команд, пока скрипт не “отпустит” UART. Чтобы избежать блокировки NodeMCU и обеспечить возможность отправлять команды, применим прием, описанный в статье “ESP8266 NodeMCU Прошивка. Делаем WiFi розетку“. Т.е. делаем автозапуск скрипта с задержкой. Это даст нам несколько секунд контроля над NodeMCU чтобы исправить ситуацию если что-то пойдет не так. Пример скрипта init.lua:

print("Waiting ...")
tmr.register(0, 5000, tmr.ALARM_SINGLE, function(t) tmr.unregister(0); print("Starting..."); dofile("uart1.lua") end)
tmr.start(0)

Примечание: NodeMCU позволяет передавать интерпретатору данные принятые скриптом по порту UART. Для этого в функции

uart.on (method, [number / end_char], [function], [run_input])

последний параметр run_input должен быть 1. Подробнее в документации https://nodemcu.readthedocs.io/en/master/en/modules/uart/ В большинстве случаев порт UART используют для приема и отправки данных и, как правило, данная опция не используется.

По умолчанию скорость порта  115200bps. NodeMCU автоматически подбирает корректную скорость работы UART. Если к UART подключить, скажем, GPS модуль, то NodeMCU подберет нужную скорость для корректной работы. Это очень удобно, поскольку разные модули могут работать на разных скоростях. Автоподбор скорости порта избавляет от необходимости хранить настройки порта. Тем не менее, можно четко указать параметры работы UART порта с помощью функции:

uart.setup (id, baud, databits, parity, stopbits [, echo])

Для чтения данных из порта UART выполняется регистрация callback функции, которой в качестве параметра передается принятые символы. callback функция “цепляется” на событие “data”. Других событий пока нет. При регистрации можно указать, когда вызывать функцию. При получении определенного количества символов или когда будет получен указанный символ, например, символ конца строки. Когда такое событие возникает, вызывается функция и ей в качестве параметра передается вся строка, которая была принята.

Пример:

print('Please enter parameter: ')

uart.on("data", "\r",
  function(data)
    print("Received from uart:", data)
    uart.on("data") -- unregister callback function
end, 0)

Такой прием ввода параметров используется в некоторых решениях для указания базовых настроек, например для указания WiFi сети для подключения.
Обратите внимание, скрипт не ожидает окончания ввода, а продолжает работу. Описанная функция будет вызвана при получении символа перевода строки “\r”.

Программируя на LUA не принято использовать “бесконечные циклы” для ожидания какого либо события, например, для ожидания ввода параметра. Поэтому, когда потребуется от пользователя ввести последовательно два и более параметра, придется использовать рекурсивный вызов функции, как это сделано в следующем примере:

-- Init Parameters
pCount = 2
pNames = {}
pNames[0] = "Parameter 1"
pNames[1] = "Parameter 2"
pValues = {}
pValues[0] = 'default value'
pValues[1] = 'default value'

function input(pNumber)
  print('Please enter '..pNames[pNumber]..': ')
  uart.on("data", "\r",
    function(data)
      -- Trim
      data = string.gsub(data, "%s+", "")

      -- If not empty
      if data ~= '' then
        pValues[pNumber] = data
      end
      
      print("Received from uart:", pValues[pNumber])
      uart.on("data") -- unregister callback function
      if (pNumber < pCount-1 ) then
        input(pNumber+1)
      else 
        print("Done.")
        print('-----------')
        for i=0,pCount-1,1 do
            print(pNames[i]..'='..pValues[i])
        end
        print('-----------')
      end      
  end, 0)
end

input(0)

В следующей статье мы подключим к ESP8622 GPS приемник и сделаем простой GPS трекер.

Подробная информация про модуль UART в документации NodeMCU

Успехов.

Смотри также:

3 комментария: ESP8266 NodeMCU. UART

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

 
Translate
Архіви

© 2011-2017 Андрій Корягін, Кременчук - Київ, Україна