ESP8266:Примеры/Мигание светодиодом при помощи NodeMCU

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Мигание светодиодом при помощи NodeMCU

В этом руководстве мы загрузим и установим ESPlorer (это IDE с открытым кодом для программирования ESP8266), а также создадим простую цепь для мигания светодиодом при помощи прошивки NodeMCU.

Почему мы всегда сначала учимся мигать светодиодом?

Отличный вопрос! Если вы умеете мигать светодиодом, то вы, по сути, умеете включать/выключать любое электронное устройство, будь то светодиод, лампа или даже тостер.

Необходимое оборудование

Справочная информация

Основы программирования на Lua

Это скриптовый язык программирования, написанный на C. Разработка этого проекта началась в 1993 году силами Роберту Иерузалимски, Луиша Энрике де Фигейреду и Валдемара Келе, работавшими тогда в подразделении Tecgraf при Католическом университете Рио-де-Жанейро.

Более подробно об этом языке программирования можно почитать в «Википедии».

Прошивка NodeMCU для ESP8266 основана на Lua, поэтому если вы хотите писать собственные скрипты для ESP8266, вам важно знать основы этого языка.

Переменные

Переменные в языке Lua не делятся по типу данных, но делятся по области видимости. Это значит, что переменные в Lua могут быть глобальными или локальными.

  • Глобальные переменные. Все переменные по умолчанию считаются глобальными (если в коде специально не задано, что они локальные).
pin = 3
test = "It works!"
  • Локальные переменные. Если переменная задана локальной, область ее видимости будет ограничена лишь ее функцией.
local pin = 3
local test = "It works!"
  • Поля таблиц. Это особый тип переменных, в которых может храниться все, за исключением «nil» (мы это затрагивать не будем).
Примечание

Lua – это язык, чувствительный к регистру. Поэтому переменная «PIN» – это не то же самое, что «Pin» или «pin».

Типы данных (типы значений)

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))            -- неопределенное значение
Примечание

Работая с ESP8266 и прошивкой NodeMCU, вы изредка будете встречать тип данных «nil». Это будет значить лишь, что такая переменная не определена. Также, если вы хотите удалить какое-то значение в какой-то переменной, просто присвойте ей значение «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

Теперь давайте загрузим IDE ESPlorer. Пройдите по этой ссылке. Затем кликните по гиперссылке «Download ESPlorer.zip (v 0.2.0-rc6)».

Устанавливаем ESPlorer

Найдите архив, который только что скачали. Он должен называться «ESPlorer.zip». Распакуйте его. Внутри распакованного архива должны находиться следующие файлы:

Запустите файл «ESPlorer.jar». Спустя несколько секунд должна открыться IDE ESPlorer. Вам нужно будет открывать этот файл каждый раз, когда вам нужно будет работать с IDE ESPlorer.

Примечание

Если у вас Mac OS X или Linux, то для запуска IDE ESPlorer вбейте в терминал следующую команду: «sudo java –jar ESPlorer.jar».

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 вольтах):

Важно

В следующем разделе «Пишем Lua-скрипт» будет фрагмент «pin=4», с помощью которого мы будем обращаться к контакту GPIO2. Если вписать «pin=3», то мы обратимся к контакту GPIO0.

Так устроена прошивка 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)

Этот скрипт работает следующим образом:

  1. Создаем переменную «lighton» для управления текущим состоянием светодиода;
  2. Переключаем контакт 4 (он же GPIO2) в режим вывода данных (OUTPUT);
  3. Далее пишем метод tmr.alarm(), который будет выполняться каждые 2 секунды (2000 миллисекунд);
  4. Скрипт проверяет значение переменной «lighton»'. Если в ней содержится «0», это значит, что состоянием выходного контакта является «LOW», а светодиод выключен. После этого скрипт меняет значение в переменной «lighton» на «1», в результате чего состояние выходного контакта переключается на «HIGH», а светодиод включается;
  5. Если в переменной «lighton» не содержится значение «0», то это значит, что светодиод включен. В этом случае скрипт запустит код в секции «else», который сначала снова присвоит переменной «lighton» значение «0», а затем переключит контакт в состояние «LOW» и тем самым выключит светодиод;
  6. Код будет повторять шаги 4 и 5 каждые 2 секунды, благодаря чему светодиод будет то включаться, то выключаться (т.е. мигать)!
Примечание

Этот Lua-скрипт нужно назвать «init.lua», благодаря чему ESP8266 будет выполнять его при каждом запуске.

Загружаем код на 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
Примечание

Поскольку нам надо загрузить код, контакт GPIO0 на схеме выше подключен к VCC.

Загружаем скрипт «init.lua»

На этом этапе ESP8266 (напрямую или через FTDI-программатор) должна быть подключена к ПК. Если подключена, вернитесь в IDE ESPlorer. Посмотрите в правый верхний угол программы и выполните следующие действия:

  1. Нажмите на кнопку Refresh;
  2. Выберите COM-порт, к которому подключена ESP8266 (напрямую или через FTDI-программатор);
  3. Задайте скорость передачи данных на 9600 бод;
  4. Кликните на кнопку Open;

Затем посмотрите в левый верхний угол IDE ESPlorer и выполните следующее:

  1. Выберите вкладку NodeMCU+MicroPython;
  2. Выберите вкладку Scripts;
  3. Создайте новый файл под названием «init.lua»;

Скопируйте Lua-скрипт (который мы написали в предыдущем разделе) в окно кода (как показано на скриншоте ниже):

Следующий шаг – сохранить код на ESP8266. Для этого нажмите на кнопку Save to ESP, которая находится в левом нижнем углу IDE ESPlorer.

В области справа будут показаны команды, которые будут отправлены ESP8266. Они должны быть примерно такими же, как на скриншоте ниже:

Примечание

Если вам нужно удалить файл «init.lua» с ESP8266, то это делается очень просто. Просто впишите file.remove(“init.lua”) и нажмите на кнопку Send (см. скриншот выше). Если вам нужно удалить все файлы, хранящиеся на ESP8266, воспользуйтесь командой file.format().

Собираем цепь

Загрузив код, отключите ESP8266 от компьютера. Далее подключите компоненты друг к другу согласно одной из схем ниже (той, что соответствует вашей плате).

Цепь для ESP-12E

Подключите светодиод и резистор на 220 Ом к контакту D4 (GPIO2) на ESP8266.

Перезапустите ESP8266.

Цепь для ESP-01

Подключите к ESP8266 светодиод и резистор на 220 Ом. Затем запитайте эту цепь от 3.3-вольтового источника питания или при помощи FTDI-программатора.

Перезапустите ESP8266.

Поздравляем! Вы это сделали. Светодиод должен начать мигать с периодичностью в 2 секунды.

См.также

Внешние ссылки