Андрей Смирнов
Время чтения: ~14 мин.
Просмотров: 2

Понемногу обо всем..

9650771d6b1c4668af4e40ab3b2a1be6.jpg Всем привет! В этой статье будет подробно рассказано и показано как буквально за 20 минут свободного времени настроить дистанционное управление модулем esp8266 с помощью приложения на Android по протоколу MQTT. Идея дистанционного управления и мониторинга всегда будоражила умы увлеченных в электронике и программировании людей. Ведь возможность в любой момент времени получить или отправить нужные данные, не зависимо от своего местоположения, дает широкие возможности. В своих прошлых статьях ( Статья 1 и Статья 2) я пытался рассмотреть несколько доступных и относительно простых вариантах реализации дистанционного управления микроконтроллерами через интернет. Однако время и весь мир не стоит на месте – прогресс продолжает свое неумолимое движение вперед. За это небольшое время приобрел широкую популярность модуль esp8266 который благодаря низкой цене и встроенному wi-fi стал одним из основных составляющих «Умного дома». На данный момент MQTT является передовым и наиболее популярным протоколом передачи данных между отдельными устройствами в рамках систем «Умного дома». Он обладает рядом преимуществ по отношению к другим протоколам: — низкое потребление трафика; — соединение между клиентом и сервером всегда открыто; — не нагружает интернет канал; — отсутствие задержек в передаче данных; — удобная система подписок на топики; Всё это дает возможность мониторинга и управления в режиме реального времени. Однако MQTT требует наличие своего собственного сервера, который выполняет роль посредника между клиентами сети. Тут есть два выхода либо создавать свой сервер либо использовать сторонние сервисы. Описываемая система управления состоит из двух основных частей: сервера MQTT (он как правило один) и клиентов, которых может быть довольно много. В нашем случае в качестве клиентов будут выступать приложение на Android и сам модуль esp8266. Алгоритм работы системы следующий. Клиенты подключаются к серверу и сразу после подключения каждый из них осуществляет подписку на и интересующие его топики. Всё общение между клиентами проходит транзитом через сервер, который перенаправляет данные другим клиентам с учетом их подписок.MQTT сервер. В нашем случае мы будем использовать крайне удобный сервис www.cloudmqtt.com у которого есть бесплатный тарифный план (Cute Cat), который полностью покроет потребности для реализации небольшой собственной системы «умного дома».10a4cc9a9f2d4bf2b6d7f5992d1659b1.jpg Пройдём регистрацию на сайте и получаем необходимые данные для доступа к серверу. При настройке клиентов необходимо использовать обычный Порт ( без SSL и TLS).d8d504e220584810946c7a098a252f63.jpgПриложение на Android. Наше приложение будет выступать в качестве пульта управления для микроконтроллера, а так же будет принимать и отображать всю получаемую информацию от esp8266. Приложение называется IoT MQTT Dashboard и представляет собой готовый mqtt клиент с небольшим количеством очень удобных виджетов. Более подробно о работе с приложением можно посмотреть на видео.Esp8266. Модуль прошивается в среде программирования Arduino, однако хочу заметить что у модуля проблемы с прошивкой в последних версиях Arduino, поэтому рекомендую использовать версию 1.6.4. Для примера к esp8266 подключены светодиод (5 пин) и датчик температуры ds18b20 (2 пин). Так как для управления светодиода необходимо получать данные, то esp после подключения должно оформить подписку на соответствующий топик «test/led» иначе все отправленные данные пройдут мимо нашего микроконтроллера. Для отправки данных температуры подписка не нужно, но при передаче значений температуры необходимо указывать топик в который эти данные пойдут. Ниже приведен скетч с подробными комментариями.Скетч Esp8266_mqtt.ino// Светодиод подлкючен к 5 пину // Датчик температуры ds18b20 к 2 пину #include #include <pubsubclient> #include <dallture> #define OeWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); const char *ssid = "AIRPORT"; // Имя вайфай точки доступа const char *pass = "PASSWORD"; // Пароль от точки доступа const char *mqtt_server = "server"; // Имя сервера MQTT const int mqtt_port = 11140; // Порт для подключения к серверу MQTT const char *mqtt_user = "Login"; // Логи от сервер const char *mqtt_pass = "Pass"; // Пароль от сервера #define BUFFER_SIZE 100 bool LedState = false; int tm=300; float temp=0; // Функция получения данных от сервера void callback(const MQTT::Publish& pub) { Serial.print(pub.topic()); // выводим в сериал порт название топика Serial.print(" => "); Serial.print(pub.payload_string()); // выводим в сериал порт значение полученных данных String payload = pub.payload_string(); if(String(pub.topic()) == "test/led") // проверяем из нужного ли нам топика пришли данные { int stled = payload.toInt(); // преобразуем полученные данные в тип integer digitalWrite(5,stled); // включаем или выключаем светодиод в зависимоти от полученных значений данных } } WiFiClient wclient; PubSubClient client(wclient, mqtt_server, mqtt_port); void setup() { sensors.begin(); Serial.begin(115200); delay(10); Serial.println(); Serial.println(); pinMode(5, OUTPUT); } void loop() { // подключаемся к wi-fi if (WiFi.status() != WL_CONNECTED) { Serial.print("Connecting to "); Serial.print(ssid); Serial.println("..."); WiFi.begin(ssid, pass); if (WiFi.waitForConnectResult() != WL_CONNECTED) return; Serial.println("WiFi connected"); } // подключаемся к MQTT серверу if (WiFi.status() == WL_CONNECTED) { if (!client.connected()) { Serial.println("Connecting to MQTT server"); if (client.connect(MQTT::Connect("arduinoClient2") .set_auth(mqtt_user, mqtt_pass))) { Serial.println("Connected to MQTT server"); client.set_callback(callback); client.subscribe("test/led"); // подписывааемся по топик с данными для светодиода } else { Serial.println("Could not connect to MQTT server"); } } if (client.connected()){ client.loop(); TempSend(); } } } // конец основного цикла // Функция отправки показаний с термодатчика void TempSend(){ if (tm==0) { sensors.requestTemperatures(); // от датчика получаем значение температуры float temp = sensors.getTempCByIndex(0); client.publish("test/temp",String(temp)); // отправляем в топик для термодатчика значение температуры Serial.println(temp); tm = 300; // пауза меду отправками значений температуры коло 3 секунд } tm--; delay(10); } </dallture></pubsubclient> В результате мы получаем удобный инструмент для дистанционного управления и мониторинга данных, который довольно прост в освоении и будет по силу даже начинающим.Видео с демонстрацией работы системы управленияПодробная видеоинструкция по настройке системыОдин из вариантов применения управления esp8266 через MQTT протоколУправление светодиодной лентой через интернет Если у вас возникли вопросы по данному материалу, то рекомендую посмотреть вторую часть видео, где материал изложен более наглядно. В архиве находятся скетч и все необходимые библиотеки для прошивки микроконтроллера скетчем из примера. Обращаю ваше внимание, что библиотека ESP8266WiFi.h не входит в данный архив, она устанавливается через Boards manager в среде Arduino.АРХИВ MQTT сервер — www.cloudmqtt.com Ссылка на приложение IoT MQTT Dashboard — play.google.com/store/apps/details?id=com.thn.iotmqttdashboard&hl=ru Всем спасибо за внимание. С помощью этого приложения вы можете создавать панели управления для ваших устройств и приложений, поддерживающих протокол MQTT. Прошу не воспринимать это описание как инструкцию, это мои заметки от склероза :)) Все данные для настроек берем из темы  MQTT это просто….. Установив программу на смартфон получаем «Черный Квадрат»Настройка подключения  Нажимаем + для создания нового подключения к брокеру. Можно создать несколько разных подключений, к разным брокерам и с разными задачами. У меня одно подключение для просто посмотреть (и не нагадить) и второе для управления устройствами. В принципе все описания в программе есть, но мыж ленивые, читать не наш метод — смотрим картинки. Большинство настроек оставляем по умолчанию. Прокручиваем экран вниз и заполняем нужные поля . Имя — произвольное название данного подключения Адрес —  брокера Порт — стандартный 1883 Шифрование — ВЫКЛЮЧАЕМ (убираем галочку, нет его у данного брокера) Далее, вводим наши учетные данные на брокере Имя пользователя — зарегистрированная почта Пароль — пароль для брокера (для данных — 0204327c) Идентификатор ставится автоматически. Размер плиток выбираем по желанию, потом можно поменять … Сохраняем все наши настройки нажав дискетку в правом верхнем углу и получаем новое соединение — Demo. Входим в Demo и ….. получаем очередной  «Черный Квадрат». Нажимаем + для создания новой информационной плашки. Тут есть большой выбор. Текст — просто показывает данные полученные в заданном топике. Переключатель/кнопка — позволяет изменять данные по фиксированным значениям Диапазон/прогресс — графически отображает данные и позволяет их произвольно изменять Мультивыбор — создает меню выбора для изменения данных Изображения — позволяет подключить картинки с видеокамеры … Цвет — для управления светом, цветом … Рассмотрим поочередно основные варианты. Текст Имя — произвольное название плашки с данными, длинное имя не влезет, будем кратки . Топик — полное название нужного нам топика. можно посмотреть на брокере FlyHubfrdemo@yandex.ru/NodeMCU/rssi frdemo@yandex.ru/NodeMCU/ — это постоянные значения для данного модуля rssi — это последнее имя в топике, на брокере можно посмотреть список возможных значений во вкладке Listen, Включать публикацию для текста не надо, мы не собираемся менять данные, только смотрим.

