
Helló mindenkinek! Ebben a cikkben részletesen bemutatásra kerül, hogy hogyan lehet mindössze 20 perc szabadidő alatt beállítani az esp8266 modul távoli vezérlését Android alkalmazáson keresztül az MQTT protokoll használatával.
A távoli vezérlés és megfigyelés ötlete mindig is izgatott olyan emberek körében, akik érdeklődnek az elektronika és a programozás iránt. Az a lehetőség, hogy bármikor megkaphassuk vagy elküldhessük a szükséges adatokat, függetlenül a tartózkodási helyünktől, széles lehetőségeket nyújt. Az előző cikkeimben ( és ) már próbáltam megvizsgálni néhány elérhető és viszonylag egyszerű megoldást a mikrokontroller távoli vezérlésének interneten keresztüli megvalósítására. Azonban az idő és a világ nem áll meg – a fejlődés folyamatosan nem szűnő iramban halad előre. E rövid idő alatt a modul, az esp8266, széles népszerűségnek örvendett, mivel alacsony ára és beépített Wi-Fi révén a „Okos Otthon” egyik fő alkotóelemévé vált.
Jelenleg az MQTT a legmodernebb és legnépszerűbb protokoll az adatok átadására az egyes eszközök között az „Okos Otthon” rendszerek keretein belül. Számos előnnyel rendelkezik más protokollokkal szemben:
— alacsony adatforgalom-igény;
— a kapcsolat a kliens és a szerver között mindig nyitva áll;
— nem terheli az internetcsatornát;
— adatátvitel késedelem nélkül;
— kényelmes rendszere van a témákra való feliratkozásnak;
Mindez lehetővé teszi a valós idejű megfigyelést és vezérlést. Azonban az MQTT saját szerver meglétét igényli, amely a hálózati kliensek közötti közvetítő szerepét tölti be. Itt két lehetőség van: vagy saját szervert hozunk létre, vagy külső szolgáltatásokat használunk.
A bemutatott vezérlési rendszer két fő részből áll: egy MQTT szerverből (ami általában csak egy darab) és a kliensekből, amelyek száma meglehetősen nagy lehet. Az esetünkben klienseként az Android alkalmazás és magának az esp8266 modulnak kell fellépnie.
A rendszer működési algoritmusa a következő. A kliensek csatlakoznak a szerverhez, és közvetlenül a csatlakozás után mindenki feliratkozik az általa érdekesnek tartott témákra. Az összes kommunikáció a kliensek között a szerveren keresztül történik, amely a feliratkozások figyelembevételével továbbítja az adatokat a többi kliensnek.
MQTT szerver.
Ebben az esetben egy rendkívül kényelmes szolgáltatást fogunk használni amelynek van egy ingyenes tarifacsomagja (Cute Cat), amely teljes mértékben fedezi egy kis házi "okos otthon" rendszer megvalósításához szükséges igényeket.

Regisztráljunk az oldalon, és szerezzük meg a szükséges adatokat a szerverhez való hozzáféréshez. Az ügyfelek beállításakor az általános portot kell használni (SSL és TLS nélkül).

