Данный алгоритм актуален на 25.04.2024, операционная система Mac OS.
Прежде чем мы углубимся в детали настройки и использования удаленного управления для ESP8266, давайте посмотрим короткий видеоролик, который демонстрирует конечный результат. Это позволит вам увидеть, что именно мы будем создавать, и как это работает в реальных условиях.
После просмотра видео у вас, возможно, возникло несколько вопросов. В этой статье мы подробно рассмотрим, как создать и настроить удаленное управление для ESP8266, используя платформу VizIoT. Мы пройдем все шаги, начиная с необходимых компонентов и заканчивая финальными настройками и тестированием.
Как программировать модуль ESP8266 для управления встроенным на плате светодиодом, как подключить датчик BME280, а также подключение микроконтроллера к сети Wi-Fi, мы проходили в предыдущих блоках:
В этой статье, не потратив и 20 минут, мы научимся удаленно управлять светодиодом, но не ограничимся только этим, а подключим и будем управлять электроприбором с удаленного сервера, нажимая кнопку на экране компьютера или телефона. Т.е. в итоге мы построим физический прототип управления различными устройствами в доме, на даче либо на предприятии, используя подключение к удаленному серверу.
1.2 На вкладке «устройства» создаем новое устройство с названием ESP8266+BME280 (название опциональное), после чего получаем ключ доступа и пароль к этому устройству.
1.3 Полученные данные (ключ и пароль) будем использовать в следующем скетче, который можно скопировать и вставить в Arduino IDE:
#include <ESP8266WiFi.h>
#include <Ticker.h>
#include <VizIoTMqttClient.h>
//Адрес ноги со светодиодом
#define LED_ESP D4
//ssid и пароль доступа для подключения к WI-FI
const char* ssid = "..........";
const char* password = "...........";
//Ключ и пароль доступа
String VizIoT_Device_key = "................";
String VizIoT_Device_pass = "....................";
WiFiClient espClient;
PubSubClient clientMQTT(espClient);
VizIoTMqttClient clientVizIoT(clientMQTT);
long lastMsg = 0;
char msg[100];
byte statusLed = 0;
/*----------Отправка данных----------------*/
Ticker sender;
bool isSendDataToServer;
void SendDataToServer() {isSendDataToServer = true;}
#define INTERVAL_SEND_DATA 30 //Отправка данных каждые 5 минут (5*60=300)
/*----------Отправка данных----------------*/
void setup()
{
//разрешаем управлять светодиодом
pinMode(LED_ESP, OUTPUT);
digitalWrite(LED_ESP, HIGH);
//Включаем вывод информации в Serial Monitor
Serial.begin(115200);
//Подключаемся к WI-FI
setup_wifi();
clientVizIoT.config(VizIoT_Device_key, VizIoT_Device_pass);
clientVizIoT.listenCommand(callback);
sender.attach(INTERVAL_SEND_DATA, SendDataToServer); // Создаем событие отправки данных каждые INTERVAL_SEND_DATA сек
}
//Обработка события получения данных
void callback(String parameter, byte value) {
Serial.print("Публикация сообщения: parameter");
Serial.print(parameter);
Serial.print("value ");
Serial.println(value);
if (parameter.compareTo("led") == 0) {
if (value == 1) {
statusLed = 1;
digitalWrite(LED_ESP, LOW);
} else {
statusLed = 0;
digitalWrite(LED_ESP, HIGH);
}
snprintf(msg, sizeof(msg), "{\"led\":\"%c\"}", (statusLed) ? '1' : '0');
Serial.print("Публикация сообщения: ");
Serial.println(msg);
clientVizIoT.sendJsonString(String(msg));
}
}
//Функция подключения к WI-FI
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
//Ожидает подключения к WI-FI
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi подключен");
}
void loop()
{
//необходим для обработки входящих сообщения и поддержания подключения к Брокеру
clientVizIoT.loop();
if (isSendDataToServer) {
isSendDataToServer = false;
snprintf (msg, sizeof(msg), "{\"rssi\":\"%i\",\"led\":\"%c\"}", WiFi.RSSI(), (statusLed) ? '1' : '0');
Serial.print("Публикация сообщения: ");
Serial.println(msg);
clientVizIoT.sendJsonString(String(msg));
}
}
Для работы с модулем нужно установить 2 библиотеки:
2.1 Варианты установки библиотеки PubSubClient в Arduino IDE:
Проверяем, присутствует ли в каталоге Arduino IDE библиотека PubSubClient, набирая в поисковой строке:
Устанавливаем найденный пакет.
2.2 В случае отсутствия данной библиотеки в каталоге Arduino IDE, переходим по ссылке PubSubClient, где на развернутой странице нажимаем GitHub
, как на скриншоте
2.2.1 Далее откроется окно, в котором находим ссылку для скачивания Source code (zip)
и заливаем ее себе на компьютер в директорию «скачанные» либо в иную другую, к которой вы можете потом обратиться, зная путь.
2.2.3 Выбираем скачанный zip-файл по нижеуказанному маршруту
в Arduino IDE
И устанавливаем библиотеку PubSubClient.
2.2.4 В данной библиотеке необходимо произвести небольшие изменения.
В директории документы/Arduino/libraries/PubSubClient/src
открываем файл PubSubClient.h
нажимаем command+f, находим параметр #define MQTT_MAX_PACKET_SIZE 256
который меняем на #define MQTT_MAX_PACKET_SIZE 1024
(т.е. 256 меняем на 1024). Это необходимо для увеличения объема передаваемых данных в библиотеку PubSubClient.
2.3 Варианты установки библиотеки VizIoTMqttClient в Arduino IDE:
Проверяем, присутствует ли в каталоге Arduino IDE библиотека VizIoTMqttClient, набирая в поисковой строке VizIoTMqttClient:
Устанавливаем найденный пакет.
2.3.1 В случае отсутствия данной библиотеки в каталоге Arduino IDE, переходим по ссылке VizIoTMqttClient, в отрывшемся окне сайта github
, открываем Code
, где выбираем Download ZIP
, который скачиваем в директорию скачанные либо в иную другую, к которой вы можете потом обратиться, зная путь.
Затем в Arduino IDE по нижеуказанному маршруту выбираем скачанный zip-файл
И устанавливаем библиотеку VizIoTMqttClient
3.1 Скетч скачан, библиотеки установлены, теперь подключаем ESP8266 к компьютеру, заливаем код и заходим в настройки устройства (блок Настройки передаваемых параметров) т.е. продолжаем п. 1.2
Устанавливаем параметры, которые будут переданы на сервер:
3.2 Сохранили, далее заходим в панели и создаем новую панель.
Нажимаем Создать панель и называем ее, например, Тест-панель:
3.3 Создаем виджет для панели: вводим название, например уровень сигнала Wi-Fi, выбираем тип виджета График, далее выбираем устройство и параметры для визуализации, в данном случае rssi
, нажимаем добавить виджет
3.4 В итоге перед нами появляется виджет, на котором построен онлайн-график сигнала Wi-Fi
3.5 На этой же панели в правом нижнем углу нажимаем на +
и создаем виджет управления светодиодом, устанавливаем название, выбираем параметры Переключатели, далее выбираем устройство и параметры для управления
3.6 После всего на экране появятся 2 виджета на Тест-панели:
Двигая кнопкой управляем светодиодом, как на видео:
Прежде чем начать удаленно управлять приборами, предлагаю построить примитивную схему. Например, подключить внешний светодиод к пину D0
, немножко поправив скетч, который использовали выше, чтобы заставить его моргать с помощью той же кнопки, что и в пункте 3.6
Для этого в константе define LED_ESP
, меняем адрес ноги - вместо D4
устанавливаем D0
.
А также в функции digitalWrite
поменять значения HIGH
и LOW
для цифрового вход/выхода (pin):
if (parameter.compareTo("led") == 0) {
if (value == 1) {
statusLed = 1;
digitalWrite(LED_ESP, HIGH);
} else {
statusLed = 0;
digitalWrite(LED_ESP, LOW);
}
}
И устанавливаем скетч:
#include <ESP8266WiFi.h>
#include <Ticker.h>
#include <VizIoTMqttClient.h>
//Адрес ноги со светодиодом
#define LED_ESP D0
//ssid и пароль доступа для подключения к WI-FI
const char* ssid = "xxxx";
const char* password = "xxxx";
//Ключ и пароль доступа
String VizIoT_Device_key = "xxxx";
String VizIoT_Device_pass = "xxxx";
WiFiClient espClient;
PubSubClient clientMQTT(espClient);
VizIoTMqttClient clientVizIoT(clientMQTT);
long lastMsg = 0;
char msg[100];
byte statusLed = 0;
/*----------Отправка данных----------------*/
Ticker sender;
bool isSendDataToServer;
void SendDataToServer() {isSendDataToServer = true;}
#define INTERVAL_SEND_DATA 30 //Отправка данных каждые 5 минут (5*60=300)
/*----------Отправка данных----------------*/
void setup()
{
//разрешаем управлять светодиодом
pinMode(LED_ESP, OUTPUT);
digitalWrite(LED_ESP, HIGH);
//Включаем вывод информации в Serial Monitor
Serial.begin(115200);
//Подключаемся к WI-FI
setup_wifi();
clientVizIoT.config(VizIoT_Device_key, VizIoT_Device_pass);
clientVizIoT.listenCommand(callback);
sender.attach(INTERVAL_SEND_DATA, SendDataToServer); // Создаем событие отправки данных каждые INTERVAL_SEND_DATA сек
}
//Обработка события получения данных
void callback(String parameter, byte value) {
Serial.print("Публикация сообщения: parameter");
Serial.print(parameter);
Serial.print("value ");
Serial.println(value);
if (parameter.compareTo("led") == 0) {
if (value == 1) {
statusLed = 1;
digitalWrite(LED_ESP, HIGH);
} else {
statusLed = 0;
digitalWrite(LED_ESP, LOW);
}
snprintf(msg, sizeof(msg), "{\"led\":\"%c\"}", (statusLed) ? '1' : '0');
Serial.print("Публикация сообщения: ");
Serial.println(msg);
clientVizIoT.sendJsonString(String(msg));
}
}
//Функция подключения к WI-FI
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
//Ожидает подключения к WI-FI
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi подключен");
}
void loop()
{
//необходим для обработки входящих сообщения и поддержания подключения к Брокеру
clientVizIoT.loop();
if (isSendDataToServer) {
isSendDataToServer = false;
snprintf (msg, sizeof(msg), "{\"rssi\":\"%i\",\"led\":\"%c\"}", WiFi.RSSI(), (statusLed) ? '1' : '0');
Serial.print("Публикация сообщения: ");
Serial.println(msg);
clientVizIoT.sendJsonString(String(msg));
}
}
Примерный вид прототипа управления внешним потребителем будет выглядеть как на фото, в качестве потребителя будет светодиод. Еще раз напоминаю, что внешнему светодиоду нужен токопонижающий (нагрузочный) резистор.
Управлять работой светодиода, как говорилось выше, будем кнопкой, подавая сигнал с сервера, а получать сигнал будет микроконтроллер через канал Wi-Fi, к которому он подключен. Смотрим процесс в действии:
Для управления полезной нагрузкой с переменным током, нам понадобится электромеханическое реле, которым будем управлять используя микроконтроллер ESP8266. Рассмотрим схему подключения на базе реле SRD-05VDC-SL-C
Данное реле позволяет управлять электроцепями переменного тока с нагрузкой до 10 А с напряжением до 250 В.
Для наглядного примера построим прототип для управления электрической лампой, подключенной к цепи 220 В. Схема подключения реле к плате ESP8266 следующая:
Соответственно подключение (разрыв) проводов 220 В подводим к контактам NO и COM.
Заливаем скетч в модуль ESP8266, открываем панель с виджетами и с помощью, уже известного нам переключателя, подаем управляющий сигнал 3V на pin D0
, который заставит замкнуться разорванную цепь 220 В и включит лампу.
Как это происходит мы видели на видео в начале статьи.
Заключение
Теперь, когда вы ознакомились с основами, вы готовы приступить к созданию собственного проекта удаленного управления ESP8266. Если у вас возникнут вопросы или трудности, обратитесь к нашему руководству или свяжитесь с поддержкой VizIot.