Кнопка Имя — произвольное Топик — имя топика который мы хотим изменять, например на выходе 5 подключена лампочка и кнопкой будем ее включать и выключать. Т.к. надо передавать данные —  включаем публикацию. Настраиваем значения переключателя — Вкл=1, Выкл=0.  Другие настройки не трогаем.Выбираем нужную картинку для отображения на плашке и нужный цвет.Сохраняем все настройки и пробуем работу новой плашки.  Нажав на нее  изменяем состояние лампочки и визуальное отображение.
Переключатель Имя — произвольное Топик — имя топика который мы хотим изменять, например thermo_set2 изменяет установку термостата №2  Выставляем значения температуры 20 и 10 градусов, настраиваем красивые картинкии вот результат для контроля заданной (не реальной, а заданной программой) температуры быстренько нарисуем текстовую плашечку и будем смотреть изменения в системе нажимая переключатель температуры. Было настроено на 10 градусов, сделаем 20, опять нажав на регулятор температуры.
Регулятор Имя — произвольное Топик — продолжим с термостатом Публикацию включаемопускаемся ниже и настраиваем уровни регулировки — минимум 5 и максимум 30 (тут есть одна проблемка, на моем смартфоне самое правое поле не умещается, поэтому установив курсор в нужное поле и повернув смартфон горизонтально я смог выставить нужное значение)вот и новая плашечка, она также показывает установленное значение температуры,нажав на неё мы получаем плавный регулятор заданной температуры. 
если сделать длительное нажатие на плашку, то можно изменить ее настройки или сделать ее клон, который можно изменить и перенастроить. Диапазон Имя — произвольное Топик — продолжим с термостатом Публикацию отключаем, будем только смотреть данныеДобавим теперь префикс и постфикс, это произвольные символы которые будут добавляться на плашке к полученному значению для более красивого и удобного вида. Также можно уйти от конкретных данных и смотреть процентное значение (убираем галочку).Еще интересная функция — моргание плашки при определенных условиях. Задаем нижнее и верхнее значения val < 15 || val > 17  (строго соблюдаем формат текста). 
Как результат плашка Диапазон будет моргать если температура задана не 15 градусов.
Мульти-выбор Имя — произвольное Топик — продолжим с термостатом Публикацию включаем
теперь нам понадобится изменить размер главного шрифта, иначе будет некрасиво.Меню создается добавлением новых опций. Задаем в опции нужное значение и нужное название. Опции можно изменять  …
И вот красивый результат …..
Вот и все основное ….Можно подключиться к моему тестовому модулю  и посмотреть все это вживую.MQTT login :   frdemo@yandex.ruMQTT password : 0204327cДаже можно понажимать кнопочки и  поуправлять настройками ))Do It YourselfMQTT-esp8266-главная-1-991x560.jpg

