
Здравейте на всички! В тази статия ще бъде подробно разгледано и показано как буквално за 20 минути свободно време да настроите дистанционно управление на модула esp8266 с помощта на приложение за Android чрез протокола MQTT.
Идеята за дистанционно управление и мониторинг винаги е вълнувала умове, запалени по електроника и програмиране. Възможността по всяко време да получите или изпратите нужните данни, независимо от местоположението си, предоставя широки възможности. В предишните си статии ( и ) се опитвах да разгледам няколко налични и относително лесни варианта за реализиране на дистанционно управление на микроконтролери през интернет. Въпреки това времето и целият свят не спи – прогресът продължава своето неуморно движение напред. През този кратък период модулът esp8266 придоби широка популярност, благодарение на ниската си цена и вграденото Wi-Fi, и стана основна част от "Умния дом".
В момента MQTT е водещият и най-популярен протокол за предаване на данни между отделни устройства в системите "Умен дом". Той притежава редица предимства пред другите протоколи:
— ниско потребление на трафик;
— връзката между клиента и сървъра винаги е отворена;
— не натоварва интернет канала;
— отсъствие на забавяне при предаване на данни;
— удобна система за абонаменти по теми;
Всичко това позволява мониторинг и управление в реално време. Въпреки това, MQTT изисква наличието на собствен сървър, който да играе ролята на посредник между клиентите в мрежата. Има два варианта – да създадете свой сървър или да използвате външни услуги.
Описваната система за управление се състои от две основни части: сървър на MQTT (обикновено един) и клиенти, които могат да бъдат доста много. В нашия случай клиентите ще бъдат приложението на Android и самият модул esp8266.
Алгоритъмът на работа на системата е следният. Клиентите се свързват към сървъра и веднага след свързването всеки от тях абонира за интересуващите го теми. Цялата комуникация между клиентите преминава транзитно през сървъра, който пренасочва данните на другите клиенти, като взема предвид техните абонаменти.
MQTT сървър.
В нашия случай ще използваме изключително удобна услуга която предлага безплатен тарифен план (Cute Cat), който напълно покрива нуждите за реализиране на малка собствена система за "умен дом".

Ще се регистрираме на сайта и ще получим необходимите данни за достъп до сървъра. При настройката на клиентите е необходимо да се използва обикновен порт (без SSL и TLS).

Приложение на Android.
Нашето приложение ще служи като дистанционно управление за микроконтролера и ще приема и показва всичката получена информация от esp8266.
Приложението се нарича и е готов 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"; // Името на Wi-Fi точката за достъп
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 сервер —
Линк към приложението IoT MQTT Dashboard —
Благодаря на всички за вниманието.
Източник: habr.com
