
Hej alla! I den här artikeln kommer vi att noggrant visa hur du, bokstavligen på 20 minuter av din lediga tid, kan ställa in fjärrstyrning av esp8266-modulen med hjälp av en Android-app via MQTT-protokollet.
Idén om fjärrstyrning och övervakning har alltid fascinerat människor som är intresserade av elektronik och programmering. Möjligheten att när som helst kunna ta emot eller skicka nödvändiga data, oavsett var man befinner sig, ger stora möjligheter. I mina tidigare artiklar ( och ) har jag försökt diskutera flera tillgängliga och relativt enkla sätt att genomföra fjärrstyrning av mikrokontroller via internet. Men tiden och världen står inte stilla – framstegen fortsätter sitt obarmhärtiga framfart. Under den här korta tiden har esp8266-modulen fått stor popularitet, tack vare sitt låga pris och inbyggda wi-fi, vilket har gjort den till en av de centrala delarna av "Smart Home".
I nuläget är MQTT det främsta och mest populära protokollet för datatransmission mellan enskilda enheter inom "Smart Home"-system. Det har flera fördelar jämfört med andra protokoll:
— låg trafikförbrukning;
— kopplingen mellan klienten och servern är alltid öppen;
— belastar inte internetkanalen;
— ingen fördröjning i datatransmissionen;
— bekväm system för prenumerationer på ämnen;
Allt detta möjliggör övervakning och hantering i realtid. Men MQTT kräver en egen server som fungerar som mellanhand mellan nätverksklienterna. Här finns två alternativ: antingen skapa sin egen server eller använda tredjepartstjänster.
Det beskrivna styrsystemet består av två huvudkomponenter: en MQTT-server (som vanligtvis är en) och klienter, som kan vara ganska många. I vårt fall kommer Android-appen och esp8266-modulen att fungera som klienter.
Systemets arbetsalgoritm är följande. Klienterna ansluter till servern, och strax efter anslutningen prenumererar var och en av dem på de ämnen som intresserar dem. All kommunikation mellan klienterna går genom servern, som vidarebefordrar data till andra klienter med beaktande av deras prenumerationer.
MQTT-server.
I vårt fall kommer vi att använda en mycket bekväm tjänst som har en gratis plan (Cute Cat) som helt kommer att täcka behoven för att genomföra ett litet eget "smart hem"-system.

Vi registrerar oss på webbplatsen och får de nödvändiga uppgifterna för att få tillgång till servern. När man ställer in klienter måste man använda en vanlig port (utan SSL och TLS).

Appen på Android.
Vår app kommer att fungera som en kontrollenhet för mikrokontrollern och kommer även att ta emot och visa all information som tas emot från esp8266.
Appen heter och representerar en färdig mqtt-klient med ett fåtal mycket användbara widgets. Mer information om hur man arbetar med appen kan ses i videon.
Esp8266.
Modulen programmeras i Arduino-miljön, men jag vill påpeka att modulen har problem med firmware i de senaste versionerna av Arduino, så jag rekommenderar att använda version 1.6.4.
För exemplet är en LED (5 pin) och en temperatursensor ds18b20 (2 pin) anslutna till esp8266.
Eftersom det är nödvändigt att ta emot data för att styra LED-lampan måste esp, efter anslutningen, prenumerera på den relevanta ämnet "test/led" annars kommer alla skickade data att gå förbi vår mikrokontroller.
För att skicka temperaturdata behövs ingen prenumeration, men när man skickar temperaturvärden är det nödvändigt att ange ämnet dit dessa data kommer att gå.
Nedan finns en skiss med detaljerade kommentarer.
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"; // Namn på Wi-Fi-åtkomstpunkten
const char *pass = "PASSWORD"; // Lösenord för åtkomstpunkten
const char *mqtt_server = "server"; // Namn på MQTT-servern
const int mqtt_port = 11140; // Port för anslutning till MQTT-servern
const char *mqtt_user = "Login"; // Inloggning för servern
const char *mqtt_pass = "Pass"; // Lösenord för servern
#define BUFFER_SIZE 100
bool LedState = false;
int tm=300;
float temp=0;
// Функция получения данных от сервера
void callback(const MQTT::Publish& pub)
{
Serial.print(pub.topic()); // skriver ut ämnets namn till seriellt port
Serial.print(" => ");
Serial.print(pub.payload_string()); // skriver ut det mottagna värdet till seriellt port
String payload = pub.payload_string();
if(String(pub.topic()) == "test/led") // kontrollerar om data kommer från rätt ämne
{
int stled = payload.toInt(); // omvandlar mottagna data till heltal
digitalWrite(5,stled); // slår på eller av LED-lampan baserat på mottagna värden
}
}
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("Ansluter till ");
Serial.print(ssid);
Serial.println("...");
WiFi.begin(ssid, pass);
if (WiFi.waitForConnectResult() != WL_CONNECTED)
return;
Serial.println("WiFi ansluten");
}
// подключаемся к MQTT серверу
if (WiFi.status() == WL_CONNECTED) {
if (!client.connected()) {
Serial.println("Ansluter till MQTT-server");
if (client.connect(MQTT::Connect("arduinoClient2")
.set_auth(mqtt_user, mqtt_pass))) {
Serial.println("Ansluten till MQTT-server");
client.set_callback(callback);
client.subscribe("test/led"); // prenumerera på ämnet med data för LED
} else {
Serial.println("Kunde inte ansluta till MQTT-server");
}
}
if (client.connected()){
client.loop();
TempSend();
}
}
} // slut på huvudcykeln
// Функция отправки показаний с термодатчика
void TempSend(){
if (tm==0)
{
sensors.requestTemperatures(); // få temperaturvärdet från sensorn
float temp = sensors.getTempCByIndex(0);
client.publish("test/temp",String(temp)); // skickar temperaturvärdet till ämnet för temperatursensorn
Serial.println(temp);
tm = 300; // paus mellan sändningarna av temperaturvärden cirka 3 sekunder
}
tm--;
delay(10);
}
Som ett resultat får vi ett bekvämt verktyg för fjärrstyrning och övervakning av data, som är ganska enkelt att använda och även nybörjare kan hantera.
Video med en demonstration av styrsystemets funktionalitet

Detaljerad videoinstruktion för att konfigurera systemet

Ett av sätten att använda styrningen av esp8266 via MQTT-protokollet

Styrning av LED-bandet via internet

Om du har frågor om detta material rekommenderar jag att du tittar på del två av videon, där materialet presenteras mer visuellt.
I arkivet finns sketchen och alla nödvändiga bibliotek för att programmera mikrokontrollern med sketchen från exemplet.
Observera att biblioteket ESP8266WiFi.h inte ingår i detta arkiv, det installeras via Boards manager i Arduino-miljön.
MQTT-server —
Länk till IoT MQTT Dashboard-applikationen —
Tack alla för er uppmärksamhet.
Källa: habr.com
