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

ESP8266 имеет один полноценный 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)

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

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

Успехов.

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

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

Translate
Архіви

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