Удаленное управление ESP8266

Данный алгоритм актуален на 25.04.2024, операционная система Mac OS.

Введение

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

Описание

После просмотра видео у вас, возможно, возникло несколько вопросов. В этой статье мы подробно рассмотрим, как создать и настроить удаленное управление для ESP8266, используя платформу VizIoT. Мы пройдем все шаги, начиная с необходимых компонентов и заканчивая финальными настройками и тестированием.

Как программировать модуль ESP8266 для управления встроенным на плате светодиодом, как подключить датчик BME280, а также подключение микроконтроллера к сети Wi-Fi, мы проходили в предыдущих блоках:

В этой статье, не потратив и 20 минут, мы научимся удаленно управлять светодиодом, но не ограничимся только этим, а подключим и будем управлять электроприбором с удаленного сервера, нажимая кнопку на экране компьютера или телефона. Т.е. в итоге мы построим физический прототип управления различными устройствами в доме, на даче либо на предприятии, используя подключение к удаленному серверу.

1. Регистрация на сайте VizIoT

1.1 Регистрируемся в VizIoT.

1.2 На вкладке «устройства» создаем новое устройство с названием ESP8266+BME280 (название опциональное), после чего получаем ключ доступа и пароль к этому устройству.
add_new_device_weather_station

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. Установка библиотек в Arduino IDE

Для работы с модулем нужно установить 2 библиотеки:

2.1 Варианты установки библиотеки PubSubClient в Arduino IDE: Проверяем, присутствует ли в каталоге Arduino IDE библиотека PubSubClient, набирая в поисковой строке:
PubSubClient_install
Устанавливаем найденный пакет.

2.2 В случае отсутствия данной библиотеки в каталоге Arduino IDE, переходим по ссылке PubSubClient, где на развернутой странице нажимаем GitHub, как на скриншоте
PubSubClient_install_fm_github

2.2.1 Далее откроется окно, в котором находим ссылку для скачивания Source code (zip) и заливаем ее себе на компьютер в директорию «скачанные» либо в иную другую, к которой вы можете потом обратиться, зная путь.
PubSubClient_install_fm_github_zip

2.2.3 Выбираем скачанный zip-файл по нижеуказанному маршруту в Arduino IDE
zip_library_PubSubClient
И устанавливаем библиотеку 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:
VizIoTMqttClient_library_ide
Устанавливаем найденный пакет.

2.3.1 В случае отсутствия данной библиотеки в каталоге Arduino IDE, переходим по ссылке VizIoTMqttClient, в отрывшемся окне сайта github, открываем Code , где выбираем Download ZIP, который скачиваем в директорию скачанные либо в иную другую, к которой вы можете потом обратиться, зная путь.
VizIoTMqttClient_github
Затем в Arduino IDE по нижеуказанному маршруту выбираем скачанный zip-файл
VizIoTMqttClient_install_fm_github_zip
И устанавливаем библиотеку VizIoTMqttClient

3. Настройка панелей и виджетов

3.1 Скетч скачан, библиотеки установлены, теперь подключаем ESP8266 к компьютеру, заливаем код и заходим в настройки устройства (блок Настройки передаваемых параметров) т.е. продолжаем п. 1.2

Устанавливаем параметры, которые будут переданы на сервер:

  • RSSI - ключ параметра для передачи данных уровня сигнала Wi-Fi, тип параметра: «Мощность сигнала, dBm».
  • led - ключ параметра для передачи данных управления светодиодом, тип параметра: «Вкл/выкл, 0-1».
  • В «Описание параметра» led можно вписать «Switch», эта надпись появится на виджете.
    parameter_settings_devise

3.2 Сохранили, далее заходим в панели и создаем новую панель. Нажимаем Создать панель и называем ее, например, Тест-панель:
create_test_panel

3.3 Создаем виджет для панели: вводим название, например уровень сигнала Wi-Fi, выбираем тип виджета График, далее выбираем устройство и параметры для визуализации, в данном случае rssi, нажимаем добавить виджет
create_widget_wifi

3.4 В итоге перед нами появляется виджет, на котором построен онлайн-график сигнала Wi-Fi
widget_wifi

3.5 На этой же панели в правом нижнем углу нажимаем на + и создаем виджет управления светодиодом, устанавливаем название, выбираем параметры Переключатели, далее выбираем устройство и параметры для управления
create_widget_led

3.6 После всего на экране появятся 2 виджета на Тест-панели:
panel_with_two_wigjets
Двигая кнопкой управляем светодиодом, как на видео:

4. Удалённое управления приборами

Прежде чем начать удаленно управлять приборами, предлагаю построить примитивную схему. Например, подключить внешний светодиод к пину 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));
  }
}

Примерный вид прототипа управления внешним потребителем будет выглядеть как на фото, в качестве потребителя будет светодиод. Еще раз напоминаю, что внешнему светодиоду нужен токопонижающий (нагрузочный) резистор.
led_external

Управлять работой светодиода, как говорилось выше, будем кнопкой, подавая сигнал с сервера, а получать сигнал будет микроконтроллер через канал Wi-Fi, к которому он подключен. Смотрим процесс в действии:

Управление полезной нагрузкой

Для управления полезной нагрузкой с переменным током, нам понадобится электромеханическое реле, которым будем управлять используя микроконтроллер ESP8266. Рассмотрим схему подключения на базе реле SRD-05VDC-SL-C
SRD-05VDC-SL-C
Данное реле позволяет управлять электроцепями переменного тока с нагрузкой до 10 А с напряжением до 250 В. Для наглядного примера построим прототип для управления электрической лампой, подключенной к цепи 220 В. Схема подключения реле к плате ESP8266 следующая:

  • разъем DC+ на реле подключаем к pin 3V микроконтроллера
  • разъем DC- на реле подключаем к pin G микроконтроллера
  • разъем IN на реле подключаем к pin D0 микроконтроллера


connection_SRD-05VDC-SL-C
Соответственно подключение (разрыв) проводов 220 В подводим к контактам NO и COM.
connected_SRD-05VDC-SL-C

Заливаем скетч в модуль ESP8266, открываем панель с виджетами и с помощью, уже известного нам переключателя, подаем управляющий сигнал 3V на pin D0, который заставит замкнуться разорванную цепь 220 В и включит лампу.
Как это происходит мы видели на видео в начале статьи.

Заключение

Теперь, когда вы ознакомились с основами, вы готовы приступить к созданию собственного проекта удаленного управления ESP8266. Если у вас возникнут вопросы или трудности, обратитесь к нашему руководству или свяжитесь с поддержкой VizIot.