Nodemcu esp8266 lua: NodeMCU LUA Amica R2 ESP8266 Wifi Board
Прошивка NodeMCU на базе модуля esp8266
NodeMCU — это прошивка, которая позволяет запрограммировать ESP8266 модуль lua скриптом.
По работе модуль очень схож с платой Ардуино. С помощью всего нескольких строк кода вы можете установить WiFi-соединение, управлять с esp8266 контроллером, превращая ваш esp8266 в веб-сервер, умную лампочку, умную розетку и многое другое.
Схема и подключение программатора (3.3V FTDI) к ESP8266
Распиновка ESP8266:
Отдельно приводим соединения в таблице:
ESP8266 | FTDI |
---|---|
RX | TX |
TX | RX |
CH_PD | 3.3V |
GPIO 0 | GND |
VCC | 3.3V |
GND | GND |
Схема соединений примерно будет выглядеть так:
После подключения вашей платы к компьютеру, вам необходимо скачать программу для прошивки NodeMCU. Скачать Node MCU Flasher для Windows можно по следующим ссылкам:
После загрузки файла, запустите его, у вас появится окно, как на картинке ниже, во вкладке com port, необходимо выбрать порт, на котором будет подключен ваш ESP8266.
На вкладке Config, выберите файл прошивки, которую можно скачать по ссылке ниже. После того как вы выберете прошивку, нажмите Flash, дождитесь окончания загрузки прошивки и всё готово.
Последнюю версию прошивки можно взять на гитхабе.
Первая программа на LUA / esp8266 / Электроника (современная)
Первый скрипт на LUA для новичков
После того как Вы научились подключать модуль и менять прошивку в прошлой статье, настало время и написать первую программу(скрипт) на языке LUA в прошивке NODEMCU.
Срипт будет подключаться к Вашему роутеру, используя обычный таймер с задержкой выведет в терминал полученный ip адрес.
Прошивку Lua 5.1.4 on SDK 1.5.4.1 я использовал скомпилированную на сайте nodemcu-build.com/
Модули использовал при компиляции следующие:
adc,bit,bmp085,crypto,dht,encoder,file,gpio,http,i2c,net,node,ow,pwm,rtctime,sntp,spi,tmr,u8g,uart,websocket,wifi
Можно использовать и минимальный набор для первых уроков, но есть и перспектива изучения всех модулей.
Для написания и загрузки LUA скрипта потребуется программа ESPLORER либо Lualoader.
Мы будем использовать ESPLorer.zip и так как программа ESPlorer.jar работает в среде JAVA нам потребуется предварительно её установить скачав с сайта JAVA.com
Установив яву и запустив ESPlorer.jar подключаемся к ком порту на скорости 115200, в моём случае это порт COM6, посмотреть можно в диспетчере устройств.
Интерфейс программы выглядит так(кликабельно)
В левой части программы находятся нужные нам инструменты для работы с esp контроллером, в правой части сам терминал который нам выдаёт информацию.
Закладка NodeMCU & MicroPython > Scripts
Создаём новый файл со следующим содержимым(меняем имя и ключ сети):
wifi.setmode(wifi.STATION) --переключаемся в режим станции(клиент)
print('set mode=STATION (mode='..wifi.getmode()..')') -- сообщаем об этом в терминал
print('MAC: ',wifi.sta.getmac()) -- выводим мак устройства в терминал
wifi.sta.config("Имя сети","Пароль сети wifi") --!!!!настройки вашей сети вайфай!!!!!!
print("wait 10 sec and print ip adress")
tmr.alarm(0, 10000, 0, function() -- простенький таймер на одно выполнение через 10 сек
print(wifi.sta.getip())-- выводим ip который присвоил роутер, если nil то не подключился или пароль не подходит
end)
Сохраняем файл под именем init.lua и если файл вгрузился в модуль сам то хорошо, если не догрузился или не загрузился вовсе то вгружаем самостоятельно использовав кнопку UPLOAD находящуюся внизу окна редактирования.
Можно проверить работу перезагрузив модуль через RESET или закладка NodeMCU & MicroPython > Commands > Restart ESP.
После рестарта модуля(я использую кнопку
NodeMCU (Lua) — Wi-Fi. — CodeDevice
Опубликовано bondrogeen
Каждый кто начинает свое знакомство с микроконтроллером ESP8266, первым делом захочет подключиться в Wi-Fi и попробовать сетевые возможности данного микроконтроллера. Для работы с Wi-Fi в NodeMCU существует специальный модуль, который так и называется WiFi module. Данный модуль позволяет устанавливать различные режимы работы и настраивать подключения к Wi-Fi сети.
Существует три четыре режима работы Wi-Fi в ESP8266
- Клиент. (STA)
- Точка доступа. (AP)
- Совмещенный режим. (STA + AP)
- Wi-Fi выключен.
Клиент
Самый часто используемый режим работы. В режиме клиента ESP8266 подключается к вашей существующей Wi-Fi сети. Для того чтобы подключиться к сети достаточно несколько строк кода.
cfg = {}
cfg.ssid = «MY-NET»
cfg.pwd = «myPassword»
cfg.save = false — не сохранять настройки (по умолчанию true)
wifi.setmode(wifi.STATION)
wifi.sta.config(cfg)
| cfg = {} cfg.ssid = «MY-NET» cfg.pwd = «myPassword» cfg.save = false — не сохранять настройки (по умолчанию true)
wifi.setmode(wifi.STATION) wifi.sta.config(cfg) |
Точка доступа
В режиме точки доступа, ESP8266 создает свою собственную сеть, к которой могут присоединиться другие устройства (телефон, ПК и т.д). Максимальное количество устройств, которые могут быть одновременно подключены — пять. Данный режим часто используется как промежуточный этап перед подключением ESP8266 к WiFi в режиме клиента. Например, для первоначальной настройки.
cfg={
ssid=»NODE-XXXXXX»,
pwd=»password»
}
wifi.setmode(wifi.SOFTAP)
wifi.ap.config(cfg)
| cfg={ ssid=»NODE-XXXXXX», pwd=»password» } wifi.setmode(wifi.SOFTAP) wifi.ap.config(cfg) |
Если пароль не указывать, то будет создана открытая точка. При подключении, ESP8266 по умолчании выдается ip адрес 192.168.4.1, а клиенту 192.168.4.2
Совмещенный режим
Режим Station + AP, когда он создает свою собственную сеть и одновременно подключается к другой существующей сети.
!!! Имейте ввиду что при использовании совмещенного режима используется один и тот же канал для обеих сетей, поскольку ESP8266 может прослушивать только один канал.
cfg_ap={
ssid=»NODE-XXXXXX»,
pwd=»password»
}
cfg_sta={
ssid=»NET»,
pwd=»password»
}
wifi.setmode(<span>wifi.STATIONAP</span>)
wifi.ap.config(cfg_ap)
wifi.sta.config(cfg_sta)
| cfg_ap={ ssid=»NODE-XXXXXX», pwd=»password» } cfg_sta={ ssid=»NET», pwd=»password» }
wifi.setmode(<span>wifi.STATIONAP</span>) wifi.ap.config(cfg_ap) wifi.sta.config(cfg_sta) |
События
Для отслеживания различных событий существую функция callback на которую можно подписаться.
wifi.eventmon.register(wifi.eventmon.STA_CONNECTED, function(T)
print(«STA_CONNECTED») — вызовется при подключении к сети
dofile(‘my_script.lua’)
end)
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
print(«STA_DISCONNECTED») — вызовется при отключении от сети
end
| wifi.eventmon.register(wifi.eventmon.STA_CONNECTED, function(T) print(«STA_CONNECTED») — вызовется при подключении к сети dofile(‘my_script.lua’) end)
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T) print(«STA_DISCONNECTED») — вызовется при отключении от сети end |
Например, если ваш скрипт передает данные на сервер, но пока подключение с сетью не будет установлено, он все равно не сможете их отправить, поэтому нет смысла его запускать раньше. Только имейте в виду, что событие вызывается каждый раз при подключении нового клиента, это нужно учитывать в вашем коде.
Поиск сетей
Для того чтобы иметь возможность сканировать доступные сети, в модули существует функция wifi.sta.getap(1, callback), но доступ к этой функция есть только если выбран режим клиента или совмещенный. При попытки запустить ее из режима точки доступа, выдаст ошибку с предупреждением.
function listap(t)
for k,v in pairs(t) do
print(k..» : «..v)
end
end
wifi.sta.getap(1, listap)
| function listap(t) for k,v in pairs(t) do print(k..» : «..v) end end wifi.sta.getap(1, listap) |
Это только малая часть всех возможностей Wi-Fi модуля, если у вас возникли вопросы, то при внимательном изучении документации можно получить на него ответ.
NodeMCU (Lua) — GPIO. — CodeDevice
Опубликовано bondrogeen
Работа с внешними устройствами происходит через порты ввода-вывода (GPIO). С их помощью можно как считывать сигналы, например с различных датчиков, так и управления другими устройствами. ESP8266 не может похвастаться большим количеством свободных портов. В зависимости от исполнения модуля (см. ниже), доступно разное число портов. Например, в ревизии ESP01, если не считать UART, имеется только два порта. Но даже в версиях где все порты выведены (ESP12E), без ограничений доступны только часть их, так как остальные совмещают системные функции (выбор режима загрузки, SPI флешь, вывод из сна).
Для работа с портами ввода-вывода в NodeMCU используется модуль GPIO. Если открыть документацию, первое что бросается в глаза это нумерацией портов (см. ниже), точнее отсутствие связи в нумерации портов NodeMCU и официальным обозначением. Почему-то разработчики решили использовать свою нумерацию. При использовании официальных плат NodeMCU или WeMos D1, где все порты «правильно» подписаны проблем не возникает, но если разрабатывать свое устройство на «голом» ESP8266 и руководствуясь официальным обозначением, то довольно часто приходиться заглядывать в эту таблицу.
При проектировании устройств на NodeMCU, для себя сделал такую пометку, свободных портов которыми можно пользоваться без каких либо ограничений (вход, выход, прерывания) всего 5 — это GPIO4, GPIO5, GPIO12, GPIO13, GPIO14. При использовании остальных необходимо учитывать их особенности. Поэтому внимательно читайте документацию и во избежание проблем.
При использовании «голых» модулей ESP8266, для «нормальной» загрузки необходимо чтобы в момент старта (подачи питания) на портах GPIO0, GPIO2 присутствовал высокий уровень, а GPIO15 низкий.
GPIO16 можно настроить только как вход или выход, а если используем режим сна и «будить» его через определенный интервал времени, вообще должен быть соединен с RESET.
Инициализация GPIO
Перед тем как начать работать с портом необходимо его про инициализировать, выбрав один из четырех режимов работы:
- Вход (gpio.INPUT)
- Выход (gpio.OUTPUT)
- Прерывания (gpio.INT)
- Открытый сток (gpio.OPENDRAIN)
Если не планируете менять режим работы, то делается это один раз в начале кода.
С помощью функции gpio.mode(pin,mode[,pullup]) устанавливается режим работы. Функция принимает два обязательных параметра (номер порта и режим работы) и один не обязательный (будет ли порт подтянут к питанию)
— настроить порт GPIO4 на выход
gpio.mode(2, gpio.OUTPUT)
— настроить порт GPIO5 на вход и включить подтяжку к питанию
gpio.mode(1, gpio.INPUT, gpio.PULLUP)
| — настроить порт GPIO4 на выход gpio.mode(2, gpio.OUTPUT)
— настроить порт GPIO5 на вход и включить подтяжку к питанию gpio.mode(1, gpio.INPUT, gpio.PULLUP) |
Вход
Для того чтобы узнать какой логический уровень присутствует в данный момент времени на порту, можно с помощью функции gpio.read(pin). Функции принимает один параметр номер порта который необходимо считать, а возвращает его состояние, 0 или 1 в зависимости от логического уровня.
Считывать состояние порта можно как в режиме вход, так и выход.
pin = 1 — GPIO5 (см. в таблицу выше)
mode = gpio.INPUT — как вход
pullup = gpio.PULLUP — вкл. подтяжку порта к питанию
gpio.mode(pin, mode, pullup) — инициализируем порт
result = gpio.read(pin) — получаем состояние порта
print(result) — выводим состояние в консоль
| pin = 1 — GPIO5 (см. в таблицу выше) mode = gpio.INPUT — как вход pullup = gpio.PULLUP — вкл. подтяжку порта к питанию
gpio.mode(pin, mode, pullup) — инициализируем порт result = gpio.read(pin) — получаем состояние порта print(result) — выводим состояние в консоль |
Выход
Изменения состояние логического уровня на выходе порта выполняется с помощью функции gpio.write(pin, level). В отличии от функции чтения порта, функция записи ничего не возвращает и на вход поступает уже два параметра, это номер порта и необходимый логический уровень на его выходе.
pin = 2 — GPIO4 (см. в таблицу выше)
mode = gpio.OUTPUT — как выход
gpio.mode(pin, mode) — инициализируем порт
gpio.write(pin, gpio.HIGH) — установить высокий уровень 1
print(gpio.read(pin)) — выводим состояние порта в консоль
gpio.write(pin, gpio.LOW) — установить низкий уровень 0
print(gpio.read(pin)) — выводим состояние порта в консоль
| pin = 2 — GPIO4 (см. в таблицу выше) mode = gpio.OUTPUT — как выход
gpio.mode(pin, mode) — инициализируем порт
gpio.write(pin, gpio.HIGH) — установить высокий уровень 1 print(gpio.read(pin)) — выводим состояние порта в консоль gpio.write(pin, gpio.LOW) — установить низкий уровень 0 print(gpio.read(pin)) — выводим состояние порта в консоль |
Прерывания
Разобрав работы функций чтения мы можем проверить текущий уровень порта, но что если нам необходимо отслеживать изменения уровня и как-то на него реагировать. В этом нам поможет функция gpio.trig(pin, [type [, callback_function]]). Функция принимает два параметра, номер порта и типа события на который хотим подписаться, а также callback функцию, которая будет вызвана если произойдет данное событие.
Типы событий.
- up — отслеживание по переднему фронту, то есть будет вызвана в момент перехода от логического низкого уровня на высокий.
- down — отслеживание по заднему фронту, то есть будет вызвана в момент перехода от логического высокого уровня на низкий.
- both — отслеживание обоих фронтов, как по переднему так и заднему фронту
- low — отслеживание низкого логического уровня, то есть будет срабатывать пока присутствует низкий логический уровень
- high — отслеживание высокого логического уровня, то есть будет срабатывать пока присутствует высокий логический уровень
- none — отписаться от всех прерываний
Например, чтобы отследить нажатие кнопки достаточно нескольких строк кода. Для этого нужно создать событие и функцию обработки этого события. Когда событие наступит, будет запущена наша функция.
pin = 1 — GPIO5 (см. в таблицу выше)
mode = gpio.INT — режим прерывания
gpio.mode(pin, mode, gpio.PULLUP) — инициализируем порт
function callback(level, time) — callback функция
print(level, time) — выводим в консоль уровень и время
end
gpio.trig(pin, «down», callback) — подписываемся на событие
| pin = 1 — GPIO5 (см. в таблицу выше) mode = gpio.INT — режим прерывания
gpio.mode(pin, mode, gpio.PULLUP) — инициализируем порт
function callback(level, time) — callback функция print(level, time) — выводим в консоль уровень и время end
gpio.trig(pin, «down», callback) — подписываемся на событие |
Если подключить кнопку и запустив код, то можно заметить, что в момент нажатия на кнопку возникают ложные срабатывания, так проявляется эффект дребезга контактов. Для устранения этого эффекта воспользуемся программным методом, для этого немного изменим код. Добавим в нашу функцию проверку прошедшего времени с момента первого срабатывания.
pin = 1 — GPIO5 (см. в таблицу выше)
mode = gpio.INT — режим прерывания
function debounce(pin) — callback функция
local last, delay = 0, 200000 — устанавливаем задержку в 0,2 сек
return function (level, time)
if time — last < delay then return end
if gpio.read(pin) == 0 then — проверяем текущий уровень
last = time
print(«OK»)
end
end
end
gpio.mode(pin, mode, gpio.PULLUP) — инициализируем порт
gpio.trig(pin, ‘down’, debounce(pin)) — подписываемся на событие
| pin = 1 — GPIO5 (см. в таблицу выше) mode = gpio.INT — режим прерывания
function debounce(pin) — callback функция local last, delay = 0, 200000 — устанавливаем задержку в 0,2 сек return function (level, time) if time — last < delay then return end if gpio.read(pin) == 0 then — проверяем текущий уровень last = time print(«OK») end end end
gpio.mode(pin, mode, gpio.PULLUP) — инициализируем порт gpio.trig(pin, ‘down’, debounce(pin)) — подписываемся на событие |
В случае если необходимо отписаться от всех событий, сделать это можно с помощью той же функции gpio.trig(pin, type), но указав в качестве второго параметра none.
pin = 1
gpio.trig(pin, «none»)
| pin = 1
gpio.trig(pin, «none») |
Как видно модуль GPIO и асинхронность LUA упрощает работу с портами ввода-вывода, достаточно пары строк кода чтобы узнать, изменить состояние порта или повесить на него событие, этого более чем достаточно для простых задач «ногодрыгания». Но что касается генерации или замера цифрового сигнала, то тут не все так радужно. Если для генерацией сигналов с последними обновлениями появились новые функции (gpio.serout и gpio.pulse), которые позволяют формировать различные импульсы с минимальными интервалами по времени, то вот с подсчетом их дела обстоят немного хуже. При максимально возможной частоте, подсчет занимает все ресурсное время не оставляя его для других операций. Но и даже при подсчете коротких импульсов одного и того же сигнала можно наблюдать разный результат, особенно это заметно в нагруженных проектах. Эта расплата за асинхронность
При изучении модулей NodeMCU в первую очередь руководствуйтесь официальной документацией, т.к. постоянно вносятся изменения и возможно что некоторая информация потеряет свою актуальность.
Прошивка NodeMCU на базе модуля esp8266
NodeMCU — это прошивка, которая позволяет запрограммировать модуль ESP8266 lua скриптом.
По работе модуль очень схож с платой Ардуино. С помощью всего нескольких строк кода вы можете установить соединение Wi-Fi, управлять с помощью esp8266 контроллером, превратить ваш esp8266 в веб-сервер, умную лампочку, умную розетку и многое другое.
Схема и подключение программатора (3.3V FTDI) к ESP8266
Распиновка ESP8266:
Отдельно приводим соединения в таблице:
ESP8266 | FTDI |
---|---|
RX | TX |
TX | RX |
CH_PD | 3.3В |
GPIO 0 | GND |
VCC | 3,3 В |
ЗЕМЛЯ | GND |
Схема соединений примерно будет так выглядеть:
После подключения вашей платы к компьютеру, вам необходимо скачать программу для прошивки NodeMCU. Скачать Node MCU Flasher для Windows можно по следующим ссылкам:
После загрузки файла, запустите его, у вас появится окно, как на картинке ниже, во вкладке com-порт, необходимо выбрать порт, на котором будет подключен ваш ESP8266.
На вкладке Конфиг , выберите файл прошивки, которую можно скачать по ссылке ниже. После того как вы выберете прошивку, нажмите Flash , дождитесь окончания прошивки и всё готово.
Последнюю версию прошивки можно взять на гитхабе.
.
NodeMCU (ESP8266) начинающих: что такое, как подключить
Рассматриваем плату NodeMCU, знакомимся с ее характеристиками и способом подключения.
Плата NodeMCU
Для чего нужна NodeMCU?
NodeMCU — это платформа на основе модуля ESP8266. Плата для удобного управления различными схемами на расстоянии посредством передачи сигнала в локальной сети или интернет через Wi-Fi.Возможности применения этой платы ограничивается лишь вашей фантазией. К примеру, на базе узла MCU можно создать «умный дом», настроив управление светом или вентиляцией через телефон, регистрацию показаний датчиков и многое другое.
Характеристики NodeMCU
Размер платы NodeMCU — 6 * 3 см. Плата довольно компактная, это позволяет использовать ее в большем количестве проектов. «Ноги» NodeMCU расположено так, что ее без проблем можно установить в макетную плату (макетную плату).
На лицевой части платы разъем Micro USB, с помощью которого заливают скетчи или контроллер питания от powerbank-а или компьютера.
Рядом с разъемом располагаются две кнопки: «Flash» и «Reset». Кнопка «Flash» используется для отладки, а кнопка «Reset» для перезагрузки платы.
Больше всего места на плате занимает чип ESP8266 , , на котором установлен микропроцессор с тактовой частотой 80 МГц (можно разогнать до 160 МГц). Плата имеет 4 мегабайта Flash-память.
Для питания на плату можно подавать напряжение от 5 до 12 В, но рекомендуется от 10 В. Можно питать как от Micro USB, так и от контакта Vin (от 5В.). Также существуют дополнительные платы расширения для удобного питания модулей.
Плата для питания NodeMCU
Плата потребляет небольшое количество энергии. Это позволяет использовать ее с автономным питанием.
NodeMCU имеет 11 портов ввода-вывода общего назначения.
Некоторые из портов имеют дополнительные функции:
- D9, D10 — UART
- D1, D2 — I²C / TWI
- D5 – D8 — SPI
- D1 – D10 — выходы с ШИМ (ШИМ)
- A0 — аналоговый вход с АЦП.
Подключение NodeMCU
Подключаем плату NodeMCU к компьютеру с помощью USB-кабеля:
- cначала установить драйвер CP2102, затем открываем Arduino IDE,
- заходим в раздел «Файл» -> «Настройки» и найдем строчку «дополнительные ссылки для менеджера плат» и вставляем туда следующую ссылку http://arduino.esp8266.com/versions/2.3.0/package_esp8266com_index.json,
‘
mycrib [1] = «»
mycrib [2] = «»
var x = 0;
function rotate (mycrib) {
в то время как (x
- заходим в раздел «инструменты» -> «плата» -> «менеджер плат», где выбираем «esp8266» и скачиваем последнюю версию,
.
Первая программа на LUA / esp8266 / Электроника (современная)
Первый скрипт на LUA для новичков
После того как Вы научились подключать модуль и менять прошивку в прошлой статье, настало время и написать первую программу (скрипт) на языке LUA в прошивке NODEMCU.
Срипт будет подключаться к Вашему роутеру, используя обычный таймер с задержкой выведет в терминал полученный ip адрес.
Прошивку Lua 5.1.4 на SDK 1.5.4.1 я использовал скомпилированную на сайте nodemcu-build.com /
Модули использовали при компиляции следующие:
adc, bit, bmp085, crypto, dht, encoder, file, gpio, http, i2c, net, node, ow, pwm, rtctime, sntp, spi, tmr, u8g, uart, websocket, Wi-Fi
Можно использовать и минимальный набор для уроков, но есть и перспектива изучения всех модулей.
Для написания и загрузки LUA потребуется программа ESPLORER либо Lualoader.
Мы будем использовать ESPLorer.zip и так как программа ESPlorer.jar работает в среде JAVA. Нам потребуется установить ее скачав с сайта JAVA.com
Установив яву и запустив ESPlorer.jar подключаемся к ком порту на скорости 115200, в моём случае это порт COM6, посмотреть можно в диспетчере устройств.
Интерфейс программы выглядит так (кликабельно)
В части левой части программы находятся нужные нам инструменты для работы с контроллером esp, в правой сам терминал который нам выдаёт информацию.
Закладка NodeMCU & MicroPython > Скрипты
Создаём новый файл со следующим содержимым (меняем имя и ключ сети):
вай-фай.setmode (wifi.STATION) --переключаемся в режим станции (клиент)
print ('set mode = STATION (mode =' .. wifi.getmode () .. ')') - сообщаем об этом в терминал
print ('MAC:', wifi.sta.getmac ()) - выводим мак устройства в терминал
wifi.sta.config ("Имя сети", "Пароль сети wifi") - !!!! настройка вашей сети вайфай !!!!!!
print ("подождите 10 секунд и распечатайте IP-адрес")
tmr.alarm (0, 10000, 0, function () - простенький таймер на одно выполнение через 10 сек
print (wifi.sta.getip ()) - выводим ip который присвоил роутер, если nil то не подключился или пароль не подходит
конец)
Сохраняем файл под именем init.lua и если файл загружен в модуль сам то хорошо, если не догрузился или не загрузился, то вгружаем самостоятельно, использовав кнопку UPLOAD находящуюся внизу окна редактирования.
Можно проверить работу перезагрузив модуль через RESET или закладка NodeMCU & MicroPython > Команды > Перезапустить ESP.
После рестарта модуля (я использую РЕСЕТ заранее выведенную) увидим что успешно подключились
Пользовательская сборка NodeMCU с помощью frightanic.com
филиал: ma
.
NodeMCU (Lua) — GPIO. — CodeDevice
Опубликовано bondrogeen
Работа с внешними устройствами происходит через порты ввода-вывода (GPIO). С их помощью можно как считывать сигналы, например, с различными датчиками, так и другими устройствами. ESP8266 не может похвастаться большим количеством свободных портов. В зависимости от исполнения модуля (см. Ниже), доступно разное число портов. Например, в ревизии ESP01, если не считать UART, имеется только два порта.Но даже в версии, где все порты выведены (ESP12E), без ограничений доступны только часть их, так как остальные совмещают системные функции (выбор режима загрузки, SPI-вывод, вывод из сна).
Для работы с портами ввода-вывода в NodeMCU используется модуль GPIO . Если открыть документацию, первое что бросается в глаза это нумерацией портов (см. Ниже), точное отсутствие связи в нумерации портов NodeMCU и официальным обозначением.Почему-то разработчики решили использовать свою нумерацию. При использовании официального плат NodeMCU или WeMos D1, где все порты «правильно» подписать проблем не возникает, но если разрабатывать свое устройство на «голом» ESP8266 и руководствуясь официальным обозначением, то довольно часто приходиться заглядывать в эту таблицу.
При проектировании устройств на NodeMCU, для себя сделал такую пометку, свободных портов можно использовать без каких-либо ограничений (вход, выход, прерывания) всего 5 — это GPIO4, GPIO5, GPIO12, GPIO13, GPIO14.При использовании необходимо использовать их особенности. Поэтому внимательно читайте документацию и во избежание проблем.
При использовании «голых» модулей ESP8266, для «нормальной» работы необходимо в момент старта (подачи питания) на портах GPIO0, GPIO2 присутствует высокий уровень, а GPIO15 низкий.
GPIO16 можно настроить только как вход или выход, а если использовать режим сна и «будить» его через интервал времени, вообще должен быть соединен через RESET.
Инициализация GPIO
Перед тем как начать работать с портом необходимо его проинициализировать, выбрав один из четырех режимов работы:
- Вход ( gpio.INPUT )
- Выход ( gpio. ВЫХОД )
- Прерывания ( gpio.INT )
- Открытый сток ( gpio.OPENDRAIN )
. Сделайте это один раз в начале кода.
С помощью функций gpio.mode (pin, mode [, pullup]) устанавливается режим работы. Функция принимает два обязательных режима работы (номер порта и режим работы) и один не обязательный (будет ли порт подтянут к питанию)
— порт настроить GPIO4 на выход
gpio.mode (2, gpio.OUTPUT)
— настроить GPIO5 на вход и включить подтяжку к питанию
gpio.mode (1, gpio.INPUT, gpio.PULLUP)
— настроить порт GPIO4 на выход gpio.mode (2, gpio.OUTPUT) — настроить порт GPIO5 на вход и включить подтяжку к питанию gpio.mode (1, gpio.INPUT, gpio.PULLUP) |
Вход
Для того, чтобы узнать какой логический уровень присутствует в данный момент времени на порту, можно с помощью функции gpio.read (pin) . Принимает один параметр номер порта, который необходимо считать, а возвращает его состояние, 0 или 1 в зависимости от логического уровня.
Считывать состояние порта можно как в режиме входа, так и выход.
pin = 1 — GPIO5 (см. в таблицу выше)
mode = gpio.INPUT — как вход
pullup = gpio.PULLUP — вкл. подтяжку порта к питанию
gpio.mode (pin, mode, pullup) — инициализируем порт
result = gpio.read (pin) — получаем состояние порта
print (результат) — выводим состояние в консоль
pin = 1 — GPIO5 (см.в таблице выше) mode = gpio.INPUT — как вход pullup = gpio.PULLUP — вкл. подтяжку порта к питанию gpio.mode (pin, mode, pullup) — инициализируем порт result = gpio.read (pin) — получаем состояние порта print (result) — выводим состояние в консоль |
Выход
Изменения состояния логического уровня на выходе порта выполняется с помощью функции gpio.написать (пин, уровень) . В отличии от функции чтения порта, функция записи ничего не возвращает и на вход поступает уже два параметра, это номер порта и необходимый логический уровень на его выходе.
pin = 2 — GPIO4 (см. в таблицу выше)
mode = gpio.OUTPUT — как выход
gpio.mode (pin, mode) — инициализируем порт
gpio.write (pin, gpio.HIGH) — установить высокий уровень 1
печать (gpio.read (pin)) — выводим состояние порта в консоль
gpio.write (pin, gpio.LOW) — установить низкий уровень 0
print (gpio.read (pin)) — выводим состояние порта в консоль
pin = 2 — GPIO4 (см. В таблице выше) mode = gpio.OUTPUT — как выход gpio.mode (pin, mode) — инициализируем порт gpio.write (pin, gpio.HIGH) — установить высокий уровень 1 print (gpio.read (pin)) — выводим состояние порта в консоль gpio.write (pin, gpio.LOW) — установить низкий уровень 0 print (gpio.read (pin)) — выводим состояние порта в консоль |
Прерывания
Разобрав работы функций чтения, мы можем проверить текущий уровень порта, но если нам необходимо отслеживать изменения уровня и как-то на него реагировать.В этом нам поможет функция gpio.trig (pin, [type [, callback_function]]) . Функция принимает два события, номер порта и типа, который происходит на который хотим подписаться, а также функция обратного вызова.
Типы событий.
- up — отслеживание по переднему фронту, то есть вызвана в момент перехода от логического уровня на высоком.
- down — отслеживание по заднему фронту, то есть вызвано в момент перехода от логического уровня на низкий.
- оба — отслеживание обоих фронтов, как по переднему так и заднему фронту
- низкий — отслеживание низкого логического уровня, то есть будет срабатывать пока присутствует низкий логический уровень
- высокий — отслеживание высокого логического уровня, то есть будет срабатывать пока присутствует высокий логический уровень
- нет — отписаться от всех прерываний
Например, чтобы отследить отследие кнопки достаточно нескольких строк.Для этого нужно создать функцию и функцию обработки этого события. Когда событие наступит, будет запущена функция наша.
pin = 1 — GPIO5 (см. в таблицу выше)
mode = gpio.INT — режим прерывания
gpio.mode (pin, mode, gpio.PULLUP) — инициализируем порт
функция обратного вызова (уровень, время) — функция обратного вызова
print (уровень, время) — выводим в консоль уровень и время
конец
gpio.trig (булавка, «вниз», обратный вызов) — подписываемся на событие
pin = 1 — GPIO5 (см. В таблице выше) mode = gpio.INT — режим прерывания gpio.mode (pin, mode, gpio.PULLUP) — инициализируем порт функция обратного вызова (уровень, время) — обратный вызов функция print (уровень, время) — выводим в консоль уровень и время конец gpio.trig (булавка, «вниз», обратный вызов) — подписываемся на событие |
Если подключить кнопку и запустить код, то можно заметить, что в момент нажатия кнопки возникают ложные срабатывания, так проявляется эффект дребезга контактов. Для устранения этого эффекта воспользуемся программным методом, для этого немного изменим код. Добавим в нашу функцию проверки прошедшего времени с момента первого срабатывания.
pin = 1 — GPIO5 (см.в таблицу выше)
mode = gpio.INT — режим прерывания
function debounce (pin) — функция обратного вызова
local last, delay = 0, 200000 — установить задержку в 0,2 сек
функция возврата (уровень, время)
если время — последний <задержка, то возврат конец
если gpio.read (pin) == 0 то - проверяем текущий уровень
последний = время
печать ("ОК")
конец
конец
конец gpio.mode (pin, mode, gpio.PULLUP) - инициализируем порт
gpio.trig (pin, 'down', debounce (pin)) - подписываемся на событие
pin = 1 — GPIO5 (см. В таблице выше) mode = gpio.INT — режим прерывания function debounce (pin) — функция обратного вызова local last, delay = 0, 200000 — — устанавливаем задержемку в 0,2 сек функция возврата (уровень, время) если время — последний <задержка, то возврат конец если gpio.read (pin) == 0 then — проверяем текущий уровень last = time print («OK») end end end gpio.mode (pin, mode, gpio.PULLUP ) — инициализируем порт gpio.trig (pin, ‘down’, debounce (pin)) — подписываемся на событие |
В случае если необходимо отписаться от всех событий, сделать это можно с помощью той же функции gpio.триггер (штифт, тип) , но указав в качестве второго параметра нет .
pin = 1
gpio.trig (контакт, «нет»)
pin = 1 gpio.trig (pin, «none») |
Как видно модуль GPIO и асинхронность LUA упрощает работу с портами ввода-вывода, достаточно пары строк кода, чтобы узнать, изменить состояние порта или повесить на него событие, более чем достаточно для простых задач «ногодрыгания».Что касается генерации или замера цифрового сигнала, то тут не все так радужно. Если для генерации сигналов с последними обновлениями появились новые функции ( gpio.serout и gpio.pulse ), которые позволяют формировать различные импульсы с минимальными интервалами по времени, то вот с подсчетом их дела обстоят немного хуже. При максимально возможной частоте, подсчет занимает все ресурсное время не оставляет его для других операций. Но и даже при подсчете коротких импульсов одного и того же сигнала можно наблюдать разный результат, особенно это заметно в нагруженных проектах.Эта расплата за асинхронность
При изучении модулей NodeMCU в первую очередь руководству официальной документацией, т.к. постоянно вносятся изменения и возможно что некоторая информация потеряет свою актуальность.
.