Android alkalmazás.
Alkalmazásunk távirányítóként fog működni a mikrokontroller számára, valamint fogadja és megjeleníti az összes információt az esp8266-tól.
Az alkalmazás neve és egy kész mqtt kliens, amelynek néhány nagyon kényelmes widgetje van. Az alkalmazás használatáról részletesebben videón nézhet meg.
Esp8266.
A modul az Arduino programozási környezetben van feltöltve, de szeretném megjegyezni, hogy a modulnak problémái vannak az utolsó Arduino verziókkal, ezért javaslom a 1.6.4 verzió használatát.
Például az esp8266-hoz egy LED (5. pin) és egy DS18B20 hőmérséklet-érzékelő (2. pin) van csatlakoztatva.
Mivel a LED vezérléséhez adatokat kell kapnunk, az esp csatlakoztatás után fel kell iratkoznia a megfelelő "test/led" témára, különben az összes küldött adat elkerüli a mikrokontrollerünket.
A hőmérsékleti adatok küldéséhez feliratkozás nem szükséges, de az hőmérsékleti értékek átadásakor meg kell adni a témát, amelybe ezek az adatok menni fognak.
Az alábbiakban egy részletes megjegyzésekkel ellátott sketch található.
Sketch 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"; // A wifi-hozzáférési pont neve
const char *pass = "PASSWORD"; // A hozzáférési pont jelszava
const char *mqtt_server = "server"; // Az MQTT szerver neve
const int mqtt_port = 11140; // Port az MQTT szerverhez való csatlakozáshoz
const char *mqtt_user = "Login"; // Szerver bejelentkezési adatok
const char *mqtt_pass = "Pass"; // Szerver jelszó
#define BUFFER_SIZE 100
bool LedState = false;
int tm=300;
float temp=0;
// Функция получения данных от сервера
void callback(const MQTT::Publish& pub)
{
Serial.print(pub.topic()); // megjelenítjük a soros porton a téma nevét
Serial.print(" => ");
Serial.print(pub.payload_string()); // megjelenítjük a soros porton a kapott adatok értékét
String payload = pub.payload_string();
if(String(pub.topic()) == "test/led") // ellenőrizzük, hogy a megfelelő témából érkeztek-e az adatok
{
int stled = payload.toInt(); // átalakítjuk a kapott adatokat egész számra
digitalWrite(5,stled); // bekapcsoljuk vagy kikapcsoljuk a LED-et a kapott adatok értéke alapján
}
}
WiFiClient wclient;
PubSubClient kliens(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("Csatlakozás a ");
Serial.print(ssid);
Serial.println("...");
WiFi.begin(ssid, pass);
if (WiFi.waitForConnectResult() != WL_CONNECTED)
return;
Serial.println("WiFi csatlakoztatva");
}
// подключаемся к MQTT серверу
if (WiFi.status() == WL_CONNECTED) {
if (!client.connected()) {
Serial.println("Csatlakozás az MQTT szerverhez");
if (client.connect(MQTT::Connect("arduinoClient2")
.set_auth(mqtt_user, mqtt_pass))) {
Serial.println("Csatlakozva az MQTT szerverhez");
client.set_callback(callback);
client.subscribe("test/led"); // feliratkozunk a LED adatokra
} else {
Serial.println("Nem sikerült csatlakozni az MQTT szerverhez");
}
}
if (client.connected()){
client.loop();
TempSend();
}
}
} // a fő ciklus vége
// Функция отправки показаний с термодатчика
void TempSend(){
if (tm==0)
{
sensors.requestTemperatures(); // megkérjük az érzékelőt a hőmérséklet értékére
float temp = sensors.getTempCByIndex(0);
client.publish("test/temp",String(temp)); // küldjük a hőmérséklet értékét a hőmérséklet topikba
Serial.println(temp);
tm = 300; // szünet a hőmérséklet értékek küldése között kb. 3 másodperc
}
tm--;
delay(10);
}
Az eredmény egy kényelmes eszköz a távoli kezeléshez és a data monitorozáshoz, amely viszonylag egyszerűen elsajátítható, még a kezdők számára is.
Videó a vezérlő rendszer működésének bemutatásáról

Részletes videó útmutató a rendszer beállításáról

Az ESP8266 MQTT protokollon keresztül történő vezérlésének egyik alkalmazási módja

LED szalag vezérlése az interneten keresztül

Ha kérdéseid merülnének fel ezzel az anyaggal kapcsolatban, javaslom, hogy nézd meg a második rész videót, ahol az anyag vizuálisan érthetőbben van bemutatva.
Az archívumban található a példa alapján készült sketch és minden szükséges könyvtár a mikrokontroller firmware-jének feltöltéséhez.
Felhívom a figyelmed, hogy az ESP8266WiFi.h könyvtár nem tartozik az archívumba, ezt a Boards manager-en keresztül telepítheted az Arduino környezetben.
MQTT szerver —
Link az IoT MQTT Dashboard alkalmazáshoz —
Köszönöm a figyelmet.
Forrás: habr.com
