ESP8266:Примеры/Отправка данных от Arduino на ESP8266 через последовательный порт

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

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


Черновик


Отправка данных от Arduino на ESP8266 через последовательный порт[1]

Эта статья рассказывает, как настроить отправку данных от платы Arduino на модуль ESP8266 через последовательную коммуникацию.

Перед тем, как приступить к проекту, рекомендую пройти вот эти руководства:

Необходимые компоненты

  • Один модуль 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 – это язык, чувствительный к регистру. Поэтому переменная «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) - эта строчка вызывает функцию, созданную выше

Загрузка скетча на 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, сделайте следующее:

  1. Скачайте отсюда ZIP-архив с ESPlorer IDE
  2. Распакуйте архив
  3. Перейдите в главную папку
  4. Запустите файл «ESPlorer.jar»
  5. Откройте 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, проделайте следующее:

  1. Подключите программатор FTDI к компьютеру
  2. Выставьте скорость передачи данных на 9600 бод
  3. Выберите порт, к которому подключен программатор FTDI (к примеру, COM3)
  4. Нажмите кнопку «Open/Close»
  5. Кликните на вкладку «NodeMCU+MicroPython»
  6. Скопируйте LUA-скрипт в ESPlorer IDE

После этого вам останется лишь нажать на кнопку «Save to ESP» и сохранить файл под названием «init.lua». Все элементы программы, необходимые для этих действий, подсвечены на картинке ниже красным цветом:

Общая схема

Подключите компоненты друг к другу как показано на картинке ниже:

Примечание: В этой схеме используется делитель напряжения, переключающий логику с 5-вольтовой (Arduino) на 3,3-вольтовую (ESP8266). Для низких скоростей он работает хорошо, но на высоких могут возникнуть проблемы. О том, как понизить вольтовую логику, читайте в этой статье.

Демонстрация

Теперь светодиод должен начать мигать по одному разу в секунду. Если это происходит, то все настроено правильно – Arduino посылает сообщение «HI!», а ESP это сообщение получает. В видео ниже этот проект показан вживую:

https://www.youtube.com/watch?v=VROj6i3npo0

Теперь вместо отправки простого «HI!» вы можете подключить к Arduino какие-нибудь датчики, а затем отправлять на ESP данные от этих датчиков. Потом на основе этой сборки можно сделать веб-сервер, который будет показывать эти данные в браузере.

См.также

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