На данный момент MQTT является передовым и наиболее популярным протоколом передачи данных между отдельными устройствами в рамках систем «Умного дома». Он обладает рядом преимуществ по отношению к другим протоколам: — низкое потребление трафика; — соединение между клиентом и сервером всегда открыто; — не нагружает интернет канал; — отсутствие задержек в передаче данных; — удобная система подписок на топики; Всё это дает возможность мониторинга и управления в режиме реального времени. Однако MQTT требует наличие своего собственного сервера, который выполняет роль посредника между клиентами сети. Тут есть два выхода либо создавать свой сервер либо использовать сторонние сервисы.
Описываемая система управления состоит из двух основных частей: сервера MQTT (он как правило один) и клиентов, которых может быть довольно много. В нашем случае в качестве клиентов будут выступать приложение на Android и сам модуль esp8266.
Алгоритм работы системы следующий. Клиенты подключаются к серверу и сразу после подключения каждый из них осуществляет подписку на и интересующие его топики. Всё общение между клиентами проходит транзитом через сервер, который перенаправляет данные другим клиентам с учетом их подписок.
MQTT сервер
В нашем случае мы будем использовать крайне удобный сервис www.cloudmqtt.com у которого есть бесплатный тарифный план (Cute Cat), который полностью покроет потребности для реализации небольшой собственной системы «умного дома».
Пройдём регистрацию на сайте и получаем необходимые данные для доступа к серверу. При настройке клиентов необходимо использовать обычный Порт ( без SSL и TLS).
Стоит также упомянуть, что вы сами можете «развернуть» (установить и настроить) свой локальный MQTT-брокер (например: mosquito mqtt ), который будет удобно использовать в системах без доступа к интернету или другим.
Приложение на Android. Наше приложение будет выступать в качестве пульта управления для микроконтроллера, а так же будет принимать и отображать всю получаемую информацию от esp8266.
Приложение называется IoT MQTT Dashboard и представляет собой готовый mqtt клиент с небольшим количеством очень удобных виджетов. Более подробно о работе с приложением можно посмотреть на видео. Esp8266 Модуль прошивается в среде программирования Arduino. Для примера к esp8266 подключены светодиод (5 пин) и датчик температуры ds18b20 (2 пин). Так как для управления светодиода необходимо получать данные, то esp после подключения должно оформить подписку на соответствующий топик «test/led» иначе все отправленные данные пройдут мимо нашего микроконтроллера. Для отправки данных температуры подписка не нужно, но при передаче значений температуры необходимо указывать топик в который эти данные пойдут.
Код для esp8266:
// Светодиод подлкючен к 5 пину // Датчик температуры ds18b20 к 2 пину
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); // включаем или выключаем светодиод в зависимоти от полученных значений данных }
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); }
Замена светодиода на реле (управление мощными нагрузками)
Да, это очень легко сделать. Все, что нужно-это подключение к контактам, которые занимал светодиод на контакты управлением реле. Реле может быть выполнено в виде готового модуля для esp
Стоит кратко упомянуть, что существуют два основных типа модулей управления нагрузкой и их устройства (электромагнитное и твердотельное реле)
Существует множество реализаций твердотельных реле под различные нужды. (Для самых любознательных ссылка на сравнение).