ESP8266 NodeMCU. UART
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
Успехов.
Смотри также:
- ESP8266 NodeMCU Первое знакомство. Делаем WiFi розетку
- ESP8266 NodeMCU. PWM
- ESP8266 NodeMCU. ADC
- ESP8266 NodeMCU. timer, rtc, SNTP, cron
- ESP8266 NodeMCU. Файловая система + SD карточка
- ESP8266 NodeMCU. UART
- GPS-трекер на базе ESP8266
- GPS-трекер + Дисплей SSD1306
- ESP8266 NodeMCU. SSD1306. U8G
- ESP-01 (ESP8266) upgrade flash memory to 4MB
- ESP8266 NodeMCU. I2C. BME280/
- Метеостанция на ESP8266
http://www.avislab.com/blog/gps-tracker-esp8266_ru/
Додати коментар
Недавні записи
- 🇺🇦 FOC Board STM32F103RB 🧩
- STM32 Motor control SDK - керування оборотами мотора за допомогою потенціометра 📑
- Flask✙Gunicorn✙Nginx➭😎
- STM32 Motor control SDK - програмне керування обертам мотора
- STM32 Motor control SDK - як створити перший проект
- Vue SVG. Приклад побудови живого параметричного креслення
- Вимірювання моменту мотора
- Vue SVG - компонент. Приклад 📑
- Flask + Vue 🏁 Финальный пример 🏁
- Flask, CORS, JSON-файл. Пример#6
Tags
bldc brushless stm32 motor web html css flask atmega foc git java-script pmsm raspberry-pi python websocket mongodb esp8266 nodemcu st-link tim timer docker ngnix programmator ssd1331 ssd1306 wifi uart meteo bme280 bmp280 i2c gps mpu-6050 mpu-9250 sensors 3d-printer options usb barometer remap watchdog flash eeprom rtc bkp encoder pwm servo capture examples dma adc nvic usart gpio books battery dc-dc sms max1674 avr lcd dht11 piezo rs-232 rfid solar exti bluetooth eb-500 displays ethernet led smd soldering mpx4115a hih-4000
Архіви