Esp8266 kontrol via internettet med MQTT-protokollen

Esp8266 kontrol via internettet med MQTT-protokollen
Hej alle! I denne artikel vil vi detaljeret beskrive og vise, hvordan man på blot 20 minutter kan opsætte fjernstyring af ESP8266-modulet ved hjælp af en Android-app via MQTT-protokollen.

Ideen om fjernstyring og overvågning har altid inspireret entusiaster inden for elektronik og programmering. Muligheden for til enhver tid at modtage eller sende nødvendige data, uafhængigt af ens placering, giver store muligheder. I mine tidligere artikler ( Artikel 1 og Artikel 2) forsøgte jeg at se på flere tilgængelige og relativt enkle muligheder for at implementere fjernstyring af mikrokontrollere over internettet. Men tiden og verden står ikke stille – fremskridtet fortsætter sin ubarmhjertige fremmarch. I denne korte periode har ESP8266-modulet opnået stor popularitet, da det med sin lave pris og indbyggede Wi-Fi er blevet en af de vigtigste komponenter i "Smart Home".

I øjeblikket er MQTT den førende og mest populære protokol til dataoverførsel mellem enheder inden for "Smart Home"-systemer. Den har en række fordele i forhold til andre protokoller:
— lav trafikforbrug;
— forbindelsen mellem klient og server er altid åben;
— overbelaster ikke internetkanalen;
— ingen forsinkelse i datatransmission;
— bekvem abonnementsordning på emner;
Alt dette giver mulighed for overvågning og styring i realtid. Men MQTT kræver, at der er en egen server, der fungerer som mellemliggende mellem netværkets klienter. Her er der to muligheder; enten oprette sin egen server eller bruge tredjeparts tjenester.

Det beskrevne styringssystem består af to hoveddele: en MQTT-server (som normalt er én) og klienter, der kan være ret mange. I vores tilfælde vil klienterne være Android-appen og selve ESP8266-modulet.

Systemets arbejdsalgoritme er som følger. Klienterne opretter forbindelse til serveren, og straks efter forbindelsen abonnerer hver af dem på de emner, der interesserer dem. Al kommunikation mellem klienterne foregår gennem serveren, som videresender data til andre klienter i henhold til deres abonnementer.

MQTT-server.

I vores tilfælde vil vi bruge en meget praktisk tjeneste www.cloudmqtt.com som har en gratis abonnement (Cute Cat), der fuldt ud dækker behovene for at implementere et lille, privat 'smart home'-system.
Esp8266 kontrol via internettet med MQTT-protokollen
Lad os registrere os på hjemmesiden og få de nødvendige oplysninger til adgang til serveren. Når vi opsætter klienter, skal vi bruge den almindelige port (uden SSL og TLS).
Esp8266 kontrol via internettet med MQTT-protokollen

Appen til Android.

Vores app vil fungere som en kontrolenhed til mikrokontrolleren og vil også modtage og vise al den information, der kommer fra esp8266.

Appen hedder IoT MQTT Dashboard og er en færdiglavet mqtt-klient med et lille antal meget praktiske widgets. Du kan se mere om appens funktion på video.

Esp8266.

Modulet flasher i Arduino-programmeringsmiljøet, men jeg vil bemærke, at modulet har problemer med at flashe i de nyeste versioner af Arduino, så jeg anbefaler at bruge version 1.6.4.
Som et eksempel er en lysdiode (pin 5) og en temperatursensor ds18b20 (pin 2) tilsluttet esp8266.
For at kunne styre lysdioden, skal esp efter tilslutning abonnere på den relevante topic 'test/led', ellers vil alle sendt data gå forbi vores mikrokontroller.
For at sende temperaturdata er abonnement ikke nødvendigt, men når temperaturværdier overføres, skal den topic angives, som disse data vil blive sendt til.

Nedenfor er en skitse med detaljerede kommentarer.

Skitse 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"; // Navn på WiFi-adgangspunkt
const char *pass = "PASSWORD"; // Adgangskode til adgangspunkt

const char *mqtt_server = "server"; // Navn på MQTT-server
const int mqtt_port = 11140; // Port til forbindelse til MQTT-server
const char *mqtt_user = "Login"; // Login til server
const char *mqtt_pass = "Pass"; // Adgangskode til server

#define BUFFER_SIZE 100

bool LedState = false;
int tm=300;
float temp=0;

// Функция получения данных от сервера

void callback(const MQTT::Publish& pub)
{
Serial.print(pub.topic()); // udskriver topic-navnet til seriel port
Serial.print(" => ");
Serial.print(pub.payload_string()); // udskriver værdien af de modtagne data til seriel port

String payload = pub.payload_string();

if(String(pub.topic()) == "test/led") // kontrollerer om dataene kommer fra vores ønskede topic
{
int stled = payload.toInt(); // konverterer de modtagne data til type integer
digitalWrite(5,stled); // tænder eller slukker lysdioden afhængigt af de modtagne værdier
}
}

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"); // subscribes to the 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(); // obtain temperature value from the sensor
float temp = sensors.getTempCByIndex(0);
client.publish("test/temp", String(temp)); // send temperature value to the topic for the temperature sensor
Serial.println(temp);
tm = 300; // pause between sending temperature values for about 3 seconds
}
tm--;
delay(10);
}

Som resultat får vi et praktisk værktøj til fjernbetjening og overvågning af data, som er ret nemt at lære og vil være tilgængeligt selv for begyndere.

Video med demonstration af styresystemets funktionalitet

Afspil video

Detaljeret video-instruktion til opsætning af systemet

Afspil video

En af anvendelsesmulighederne for kontrol af esp8266 via MQTT-protokollen

Afspil video

Kontrol af LED-stribe via internettet

Afspil video

Hvis du har spørgsmål til dette materiale, anbefaler jeg at se den anden del af videoen, hvor materialet er præsenteret mere visuelt.

I arkivet findes sketchen og alle nødvendige biblioteker til at programmere mikrokontrolleren med sketchen fra eksemplet.
Jeg vil gerne gøre opmærksom på, at biblioteket ESP8266WiFi.h ikke er inkluderet i dette arkiv, det installeres via Boards manager i Arduino miljøet.

ARKIV

MQTT server — www.cloudmqtt.com

Link til IoT MQTT Dashboard appen — play.google.com/store/apps/details?id=com.thn.iotmqttdashboard&hl=da

Tak for opmærksomheden.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster