Всем привет! В этой статье будет подробно рассказано и показано как буквально за 20 минут свободного времени настроить дистанционное управление модулем esp8266 с помощью приложения на Android по протоколу MQTT. Идея дистанционного управления и мониторинга всегда будоражила умы увлеченных в электронике и программировании людей. Ведь возможность в любой момент времени получить или отправить нужные данные, не зависимо от своего местоположения, дает широкие возможности. В своих прошлых статьях ( Статья 1 и Статья 2) я пытался рассмотреть несколько доступных и относительно простых вариантах реализации дистанционного управления микроконтроллерами через интернет. Однако время и весь мир не стоит на месте – прогресс продолжает свое неумолимое движение вперед. За это небольшое время приобрел широкую популярность модуль esp8266 который благодаря низкой цене и встроенному wi-fi стал одним из основных составляющих «Умного дома». На данный момент MQTT является передовым и наиболее популярным протоколом передачи данных между отдельными устройствами в рамках систем «Умного дома». Он обладает рядом преимуществ по отношению к другим протоколам: — низкое потребление трафика; — соединение между клиентом и сервером всегда открыто; — не нагружает интернет канал; — отсутствие задержек в передаче данных; — удобная система подписок на топики; Всё это дает возможность мониторинга и управления в режиме реального времени. Однако MQTT требует наличие своего собственного сервера, который выполняет роль посредника между клиентами сети. Тут есть два выхода либо создавать свой сервер либо использовать сторонние сервисы. Описываемая система управления состоит из двух основных частей: сервера MQTT (он как правило один) и клиентов, которых может быть довольно много. В нашем случае в качестве клиентов будут выступать приложение на Android и сам модуль esp8266. Алгоритм работы системы следующий. Клиенты подключаются к серверу и сразу после подключения каждый из них осуществляет подписку на и интересующие его топики. Всё общение между клиентами проходит транзитом через сервер, который перенаправляет данные другим клиентам с учетом их подписок.MQTT сервер. В нашем случае мы будем использовать крайне удобный сервис www.cloudmqtt.com у которого есть бесплатный тарифный план (Cute Cat), который полностью покроет потребности для реализации небольшой собственной системы «умного дома».
Пройдём регистрацию на сайте и получаем необходимые данные для доступа к серверу. При настройке клиентов необходимо использовать обычный Порт ( без SSL и TLS).
Приложение на 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, опять нажав на регулятор температуры.
В следующих двух статья научимся отправлять данные на MQTT сервер, а также принимать их обратно, попутно выполняя команды на стороне устройства, с красочным отображением на вашем смартфоне. Первым делом нужно зарегистрироваться на сервере MQTT, мой выбор пал на популярный cloudmqtt. Чтобы долго не искать, переходим по прямой ссылке для регистрации нового аккаунта
https://customer.cloudmqtt.com/signup
Вводим почту, затем подтверждаем ссылку, которая быстро упадёт во входящие. В открывшейся странице нужно будет указать пароль, и подтвердить условия лицензионного соглашения
После авторизации, в главном меню можно выбрать любой из этих пунктов, так мы создадим новый брокер, куда будем отправлять топики с информацией
Далее задаём любое имя брокера, и самое главное – выбираем тарифный план Cute Cat, это бесплатно и подходит для нашей цели
Также можно выбрать сервер, но разницы никакой между ними нет для наших целей, я оставил тот, что стоит по умолчанию
Теперь, если перейти к нашему созданному брокеру, можно увидеть важную информацию для подключения. Эти параметры мы будем вводить в коде Arduino IDE
Ещё, я создал пользователя, которого буду использовать на клиентском устройстве. Переходим во вкладку USERS & ACL, пишем имя нового пользователя (я сделал User1) , пароль и жмём зелёную кнопку + ADD
Смотрите также: 1000pcs светодиоды
Теперь самая важная часть – нужно назначить права пользователю, которого мы только что создали. Листаем ниже до вкладки ACLs , выбираем тип Topic, потом пользователя (в моём случае, User1) и в поле pattern пишем “#” (без кавычек), также отмечаем события Read Access/ Write Access, и снова жмём зелёную кнопку + ADD
Теперь перейдём к написанию программы на аппаратной части. Подготовим наш esp8266, и запустим среду Arduino IDE. Почти все примеры в сети используют библиотеку PubSubClient, но у меня как-раз таки не получилось завести эту либу вместе с cloudMqtt, поэтому я случайно обратился к примеру Adafruit, с которым у меня всё увенчалось успехом. Переходим в менеджер библиотек, вводим в поиске mqtt, и ищем библиотеку Adafruit MQTT Library. Устанавливаем
Ищем в примерах вкладку adafruit, а далее mqtt_esp8266, создаём новый проект на основе этого примера
Первым делом находим в тексте проекта и заполняем поля 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, пищит при включении и мигает красным
Данные, отправляемые примером (а это постоянный инкремент переменной “х”), это не так интересно, попробуем отправить температуру, а потом отобразить её на телефоне. Как подключить датчик 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
Теперь переходим на онлайн сервисе во вкладку 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/