В следующих двух статья научимся отправлять данные на MQTT сервер, а также принимать их обратно, попутно выполняя команды на стороне устройства, с красочным отображением на вашем смартфоне. Первым делом нужно зарегистрироваться на сервере MQTT, мой выбор пал на популярный cloudmqtt. Чтобы долго не искать, переходим по прямой ссылке для регистрации нового аккаунта

https://customer.cloudmqtt.com/signup

Вводим почту, затем подтверждаем ссылку, которая быстро упадёт во входящие. В открывшейся странице нужно будет указать пароль, и подтвердить условия лицензионного соглашения

регистрация-mqtt.png

После авторизации, в главном меню можно выбрать любой из этих пунктов, так мы создадим новый брокер, куда будем отправлять топики с информацией

Создаём-Instance-1024x222.png

Далее задаём любое имя брокера, и самое главное – выбираем тарифный план Cute Cat, это бесплатно и подходит для нашей цели

Название-MQTT-1024x454.png

Также можно выбрать сервер, но разницы никакой между ними нет для наших целей, я оставил тот, что стоит по умолчанию

Выбираем-сервер-MQTT-1024x363.png

Теперь, если перейти к нашему созданному брокеру, можно увидеть важную информацию для подключения. Эти параметры мы будем вводить в коде Arduino IDE

параметры-mqtt-1024x594.png

Ещё, я создал пользователя, которого буду использовать на клиентском устройстве. Переходим во вкладку USERS & ACL, пишем имя нового пользователя (я сделал User1) , пароль и жмём зелёную кнопку + ADD

Смотрите также:  1000pcs светодиоды

