ESP8266:Примеры/Отправка данных от Arduino на ESP8266 через последовательный порт
Отправка данных от Arduino на ESP8266 через последовательный порт[1]
Эта статья рассказывает, как настроить отправку данных от платы Arduino на модуль ESP8266 через последовательную коммуникацию.
Перед тем, как приступить к проекту, рекомендую пройти вот эти руководства:
- Как начать работать с трансиверным WiFi-модулем на базе ESP8266
- Как загрузить прошивку на ESP8266 при помощи NodeMCU (на Windows)
- Как переключиться с 5-вольтовой логики на 3,3-вольтовую
Необходимые компоненты
- Один модуль ESP8266
- Одна плата Arduino Uno
- Один программатор FTDI
- Одна макетная плата
- Один светодиод
- Один резистор на 220 ом
- Один резистор на 1 кОм
- Один резистор на 2 кОм
Справочная информация
Основы программирования на 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) –- эта строчка вызывает функцию, созданную выше
Загрузка скетча на Arduino
Скетч для этого проекта очень прост. Сначала в блоке setup() запускается последовательная коммуникация со скоростью 9600 бод. Затем в блоке loop() каждую секунду печатается слово «HI!» (это сообщение, которое будет передаваться на ESP).
Скопируйте скетч ниже в IDE Arduino, а затем загрузите его на плату Arduino.
/*
* Автор - Руи Сантос (Rui Santos)
* Более подробно о проекте на: randomnerdtutorials.com
*/
// отправка данных от Arduino на ESP8266
// через последовательный порт на скорости 9600 бод:
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print("HI!"); // "ПРИВЕТ!"
delay(1000);
}
Теперь, если открыть монитор порта IDE Arduino на скорости 9600 бод, в нем ежесекундно будет печататься сообщение «HI!»
Схема подключения ESP8266 к 3,3-вольтовому программатору FTDI
Загрузив на ESP8266 прошивку NodeMCU, подключите ESP8266 и программатор FTDI друг к другу как показано на картинке ниже. Это установит между ними последовательное соединение, с помощью которого на ESP8266 можно будет загрузить скрипт для этого проекта.
Загрузка ESPlorer IDE
Для сохранения LUA-файлов на ESP8266 рекомендую использовать программу ESPlorer IDE, созданную пользователем 4refr0nt. Чтобы загрузить и установить ESPlorer IDE, сделайте следующее:
- Скачайте отсюда ZIP-архив с ESPlorer IDE
- Распакуйте архив
- Перейдите в главную папку
- Запустите файл «ESPlorer.jar»
- Откройте ESPlorer
В результате перед вами откроется вот такое окно:
Скрипт для ESP8266
Вставьте в ESPlorer IDE вот этот код:
-- Автор – Руи Сантос (Rui Santos)
-- Более подробно о проекте на: randomnerdtutorials.com
ledOn = 0
pin=4
gpio.mode(pin,gpio.OUTPUT)
uart.on("data", 3,
function(data)
print("Received from Arduino:", data)
-- "Получено от Arduino:"
if data=="HI!" then
if ledOn==0 then
ledOn = 1
gpio.write(pin,gpio.HIGH)
print("LED On")
-- "Светодиод включен"
else
ledOn = 0
gpio.write(pin,gpio.LOW)
print("LED Off")
-- "Светодиод выключен"
end
end
end, 0)
После загрузки скрипта ESP будет настроен на прослушивание последовательного соединения. При каждом получении сообщения «HI!» на скорости 9600 бод он будет либо включать, либо выключать светодиод, подключенный ко 2-ому GPIO-контакту.
Загрузка скрипта
Чтобы загрузить скрипт на ESP8266, проделайте следующее:
- Подключите программатор FTDI к компьютеру
- Выставьте скорость передачи данных на 9600 бод
- Выберите порт, к которому подключен программатор FTDI (к примеру, COM3)
- Нажмите кнопку «Open/Close»
- Кликните на вкладку «NodeMCU+MicroPython»
- Скопируйте LUA-скрипт в ESPlorer IDE
После этого вам останется лишь нажать на кнопку «Save to ESP» и сохранить файл под названием «init.lua». Все элементы программы, необходимые для этих действий, подсвечены на картинке ниже красным цветом:
Общая схема
Подключите компоненты друг к другу как показано на картинке ниже:
Демонстрация
Теперь светодиод должен начать мигать по одному разу в секунду. Если это происходит, то все настроено правильно – Arduino посылает сообщение «HI!», а ESP это сообщение получает. В видео ниже этот проект показан вживую:
https://www.youtube.com/watch?v=VROj6i3npo0
Теперь вместо отправки простого «HI!» вы можете подключить к Arduino какие-нибудь датчики, а затем отправлять на ESP данные от этих датчиков. Потом на основе этой сборки можно сделать веб-сервер, который будет показывать эти данные в браузере.
См.также
Внешние ссылки
ESP8266 AT-команды | |
---|---|
Список AT-команд | |
Базовые команды |
|
Команды для WiFi |
|
Команды для TCP/IP |
|