0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ESP8266 通过 MQTT 协议实现 LED 的远程控制

jf_07365693 来源:jf_07365693 作者:jf_07365693 2024-09-25 09:11 次阅读

ESP8266 通过 MQTT 协议实现 LED 的远程控制

本文简要介绍了搭建 EMQX 服务器实现基于 MQTT 协议远程控制 NodeMCU ESP8266 板载 LED 的解决方案。

简介

1. MQTT

[MQTT] (Message Queuing Telemetry Transport)是一种基于 publish/subscribe (发布/订阅) 模式的 轻量级 通讯协议,构建于 TCP/IP 协议上,由 IBM 在1999年发布。

image.png

MQTT 可以实现用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务 。

2. EMQX

[EMQX] 是一款大规模分布式物联网 MQTT 服务器,单集群支持 1 亿物联网设备连接,消息分发时延低于 1 毫秒。为高可靠、高性能的物联网实时数据移动、处理和集成提供动力。

3. Home Assistant

[Home Assistant] (HA) 家庭助理,是一款基于 Python智能家居开源系统,可以方便地连接各种外部设备,支持众多品牌智能家居设备。

方案

安装 Home Assistant

**使用 **[Docker]容器安装 [Home Assistant] ,

  1. **下载 **[Docker] 软件;
  2. **C 盘根目录新建文件夹 **homeassistant
  3. **下载部署文件 **[GitHub] 并解压得到 docker-compose.yml 保存至上述 homeassistant 文件夹;
  4. **Windows 打开 **命令提示符Windows PowerShell,输入如下代码实现自动下载镜像
cd C:homeassistant
docker-compose.yml
docker-compose up
  1. 安装过程需大约 30 分钟,即可在 Docker 容器中创建 Home Assistant 镜像;
  2. **自动从镜像安装 Home Assistant 到容器。代码文件 **docker-compose.yml 将映射 Home Assistant 配置文件到 C:/homeassistant 文件夹;
  3. **浏览器输入网址 **http://localhost:8123/ 进入Home Assistant 主界面,创建智能家居账号。

详见: [How to run Home Assistant Container on Windows using Docker - Kiril Peyanski's Blog] .

安装 EMQX

**使用 EMQX 最简单的方式是在 **[EMQX Cloud]上创建完全托管的 MQTT 服务。

这里我们使用 Docker 运行 EMQX

Windows 命令行或 PowerShell 输入并执行如下代码

docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:latest

等待进度条下载和部署完成(大约5分钟),即可获得 EMQX 服务器。

**Docker 内的 **localhost127.0.0.1 指向的是容器内部地址,如需访问宿主机地址请使用宿主机的真实 IP .

详见: [Gitee] .

配置 EMQX

**(1)浏览器打开网址 **http://localhost:18083/ ,初始登录账户名 admin 密码 public

**(2)依次打开 **访问控制 - 客户端认证 - 创建 - Password-Based - 内置数据库 - (默认配置)- 创建

(3)用户管理 - 新建用户 - 自定义用户名和密码(建议 admin).

连接 EMQX 与 HA

**(1)命令行或 PowerShell 输入 **ipconfig 获取本地计算机 IPv4 地址,如 42.34.25.153

(2)配置 Home Assistant ,依次点击设置 - 设备与服务 - 添加集成 - 搜索 MQTT - 填写代理信息

代理栏输入计算机 IP 地址,端口 1883,用户名和密码为 EMQX 中创建的用户信息。

**(3)点击 **提交 后显示 成功创建 MQTT ,此时 集成 选项下出现 MQTT 条目,EMQX 网页 集群总连接数在线连接数0 变为 1,表明 MQTT 设备已连接。

参考: [MQTT 接入 Home Assistant] .

连接 ESP8266 与 EMQX

将如下代码下载至 ESP8266 开发板,

需要注意 MQTT 服务器地址,若是 EMQX Cloud,则根据创建远程节点填写地址;若是本地计算机或Docker容器,则填写本地物理 IP 地址。

主题为 MQTTX 客户端定义的订阅名称,客户名和密码则对应 EMQX 服务器客户端用户定义。

#include < ESP8266WiFi.h >
#include < PubSubClient.h >#define LED 2 // on-board LED D4// WiFi
const char *ssid = "xxx"; // Enter your WiFi name
const char *password = "xxxxxx";  // Enter WiFi password// MQTT Broker
const char *mqtt_broker = "xx.xx.xx.xx"; // EMQX Server IP
const char *topic = "emqx/esp8266"; // MQTTX topic
const char *mqtt_username = "UART"; // EMQX Server User Name
const char *mqtt_password = "123456"; //EMQX Server User Password
const int mqtt_port = 1883;
​
bool ledState = false;
​
WiFiClient espClient;
PubSubClient client(espClient);
​
void setup() {
    // Set software serial baud to 115200;
    Serial.begin(115200);
    delay(1000); // Delay for stability// Connecting to a WiFi network
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.println("Connecting to WiFi...");
    }
    Serial.println("Connected to the WiFi network");
​
    // Setting LED pin as output
    pinMode(LED, OUTPUT);
    digitalWrite(LED, LOW);  // Turn off the LED initially// Connecting to an MQTT broker
    client.setServer(mqtt_broker, mqtt_port);
    client.setCallback(callback);
    while (!client.connected()) {
        String client_id = "esp8266-client-";
        client_id += String(WiFi.macAddress());
        Serial.printf("The client %s connects to the public MQTT brokern", client_id.c_str());
        if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
            Serial.println("Public EMQX MQTT broker connected");
        } else {
            Serial.print("Failed with state ");
            Serial.print(client.state());
            delay(2000);
        }
    }
​
    // Publish and subscribe
    client.publish(topic, "hello emqx");
    client.subscribe(topic);
}
​
void callback(char *topic, byte *payload, unsigned int length) {
    Serial.print("Message arrived in topic: ");
    Serial.println(topic);
    Serial.print("Message: ");
    String message;
    for (int i = 0; i < length; i++) {
        message += (char) payload[i];  // Convert *byte to string
    }
    Serial.print(message);
    if (message == "on" && !ledState) {
        digitalWrite(LED, LOW);  // Turn on the LED
        ledState = true;
    }
    if (message == "off" && ledState) {
        digitalWrite(LED, HIGH); // Turn off the LED
        ledState = false;
    }
    Serial.println();
    Serial.println("-----------------------");
}
​
void loop() {
    client.loop();
    delay(100); // Delay for a short period in each loop iteration
}

测试

在 MQTTX 客户端向目标主题发送控制文本 onoff 以控制板载 LED

image.png

**注意发送文本格式选项更改为 **Plaintext .

Arduino IDE 的串口助手监控可以观察到反馈信息

image.png

**与 MQTTX 客户端操作类似,在 HomeAssistant 的 **MQTT 设置 中向目标主题发送消息,即可控制 LED 的亮灭

image.png

参考: [ESP8266 + MQTT :如何实现 LED 灯的远程控制 | EMQ (emqx.com)]

视频展示

总结

**完成该项目的关键在于环境搭建,即 **HomeAssistantEMQX 服务器的安装,由于是在 Windows 操作系统环境下,需要将其安装于 Docker 容器中运行,而 Docker 软件通过检索实现镜像安装需要科学上网,因此环境搭建是关键。

**此外,该项目可进行扩展连接智能家居平台 ** HomeAssistant ,同样安装于 Docker 容器,只需要进行 MQTT 配置即可实现开关可视化和 APP 远程 LED 控制,参考[文章],具体操作如下

**修改 HA 配置文件 **configuration.yaml 添加如下代码,实现 LED 开关的界面可视化

# add light
mqtt:
  light:
    # Device name
    - name: "On-board LED"
    # State topic
      state_topic: "emqx/esp8266"
    # Command topic
      command_topic: "emqx/esp8266"
    # Command type
      payload_on: "on"
      payload_off: "off"
    # unique_ID
      unique_id: "on-board LED"
    # optimistic set
      optimistic: false

配置文件 configuration.yaml 的路径根据 HA 安装位置确定

保存配置文件后,在 开发者工具 中点击 所有 YAML 配置 实现重载配置文件,效果如下

image.png

点击开关按钮即可实现 NodeMCU-ESP8266 板载 LED 的亮灭控制。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    242

    文章

    23252

    浏览量

    660595
  • 物联网
    +关注

    关注

    2909

    文章

    44567

    浏览量

    372809
  • 远程控制
    +关注

    关注

    4

    文章

    627

    浏览量

    34922
  • Arduino
    +关注

    关注

    188

    文章

    6469

    浏览量

    186958
  • ESP8266
    +关注

    关注

    50

    文章

    962

    浏览量

    44965
  • MQTT协议
    +关注

    关注

    0

    文章

    97

    浏览量

    5362
