ESP8266:Примеры/Мигание светодиодом при помощи NodeMCU
Мигание светодиодом при помощи NodeMCU
В этом руководстве мы загрузим и установим ESPlorer (это IDE с открытым кодом для программирования ESP8266), а также создадим простую цепь для мигания светодиодом при помощи прошивки NodeMCU.
Почему мы всегда сначала учимся мигать светодиодом?
Отличный вопрос! Если вы умеете мигать светодиодом, то вы, по сути, умеете включать/выключать любое электронное устройство, будь то светодиод, лампа или даже тостер.
Необходимое оборудование
- Плата ESP8266 - 1шт.;
- Светодиод - 1шт.;
- Резистор 220 Ом- 1 шт.
- Макетная плата - 1шт.;
- Провода перемычки.
Справочная информация
Основы программирования на Lua
Это скриптовый язык программирования, написанный на C. Разработка этого проекта началась в 1993 году силами Роберту Иерузалимски, Луиша Энрике де Фигейреду и Валдемара Келе, работавшими тогда в подразделении Tecgraf при Католическом университете Рио-де-Жанейро.
Более подробно об этом языке программирования можно почитать в «Википедии».
Прошивка NodeMCU для ESP8266 основана на Lua, поэтому если вы хотите писать собственные скрипты для ESP8266, вам важно знать основы этого языка.
Переменные
Переменные в языке Lua не делятся по типу данных, но делятся по области видимости. Это значит, что переменные в Lua могут быть глобальными или локальными.
- Глобальные переменные. Все переменные по умолчанию считаются глобальными (если в коде специально не задано, что они локальные).
pin = 3 test = "It works!"
- Локальные переменные. Если переменная задана локальной, область ее видимости будет ограничена лишь ее функцией.
local pin = 3 local test = "It works!"
- Поля таблиц. Это особый тип переменных, в которых может храниться все, за исключением «nil» (мы это затрагивать не будем).
Типы данных (типы значений)
Lua – это язык с динамической типизацией, поэтому у переменных нет типов данных. Типы данных есть только у значений. Значения могут храниться в переменных, передаваться в виде параметров и возвращаться в виде результатов.
В таблице ниже показаны типы данных для значений в языке Lua.
Тип значения | Описание |
---|---|
Строка (string) | Массив символов |
Число (number) | Действительное (двойной точности с плавающей запятой) число |
Булево значение (boolean) | Значение «true» или «false». Как правило, используется для проверки выполнения условий |
Функция (function) | Функция, написанная на Lua |
Неопределенное значение (nil) | В такой переменной не хранится никаких данных |
Таблица (table), пользовательские данные (userdata) и поток (thread) | Эти три типа данных мы затрагивать не будем |
Вот примеры некоторых из этих типов значений:
print(type("Hello world!")) –- строка
print(type(7)) -- число
print(type(true)) -- булево значение
print(type(print)) -- функция
print(type(nil)) -- неопределенное значение
Комментарии
Комментарии – это просто текст, в котором программист объясняет, как работает его код. Если какой-то фрагмент кода помечен как комментарий, то ESP-модуль проигнорирует его и не будет обрабатывать. Комментарии начинаются с двух тире («--»). Вот два типа комментариев:
- Однострочные комментарии:
print("Hello World!") –- комментарий в одну строчку
- Многострочные комментарии:
--[[ print("Hello World!") – это многострочный комментарий --]]
Операторы
Оператор – это символ, который говорит интерпретатору выполнить определенное математическое или логическое действие. В язык Lua встроено много операторов разных типов:
- Арифметические операторы;
- Операторы сравнения;
- Логические операторы;
- Прочие операторы;
Читая таблицы и примеры ниже, представьте, что имеете дело с двумя переменными: «А», в которой хранится значение «1», и «B», в которой хранится значение «2».
A = 1
B = 2
Арифметические операторы
Оператор | Пример | Результат |
---|---|---|
+ | A + B | 3 |
- | A - B | -1 |
* | A * B | 2 |
/ | B / A | 2 |
% | B % A | 0 |
^ | B^2 | 4 |
- | -A | -1 |
Операторы сравнения
Оператор | Пример | Результат |
---|---|---|
== | (A == B) | false |
~= | (A ~= B) | true |
> | (A > B) | false |
< | (A < B) | true |
>= | (A >= B) | false |
<= | (A <= B) | true |
Логические операторы
Оператор | Пример | Результат |
---|---|---|
and (и) | (A and B) | false |
or (или) | (A or B) | true |
not (не) | !(A and B) | true |
Оператор конкатенации
Теперь представьте, что у нас две новые переменные:
a = "Hello!"
b = "World!"
Оператор | Пример | Результат |
---|---|---|
.. | a..b | "Hello World!" |
Циклы
Цикл позволяет выполнить блок кода несколько раз, пока выполняется заданное условие. Во фрагменте кода ниже – пока значением в переменной «boolean_value» является «true».
-- цикл while
while boolean_value
do
-- код будет выполняться, пока в «boolean_value» будет «true»
end
-- и цикл for
for min, max, increment
do
-- код будет выполняться, пока не будет достигнуто макс. значение
end
Операторы if… else
Операторы if... else (т.е. «если... иначе») – один из самых важных инструментов для управления программой. Они используются следующим образом:
if boolean_value then
-- если в переменной «boolean_value» значение «true»
else
-- если в переменной «boolean_value» значение «false»
end
Названия этих операторов говорят сами за себя. Если выполнено условие «boolean_value=true», то программа выполнит код, идущий после «if». Но если условием является «boolean_value=false», то программа выполнит код, идущий после «else».
Функции
Функции – отличный способ организации кода. Если вы хотите сделать в программе что-либо несколько раз, вам необязательно по несколько раз прописывать этот код. Можно просто создать отдельную функцию, содержащую этот код, а затем вызывать ее, когда вам нужно.
Ниже показано, как создать новую функцию, принимающую один параметр (температуру в градусах Кельвина) и преобразующую это значение в градусы Цельсия и Фаренгейта.
function displayTemperature(kelvin)
celsius = kelvin – 273.15
print("Temperature in Celsius is: ", celsius)
fahrenheit = (celsius*9/5+32)
print("Temperature in Fahrenheit is: ", fahrenheit)
end
k = 294 –- температура в градусах Кельвина
displayTemperature(k) –- эта строчка вызывает функцию, созданную выше
Что такое ESPlorer?
ESPlorer – это мультиплатформенная IDE (она создана на JAVA, благодаря чему на ней можно работать и на Windows, и на Mac OS X, и на Linux) для разработчиков ESP8266. Эта IDE позволяет просто устанавливать последовательную коммуникацию с ESP8266, отправлять команды, загружать код и многое другое.
Требования
На вашем ПК должна быть установлена JAVA. Если не установлена, зайдите на ее сайт, загрузите самую последнюю версию и установите.
Материалы и ссылки
- Скачать ESPlorer можно тут
- GitHub-репозиторий ESPlorer
Загружаем ESPlorer
Теперь давайте загрузим IDE ESPlorer. Пройдите по этой ссылке. Затем кликните по гиперссылке «Download ESPlorer.zip (v 0.2.0-rc6)».
Устанавливаем ESPlorer
Найдите архив, который только что скачали. Он должен называться «ESPlorer.zip». Распакуйте его. Внутри распакованного архива должны находиться следующие файлы:
Запустите файл «ESPlorer.jar». Спустя несколько секунд должна открыться IDE ESPlorer. Вам нужно будет открывать этот файл каждый раз, когда вам нужно будет работать с IDE ESPlorer.
IDE ESPlorer
Когда вы в первый раз откроете IDE ESPlorer, то увидите примерно следующее:
В IDE ESPlorer встроено много функций, из-за чего она изобилует разными кнопками и меню, но многие из них вам не понадобятся. О всех необходимых элементах интерфейса я расскажу ниже. Не закрывайте IDE ESPlorer, мы начнем работать в ней уже совсем скоро.
Как обращаться к GPIO-контактам в коде
В таблице ниже показано, как номера GPIO-контактов ESP8266-12E (оснащенной встроенным программатором) соотносятся со своими номерами в Lua-коде.
Номер контакта в Lua-коде | Номер GPIO-контакта ESP8266 |
---|---|
0 [*] | GPIO16 |
1 | GPIO5 |
2 | GPIO4 |
3 | GPIO0 |
4 | GPIO2 |
5 | GPIO14 |
6 | GPIO12 |
7 | GPIO13 |
8 | GPIO15 |
9 | GPIO3 |
10 | GPIO1 |
11 | GPIO9 |
12 | GPIO10 |
Вот так эти контакты расположены на самой плате:
А вот так выглядит распиновка ESP-01 (все контакты работают на 3.3 вольтах):
Так устроена прошивка NodeMCU на внутреннем уровне. Но вам об этом беспокоиться не стоит: просто запомните, что GPIO0 – это 3 контакт, а GPIO2 – это 4 контакт.
Пишем Lua-скрипт
Скетч для мигания светодиодом очень прост:
lighton=0
pin=4
gpio.mode(pin,gpio.OUTPUT)
tmr.alarm(1,2000,1,function()
if lighton==0 then
lighton=1
gpio.write(pin,gpio.HIGH)
else
lighton=0
gpio.write(pin,gpio.LOW)
end
end)
Этот скрипт работает следующим образом:
- Создаем переменную «lighton» для управления текущим состоянием светодиода;
- Переключаем контакт 4 (он же GPIO2) в режим вывода данных (OUTPUT);
- Далее пишем метод tmr.alarm(), который будет выполняться каждые 2 секунды (2000 миллисекунд);
- Скрипт проверяет значение переменной «lighton»'. Если в ней содержится «0», это значит, что состоянием выходного контакта является «LOW», а светодиод выключен. После этого скрипт меняет значение в переменной «lighton» на «1», в результате чего состояние выходного контакта переключается на «HIGH», а светодиод включается;
- Если в переменной «lighton» не содержится значение «0», то это значит, что светодиод включен. В этом случае скрипт запустит код в секции «else», который сначала снова присвоит переменной «lighton» значение «0», а затем переключит контакт в состояние «LOW» и тем самым выключит светодиод;
- Код будет повторять шаги 4 и 5 каждые 2 секунды, благодаря чему светодиод будет то включаться, то выключаться (т.е. мигать)!
Загружаем код на ESP8266
Дальнейшие действия зависят от того, с каким топом ESP8266-платы вы работаете. Если у вас ESP-12E, у которой есть встроенный программатор, читайте раздел «Вариант А». Если у вас ESP-01 или ESP-07, то вам понадобится FTDI-программатор – читайте раздел «Вариант Б».
Вариант А – загружаем код на ESP-12E
Загрузка кода на ESP-12E NodeMCU выполняется очень просто, т.к. эта плата оснащена встроенным программатором. Вам не нужно делать никаких дополнительных соединений – просто подключите плату к ПК и все.
Вариант Б – Загружаем код на ESP-01
Если у вас плата ESP-01 или ESP-07, то для загрузки кода вам нужно будет настроить последовательную коммуникацию между ESP8266 и ПК при помощи FTDI-программатора. Схему для подключения ESP8266 к программатору смотрите ниже.
Контакты нужно подключить друг к другу следующим образом:
- RX (ESP8266) –> TX (FTDI-программатор)
- TX –> RX
- CH_PD –> 3.3V
- GPIO0 –> VCC
- VCC –> 3.3V
- GND –> GND
Загружаем скрипт «init.lua»
На этом этапе ESP8266 (напрямую или через FTDI-программатор) должна быть подключена к ПК. Если подключена, вернитесь в IDE ESPlorer. Посмотрите в правый верхний угол программы и выполните следующие действия:
- Нажмите на кнопку Refresh;
- Выберите COM-порт, к которому подключена ESP8266 (напрямую или через FTDI-программатор);
- Задайте скорость передачи данных на 9600 бод;
- Кликните на кнопку Open;
Затем посмотрите в левый верхний угол IDE ESPlorer и выполните следующее:
- Выберите вкладку NodeMCU+MicroPython;
- Выберите вкладку Scripts;
- Создайте новый файл под названием «init.lua»;
Скопируйте Lua-скрипт (который мы написали в предыдущем разделе) в окно кода (как показано на скриншоте ниже):
Следующий шаг – сохранить код на ESP8266. Для этого нажмите на кнопку Save to ESP, которая находится в левом нижнем углу IDE ESPlorer.
В области справа будут показаны команды, которые будут отправлены ESP8266. Они должны быть примерно такими же, как на скриншоте ниже:
Собираем цепь
Загрузив код, отключите ESP8266 от компьютера. Далее подключите компоненты друг к другу согласно одной из схем ниже (той, что соответствует вашей плате).
Цепь для ESP-12E
Подключите светодиод и резистор на 220 Ом к контакту D4 (GPIO2) на ESP8266.
Перезапустите ESP8266.
Цепь для ESP-01
Подключите к ESP8266 светодиод и резистор на 220 Ом. Затем запитайте эту цепь от 3.3-вольтового источника питания или при помощи FTDI-программатора.
Перезапустите ESP8266.
Поздравляем! Вы это сделали. Светодиод должен начать мигать с периодичностью в 2 секунды.
См.также
Внешние ссылки
ESP8266 AT-команды | |
---|---|
Список AT-команд | |
Базовые команды |
|
Команды для WiFi |
|
Команды для TCP/IP |
|