通过MQTT协议的Esp8266 Internet控制


大家好!本文将详细介绍并演示如何在20分钟的空闲时间内使用MQTT协议使用Android应用程序从字面上配置esp8266模块的远程控制。

远程控制和监视的想法一直激发着热衷于电子和编程的人们的思想。毕竟,无论何时何地,都有机会随时接收或发送必要的数据,这提供了充足的机会。过去的文章(第1 第2条)我试图考虑几种通过互联网实现对微控制器的远程控制的价格合理且相对简单的选项。但是,时间和整个世界都不会停滞不前-进步继续其不可阻挡的前进。在短时间内,esp8266模块获得了广泛的普及,由于其低廉的价格和内置的wi-fi,它已成为智能家居的主要组件之一。

目前,MQTT是最先进,最流行的协议,用于在智能家居系统框架内的各个设备之间传输数据。与其他协议相比,它具有许多优点:
-低流量消耗;
-客户端和服务器之间的连接始终处于打开状态;
-不加载互联网频道;
-数据传输没有延迟;
-方便的主题订阅系统;
所有这些使实时监视和控制成为可能。但是,MQTT需要其自己的服务器,该服务器充当网络客户端之间的中介。有两种方法可以创建自己的服务器或使用第三方服务。

所描述的控制系统由两个主要部分组成:MQTT服务器(通常是一个)和客户端,它们可能很多。在我们的案例中,Android应用程序和esp8266模块本身将充当客户端。

系统操作算法如下。客户端连接到服务器,并且每个客户端在连接后立即订阅他感兴趣的主题。客户端之间的所有通信均通过服务器,该服务器根据订阅将数据重定向到其他客户端。

MQTT服务器。

在我们的案例中,我们将使用极为方便的服务www.cloudmqtt.com,该服务具有免费的收费计划(Cute Cat),将完全满足实施其自己的小型“智能家居”系统的需求。

让我们在网站上进行注册并获取访问服务器所需的数据。配置客户端时,必须使用常规端口(无SSL和TLS)。


Android应用。

我们的应用程序将充当微控制器的控制面板,还将接收并显示从esp8266接收的所有信息。

该应用程序称为IoT MQTT仪表板,是现成的mqtt客户端,带有少量非常方便的小部件。有关使用该应用程序的更多详细信息,请参见视频。

Esp8266。

该模块在Arduino编程环境中进行了刷新,但是我想指出的是,该模块在最新版本的Arduino中存在固件问题,因此我建议使用1.6.4版。
例如,一个LED(5针)和一个ds18b20温度传感器(2针)连接到esp8266。
由于必须接收数据来控制LED,因此连接后的esp应该订阅适当的主题“ test / led”,否则所有发送的数据将通过我们的微控制器传递。
要发送温度数据,不需要订阅,但是在发送温度值时,您需要指定此数据将要到达的主题。

以下是带有详细注释的草图。

素描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"; //
const char *pass = "PASSWORD"; //

const char *mqtt_server = "server"; // MQTT
const int mqtt_port = 11140; // MQTT
const char *mqtt_user = "Login"; //
const char *mqtt_pass = "Pass"; //

#define BUFFER_SIZE 100

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

//

void callback(const MQTT::Publish& pub)
{
Serial.print(pub.topic()); //
Serial.print(" => ");
Serial.print(pub.payload_string()); //

String payload = pub.payload_string();

if(String(pub.topic()) == "test/led") //
{
int stled = payload.toInt(); // integer
digitalWrite(5,stled); //
}
}

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"); //
} else {
Serial.println("Could not connect to MQTT server");
}
}

if (client.connected()){
client.loop();
TempSend();
}

}
} //

//
void TempSend(){
if (tm==0)
{
sensors.requestTemperatures(); //
float temp = sensors.getTempCByIndex(0);
client.publish("test/temp",String(temp)); //
Serial.println(temp);
tm = 300; // 3
}
tm--;
delay(10);
}



结果,我们获得了用于远程控制和数据监视的便捷工具,该工具非常易于学习,即使对于初学者也有效。

演示控制系统操作的视频


详细的视频系统设置说明


esp8266通过MQTT协议控制的一种应用


通过互联网控制LED灯条


如果您对此材料有任何疑问,建议您观看视频的第二部分,使该材料的呈现更加清晰。

归档文件包含草图和所有必要的库,用于用示例中的草图刷新微控制器。
我提请您注意这个档案文件中不包含ESP8266WiFi.h库;它是通过Arduino环境中的Boards管理器安装的。

ARCHIVE

MQTT服务器-www.cloudmqtt.com

链接到IoT MQTT仪表板应用程序-play.google.com/store/apps/details?id=com.thn.iotmqttdashboard

感谢您的关注。

Source: https://habr.com/ru/post/zh-CN393277/


All Articles