Создаём-пользователя-MQTT-1024x327.png

Теперь самая важная часть – нужно назначить права пользователю, которого мы только что создали. Листаем ниже до вкладки ACLs , выбираем тип Topic, потом пользователя (в моём случае, User1) и в поле pattern пишем “#” (без кавычек), также отмечаем события Read Access/ Write Access, и снова жмём зелёную кнопку + ADD

Задаём-права-пользовтеля-1024x443.png

Теперь перейдём к написанию программы на аппаратной части. Подготовим наш esp8266, и запустим среду Arduino IDE. Почти все примеры в сети используют библиотеку PubSubClient, но у меня как-раз таки не получилось завести эту либу вместе с cloudMqtt, поэтому я случайно обратился к примеру Adafruit, с которым у меня всё увенчалось успехом. Переходим в менеджер библиотек, вводим в поиске mqtt, и ищем библиотеку Adafruit MQTT Library. Устанавливаем

Библиотека-1024x196.png

Ищем в примерах вкладку adafruit, а далее mqtt_esp8266, создаём новый проект на основе этого примера

Пример-mqtt-esp8266.png

Первым делом находим в тексте проекта и заполняем поля wi-fi, чтобы подключиться к активной сети интернета

 #define WLAN_SSID       "Keenetic-8322" #define WLAN_PASS       "*************" 

Чуть ниже можно заметить 4 основных параметра для подключения к серверу MQTT. Наверное вы уже поняли, что они были перечислены в параметрах созданного брокера в cloudMqtt. Переписываем их из вашего аккаунта

 #define AIO_SERVER      "tailor.cloudmqtt.com" #define AIO_SERVERPORT  18989                   // use 8883 for SSL #define AIO_USERNAME    "****xnmc" #define AIO_KEY         "****kHFzzJdw" 

После загрузки скетча, можно открыть терминал и убедиться в работоспособности отправки данных в MQTT. Надпись MQTT connected и успешная отправка в топик “…OK!”, означает что всё в порядке.

Смотрите также:  Ремонт Фантом 2, пищит при включении и мигает красным

Успешное-подключение-к-MQTT.png

Данные, отправляемые примером (а это постоянный инкремент переменной “х”), это не так интересно, попробуем отправить температуру, а потом отобразить её на телефоне. Как подключить датчик DS18B20 к ESP8266 мы подробно рассматривали в статье, с этим сложностей возникнуть не должно. Нам даже не понадобится преобразовывать значение температуры в текстовую, поэтому функцию сбора температуры можно сократить до:

 void getTemperature() {   DS18B20.requestTemperatures();   tempC = DS18B20.getTempCByIndex(0);   delay(100); } 

Теперь посмотрим, какая команда отвечает за публикацию топика. Изначальное значение photocell я сменил на temperature, ведь мы хотим отправить значение с термометра. /feeds/temperature – это имя топика, на которого можно будет потом подписаться с другого устройства

 Adafruit_MQTT_Publish temperature = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature"); 

Но это ещё не всё, ниже есть ещё один блок, который отвечает за публикацию. Сначала мы видим вывод в терминал, там я тоже поменял строки на температуру, но самое главное поменять переменную здесь, в паблишере – > (! temperature.publish(tempC))

   // Now we can publish stuff!   Serial.print(F("nSending temperature = "));   getTemperature();                            // Считываем температуру перед отправкой на сервер   Serial.print(tempC);   Serial.print("...");   if (! temperature.publish(tempC))            // Здесь указываем переменную, которую хотим отправить   {     Serial.println(F("Failed"));   } else {     Serial.println(F("OK!"));   } 

Прошиваем ESP. и смотрим терминал – видим, что теперь отправляются значения температуры, и они корректно считываются. Осталось самое главное – проверить, приходят ли они на сервер MQTT

Смотрите также:  i2c передача данных между двумя arduino. Передаём числа float и int

Mqtt-успешная-отправка-терминал.png

Теперь переходим на онлайн сервисе во вкладку WEBSOCKET UI, и смотрим наши приходящие сообщения. Если вы видите их в графе, Received messages, значит отправка с ESP8266 происходит корректно

Если вы заметили, отсюда можно и послать что-нибудь в ответ. Вернее отправить ещё один топик, а наш ESP8266 подпишется на него, и сделает действие при определённом значении. В следующей статье, создадим на телефоне красивые дашборд с температурой и переключателем, ну например клапана водопровода, и проверим всё в работе

Используемые источники:

  • https://habr.com/post/393277/
  • http://whitefluffybear.blogspot.com/p/mqtt-dash.html
  • https://wreckage.ru/sending-data-to-the-cloudmqtt-server-with-esp826/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации