
Hallo allemaal! In dit artikel wordt uitgebreid uitgelegd en getoond hoe je in slechts 20 minuten vrije tijd afstandsbediening kunt instellen voor de ESP8266-module met behulp van een Android-app via het MQTT-protocol.
Het idee van afstandsbediening en monitoring heeft altijd de geest van degenen die enthousiast zijn over elektronica en programmeren bezighouden. De mogelijkheid om op elk moment gegevens te ontvangen of te verzenden, ongeacht je locatie, biedt enorme mogelijkheden. In mijn eerdere artikelen ( en ) heb ik geprobeerd verschillende beschikbare en relatief eenvoudige manieren te bespreken voor het implementeren van afstandsbediening van microcontrollers via het internet. Echter, de tijd en de wereld staan niet stil – de vooruitgang blijft onverbiddelijk voortschrijden. In deze korte tijd heeft de ESP8266-module, die dankzij de lage prijs en ingebouwde wi-fi een van de belangrijkste onderdelen van het 'Slimme Huis' is geworden, veel populariteit verworven.
Momenteel is MQTT het leidende en meest populaire protocol voor gegevensoverdracht tussen afzonderlijke apparaten binnen 'Slimme Huis'-systemen. Het heeft verschillende voordelen ten opzichte van andere protocollen:
— laag dataverbruik;
— verbinding tussen client en server blijft altijd open;
— belast het internetkanaal niet;
— geen vertraging in de gegevensoverdracht;
— handige abonnementsystemen voor topics;
Dit alles biedt de mogelijkheid voor monitoring en beheer in real-time. Echter, MQTT vereist een eigen server die fungeert als tussenpersoon tussen de netwerkclients. Hier zijn er twee opties: ofwel je creëert je eigen server ofwel je gebruikt externe diensten.
Het beschreven beheersysteem bestaat uit twee hoofdbestanddelen: de MQTT-server (die meestal uniek is) en de clients, waarbij er behoorlijk veel kunnen zijn. In ons geval zullen de Android-app en de ESP8266-module als clients fungeren.
Het algoritme van het systeem werkt als volgt. Clients verbinden zich met de server en onmiddellijk na de verbinding abonneert elk van hen zich op de topics die hen interesseren. Alle communicatie tussen de clients verloopt via de server, die gegevens doorstuurt naar andere clients op basis van hun abonnementen.
MQTT-server.
In ons geval zullen we gebruikmaken van een zeer handige service die een gratis abonnementsplan (Cute Cat) biedt dat volledig voldoet aan de behoeften voor de implementatie van een klein eigen 'slim huis'-systeem.

Laten we ons registreren op de website en de benodigde gegevens voor toegang tot de server verkrijgen. Bij het configureren van de clients moet je de standaard poort gebruiken (zonder SSL en TLS).

De applicatie op Android.
Onze applicatie zal fungeren als afstandsbediening voor de microcontroller, en zal ook alle ontvangen informatie van de esp8266 verwerken en weergeven.
De applicatie heet en is een kant-en-klare mqtt-client met een aantal zeer handige widgets. Meer details over het gebruik van de applicatie zijn te bekijken in de video.
Esp8266.
De module wordt geprogrammeerd in de Arduino-ontwikkelomgeving, maar ik wil opmerken dat de module problemen heeft met de firmware in de laatste versies van Arduino, daarom raad ik aan versie 1.6.4 te gebruiken.
Als voorbeeld zijn een LED (pin 5) en een temperatuur sensor ds18b20 (pin 2) verbonden met de esp8266.
Omdat we gegevens nodig hebben om de LED te bedienen, moet de esp na aansluiting zich abonneren op het betreffende topic 'test/led', anders zullen alle verzonden gegevens onze microcontroller voorbijgaan.
Voor het verzenden van temperatuurgegevens is een abonnement niet nodig, maar bij het verzenden van temperatuurwaarden moet je het topic opgeven waarheen deze gegevens gaan.
Hieronder staat de sketch met gedetailleerde opmerkingen.
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"; // Naam van het wifi-toegangspunt
const char *pass = "PASSWORD"; // Wachtwoord voor het toegangspunt
const char *mqtt_server = "server"; // Naam van de MQTT-server
const int mqtt_port = 11140; // Poort voor verbinding met de MQTT-server
const char *mqtt_user = "Login"; // Inloggegevens van de server
const char *mqtt_pass = "Pass"; // Wachtwoord van de server
#define BUFFER_SIZE 100
bool LedState = false;
int tm=300;
float temp=0;
// Функция получения данных от сервера
void callback(const MQTT::Publish& pub)
{
Serial.print(pub.topic()); // weergave van de topictitel in de seriële poort
Serial.print(" => ");
Serial.print(pub.payload_string()); // weergave van de ontvangen waarden in de seriële poort
String payload = pub.payload_string();
if(String(pub.topic()) == "test/led") // controleren of de ontvangen gegevens van het juiste topic komen
{
int stled = payload.toInt(); // omzetten van de ontvangen gegevens naar een integer
digitalWrite(5,stled); // LED aan- of uitzetten afhankelijk van de ontvangen waarden
}
}
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("Verbinden met ");
Serial.print(ssid);
Serial.println("...");
WiFi.begin(ssid, pass);
if (WiFi.waitForConnectResult() != WL_CONNECTED)
return;
Serial.println("WiFi verbonden");
}
// подключаемся к MQTT серверу
if (WiFi.status() == WL_CONNECTED) {
if (!client.connected()) {
Serial.println("Verbinden met MQTT-server");
if (client.connect(MQTT::Connect("arduinoClient2")
.set_auth(mqtt_user, mqtt_pass))) {
Serial.println("Verbonden met MQTT-server");
client.set_callback(callback);
client.subscribe("test\/led"); // we abonneren ons op het topic met gegevens voor de LED
} else {
Serial.println("Kon geen verbinding maken met de MQTT-server");
}
}
if (client.connected()){
client.loop();
TempSend();
}
}
} // einde van de hoofdlus
// Функция отправки показаний с термодатчика
void TempSend(){
if (tm==0)
{
sensors.requestTemperatures(); // we krijgen de temperatuurwaarde van de sensor
float temp = sensors.getTempCByIndex(0);
client.publish("test\/temp",String(temp)); // we verzenden de temperatuurwaarde naar het topic voor de temperatuursensor
Serial.println(temp);
tm = 300; // pauze tussen het verzenden van temperatuurwaarden van ongeveer 3 seconden
}
tm--;
delay(10);
}
Als resultaat krijgen we een handig hulpmiddel voor afstandsbediening en gegevensmonitoring, dat vrij eenvoudig te leren is en zelfs voor beginners haalbaar zal zijn.
Video ter demonstratie van het besturingssysteem

Gedetailleerde video-instructies voor het instellen van het systeem

Een van de toepassingen van besturing via esp8266 via het MQTT-protocol

Besturing van een LED-strip via internet

Als u vragen heeft over dit materiaal, raad ik aan de tweede deel van de video te bekijken, waarin het materiaal duidelijker wordt gepresenteerd.
In het archief bevinden zich de sketch en alle benodigde bibliotheken voor het flashen van de microcontroller met de voorbeeldsketch.
Let op dat de bibliotheek ESP8266WiFi.h niet in dit archief zit, deze wordt geïnstalleerd via de Boards manager in de Arduino-omgeving.
MQTT-server —
Link naar de IoT MQTT Dashboard-app —
Iedereen bedankt voor uw aandacht.
Bron: habr.com