收藏 人收藏

    评论

    相关推荐

    远程控制通讯--基于Arduino + ESP8266控制LED

    Arduino是许多智能硬件爱好者的首选,使用简单快捷,而ESP8266模块也是当前最为热门的WIFI模块。本项目完成了Arduino使用EDP协议通过ESP8266 WIFI模块接入
    的头像 发表于 02-27 09:10 4w次阅读
    <b class='flag-5'>远程控制</b>通讯--基于Arduino + <b class='flag-5'>ESP8266</b><b class='flag-5'>控制</b><b class='flag-5'>LED</b>灯

    ESP8266 通过 MQTT 协议实现 LED远程控制

    MQTT协议
    jf_07365693
    发布于 :2024年09月25日 16:05:05

    ESP8266模块想实现手机远程控制

    arduino开发板,ESP8266WiFi模块想实现手机远程控制,哪位大神有这方面的经验资料,帮忙发一份吧,拜求
    发表于 05-08 17:50

    如何实现esp8266开发用按钮远程控制

    想要在安卓系统上做个界面,界面上有按钮,比如按钮按下去之后可以远程控制esp8266WIFI模块给单片机发消息,然后单片机控制电机转,要实现这样的功能该怎么做啊
    发表于 07-22 04:32

    如何使用EDP协议通过ESP8266 WIFI模块接入OneNET服务器来实现远程控制LED灯?

    本项目完成了Arduino使用EDP协议通过ESP8266 WIFI模块接入OneNET服务器,并通过在接入设备中创建的应用来实现
    发表于 06-16 08:29

    请问esp8266如何通过mqtt协议建立连接实现小车的远程控制

    请问esp8266如何通过mqtt协议建立连接实现小车的远程控制
    发表于 11-01 06:32

    如何利用STM32+ESP8266实现远程控制LED

    如何利用STM32+ESP8266实现远程控制LED呢?有哪些基本步骤?
    发表于 12-08 07:26

    ESP8266远程控制开关的方法分享

    ESP8266远程控制开关示例超全面详细1 背景描述ESP8266模块是比较标准方便的wifi开发模块,把他当做为单片机,有输入输出引脚和操作指令、内存,就是一个计算机了。引脚收发接口可做串口通讯
    发表于 02-28 14:34

    ESP8266通过MQTT订阅主题并推送数据到ONENET

    ESP8266-12E/F 固件下载:http://www.micropython.org/download#esp8266 源代码仓库:ESP8266_MQTT_OneNet 【最新】 请移步
    发表于 12-04 19:03 31次下载
    <b class='flag-5'>ESP8266</b><b class='flag-5'>通过</b><b class='flag-5'>MQTT</b>订阅主题并推送数据到ONENET

    ESP8266制作能通过手机远程控制的智能插座

    ESP8266制作智能插座!手机远程控制,让家电疯狂起来~
    的头像 发表于 06-04 06:26 6792次阅读

    实现微信小程序和手机app远程控制51单片机控制L298N电机驱动器控制马达(ESP8266 AT89S52 http请求转串口通信系统

    实现微信小程序和手机app远程控制51单片机控制L298N电机驱动器控制马达(ESP8266 AT89S52 http请求转串口通信系统
    发表于 11-23 16:51 27次下载
    <b class='flag-5'>实现</b>微信小程序和手机app<b class='flag-5'>远程控制</b>51单片机<b class='flag-5'>控制</b>L298N电机驱动器<b class='flag-5'>控制</b>马达(<b class='flag-5'>ESP8266</b> AT89S52 http请求转串口通信系统

    HC05-ESP8266实现控制LED的闪烁

    蓝牙设备是不可或缺的一部分,在这里我们将用HC05-ESP8266实现控制LED的闪烁在本篇文章中,将HC-05蓝牙模块与流行的Wi-Fi模块ESP
    发表于 11-23 18:06 1次下载
    HC05-<b class='flag-5'>ESP8266</b><b class='flag-5'>实现</b><b class='flag-5'>控制</b><b class='flag-5'>LED</b>的闪烁

    ESP8266通过MQTT协议连接ONENET

    将介绍通过MQTT协议连接ONENET,实现ESP8266与ONENET平台数据交互一、设计目标实现
    发表于 01-12 19:58 53次下载
    <b class='flag-5'>ESP8266</b><b class='flag-5'>通过</b><b class='flag-5'>MQTT</b><b class='flag-5'>协议</b>连接ONENET

    STM32 + ESP8266 + MQTT协议连接OneNet

    STM32+ESP8266使用标准MQTT协议登录Onenet服务器,实现数据交互。
    的头像 发表于 02-28 13:22 1.9w次阅读
    STM32 + <b class='flag-5'>ESP8266</b> + <b class='flag-5'>MQTT</b><b class='flag-5'>协议</b>连接OneNet

    ESP8266接入小爱同学—智能LED台灯或风扇(利用继电器)

    实现应用程序在局域网内升级,解除数据线限制 3.通过MQTT协议实现摆脱局域网限制的远程控制
    发表于 05-04 11:37 1次下载
    <b class='flag-5'>ESP8266</b>接入小爱同学—智能<b class='flag-5'>LED</b>台灯或风扇(利用继电器)