Всем привет! В этой статье будет подробно рассказано и показано как буквально за 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 <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2
OneWire 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);
}



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

Видео с демонстрацией работы системы управления


Подробная видеоинструкция по настройке системы


Один из вариантов применения управления 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

Всем спасибо за внимание.

Комментарии (15)


  1. Rumlin
    25.04.2016 12:24
    +5

    использовать крайне удобный сервис www.cloudmqtt.com

    При падении канала весь Умный дом накрывается…


    1. dimitriy16
      25.04.2016 12:44
      +1

      Я только вникаю в тему, но, как я понял, можно сервис mqtt поднять локально на OpenWRT


      1. Rumlin
        25.04.2016 13:00
        +1

        Это совсем бюджетно. Более безопасно сервер спрятать внутри сети, а тут вариантов много Raspberry Pi и т.д. https://geektimes.ru/post/255404/


        1. alexpp
          25.04.2016 18:22

          Вопрос — а можно ли подружить mqtt с БД mysql на малинке? Т.е. чтобы данные писались туда, и были доступны третьим приложениям.


          1. ivizil
            25.04.2016 18:25

            Можно. Малинка подключается к серверу как ещё один клиент. Даже более того она может выступать мозгом системы и отдавать команды при натсуплении определенных условий…


          1. Rumlin
            25.04.2016 20:16

            Производительности хватит «на всё». Для примера https://geektimes.ru/post/258564/


          1. evgeny_boger
            26.04.2016 23:06

            У нас кстати в контроллерах Wiren Board есть простенький сервис для хранения данных, которые приходят по MQTT. Использует БД sqlite, внешних зависимостей мало, оптимизирован под embedded. Исходники тут


    1. AleCher
      25.04.2016 17:12
      +1

      Как по мне, нет смысла ради мелкого демона подсаживать весь дом на еще одно облако.


    1. Sepro
      26.04.2016 08:19

      Такая же первая мысль: или с сервером что или у провайдера какие-то перебои и умный дом тупеет на глазах…


  1. antiphabr
    25.04.2016 15:37
    +2

    В показанном на видео модуле esp8266 необходимо перепаять чип-перемычку для использования внутренней антены либо использовать внешнюю.


  1. ksv811212
    25.04.2016 18:24

    А какой у вас конкретно модуль ESP8266? что-то не встречал такого на али


    1. ivizil
      25.04.2016 18:44

      Его можно найти в поиске по фразе «esp8266 201»


      1. Celtis
        26.04.2016 17:42

        Не особо удачный модуль, честно говоря…
        Очень уж много «нетрадиционно ориентированных» инженерных решений.


  1. madrider
    26.04.2016 00:13
    +1

    я просто оставлю это тут: homes-smart.ru esp8266


  1. klbsss
    26.04.2016 08:34

    есть прекрасное приложение IoT Manager