
Cześć wszystkim! W tym artykule szczegółowo opiszę, jak w zaledwie 20 minut wolnego czasu skonfigurować zdalne sterowanie modułem esp8266 za pomocą aplikacji na Androida w protokole MQTT.
Pomysł zdalnego sterowania i monitorowania zawsze wzbudzał zainteresowanie osób pasjonujących się elektroniką i programowaniem. Możliwość w każdej chwili uzyskania lub wysłania potrzebnych danych, niezależnie od lokalizacji, stwarza szerokie możliwości. W moich poprzednich artykułach ( i ) próbowałem omówić kilka dostępnych i stosunkowo prostych sposobów realizacji zdalnego sterowania mikrokontrolerami przez internet. Jednak czas i cały świat nie stoją w miejscu – postęp nieustannie posuwa się do przodu. W krótkim czasie moduł esp8266 zyskał dużą popularność, dzięki niskiej cenie i wbudowanemu wi-fi, stał się jednym z kluczowych elementów "Inteligentnego domu".
Obecnie MQTT jest wiodącym i najpopularniejszym protokołem wymiany danych między poszczególnymi urządzeniami w ramach systemów "Inteligentnego domu". Oferuje szereg zalet w porównaniu z innymi protokołami:
— niskie zużycie ruchu;
— połączenie między klientem a serwerem jest zawsze otwarte;
— nie obciąża łącza internetowego;
— brak opóźnień w przesyłaniu danych;
— wygodny system subskrypcji tematów;
To wszystko umożliwia monitorowanie i zarządzanie w czasie rzeczywistym. Jednak MQTT wymaga posiadania własnego serwera, który pełni rolę pośrednika między klientami sieci. Mamy dwa wyjścia: stworzyć własny serwer lub skorzystać z zewnętrznych usług.
Opisywany system zarządzania składa się z dwóch głównych części: serwera MQTT (zazwyczaj jest jeden) oraz klientów, którymi może być całkiem sporo. W naszym przypadku klientami będą aplikacja na Androida oraz sam moduł esp8266.
Algorytm działania systemu jest następujący. Klienci łączą się z serwerem i zaraz po połączeniu każdy z nich odbywa subskrypcję tematów, które go interesują. Cała komunikacja między klientami przebiega przez serwer, który przekierowuje dane do innych klientów z uwzględnieniem ich subskrypcji.
Serwer MQTT.
W naszym przypadku skorzystamy z bardzo wygodnej usługi która oferuje darmowy plan (Cute Cat), w pełni zaspokajający potrzeby realizacji małego, własnego systemu "inteligentnego domu".

Zarejestrujemy się na stronie i uzyskamy niezbędne dane do dostępu do serwera. Przy konfiguracji klientów należy używać standardowego portu (bez SSL i TLS).

Aplikacja na Androida.
Nasza aplikacja będzie działała jako pilot do mikrokontrolera oraz będzie odbierać i wyświetlać wszystkie informacje pozyskiwane z esp8266.
Aplikacja nazywa się i stanowi gotowego klienta mqtt z niewielką liczbą bardzo wygodnych widgetów. Więcej informacji na temat działania aplikacji można znaleźć w filmie.
Esp8266.
Moduł jest programowany w środowisku Arduino, jednak chcę zaznaczyć, że w ostatnich wersjach Arduino występują problemy z programowaniem modułu, dlatego zalecam używanie wersji 1.6.4.
Dla przykładu, do esp8266 podłączona jest dioda LED (pin 5) oraz czujnik temperatury ds18b20 (pin 2).
Ponieważ do sterowania diodą LED konieczne jest pozyskiwanie danych, esp po podłączeniu powinno subskrybować odpowiedni temat "test/led"; w przeciwnym razie wszystkie wysłane dane przejdą obok naszego mikrokontrolera.
Aby wysyłać dane o temperaturze, subskrypcja nie jest wymagana, ale przy przesyłaniu wartości temperatury należy wskazać temat, do którego te dane będą kierowane.
Poniżej znajduje się szkic z szczegółowymi komentarzami.
Szkic 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"; // Nazwa punktu dostępowego Wi-Fi
const char *pass = "PASSWORD"; // Hasło do punktu dostępowego
const char *mqtt_server = "server"; // Nazwa serwera MQTT
const int mqtt_port = 11140; // Port do połączenia z serwerem MQTT
const char *mqtt_user = "Login"; // Login do serwera
const char *mqtt_pass = "Pass"; // Hasło do serwera
#define BUFFER_SIZE 100
bool LedState = false;
int tm=300;
float temp=0;
// Функция получения данных от сервера
void callback(const MQTT::Publish& pub)
{
Serial.print(pub.topic()); // wyświetlamy w porcie szeregowym nazwę tematu
Serial.print(" => ");
Serial.print(pub.payload_string()); // wyświetlamy w porcie szeregowym wartość odebranych danych
String payload = pub.payload_string();
if(String(pub.topic()) == "test/led") // sprawdzamy, czy dane pochodzą z odpowiedniego tematu
{
int stled = payload.toInt(); // przekształcamy odebrane dane na typ całkowity
digitalWrite(5,stled); // włączamy lub wyłączamy diodę LED w zależności od otrzymanych wartości danych
}
}
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"); // subscribe to topic with data for the LED
} else {
Serial.println("Could not connect to MQTT server");
}
}
if (client.connected()){
client.loop();
TempSend();
}
}
} // end of main loop
// Функция отправки показаний с термодатчика
void TempSend(){
if (tm==0)
{
sensors.requestTemperatures(); // get temperature value from the sensor
float temp = sensors.getTempCByIndex(0);
client.publish("test/temp",String(temp)); // send temperature value to topic for the temperature sensor
Serial.println(temp);
tm = 300; // pause between temperature value sends about 3 seconds
}
tm--;
delay(10);
}
W rezultacie otrzymujemy wygodne narzędzie do zdalnego sterowania i monitorowania danych, które jest dość proste w obsłudze i będzie w zasięgu nawet dla początkujących.
Film z demonstracją działania systemu sterowania

Szczegółowa instrukcja wideo dotycząca konfiguracji systemu

Jedna z możliwości zastosowania sterowania esp8266 przez protokół MQTT

Sterowanie taśmą LED przez internet

Jeśli masz pytania dotyczące tego materiału, polecam obejrzenie drugiej części wideo, w której materiał jest przedstawiony w sposób bardziej obrazowy.
W archiwum znajdują się szkic i wszystkie niezbędne biblioteki do wgrania mikrokontrolera szkicem z przykładu.
Zwracam uwagę, że biblioteka ESP8266WiFi.h nie wchodzi w skład tego archiwum, jest instalowana przez menedżera płyt w środowisku Arduino.
Serwer MQTT —
Link do aplikacji IoT MQTT Dashboard —
Dziękuję wszystkim za uwagę.
Źródło: habr.com
