ESP8266 + MQTT实现远程控制LED灯 - 知乎

上一篇介绍了如何安装MQTT:

张业生:阿里云上安装Mosquitto6 赞同 · 1 评论文章

这里将介绍如何通过MQTT来控制ESP8266(NodeMCU v1.0)。

材料准备:

  • ESP8266芯片开发板一块(NodeMCU / Wemos等带wifi的都可以)
  • led灯一个
  • 杜邦线若干
  • 2.4GHz无线局域网

1、原理解析

手机/电脑推送一个消息到MQTT,ESP8266订阅了相应的消息,接着就可以解析消息并做出对应的响应行为。

2、例子

接下来实现一个简单的应用,通过手机控制LED灯的开与关。

之前有简单介绍阿里云上安装Mosquitto,如果没有服务器也可以在本地机器进行安装。

// mqtt + esp8266
#include <EEPROM.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_INA219.h>

const char* ssid = "your_wifi_name";  // wifi名称
const char* password = "your_wifi_password"; // wifi密码
const char* mqtt_server = "your_mqtt_server";  // mqtt服务器地址,如本地ip192.168.31.22
 
WiFiClient espClient;
PubSubClient client(espClient);
 
const byte ledPin = D4; // 需要控制的led灯
 
void callback(char* topic, byte* payload, unsigned int length) {
 Serial.print("Message arrived [");
 Serial.print(topic);
 Serial.print("] ");

 for (int i=0;i<length;i++) {
  char receivedChar = (char)payload[i];
  Serial.print(receivedChar); // 打印mqtt接收到消息

  if (receivedChar == '1') {  // 收到消息是 '1' 点亮LED灯
    digitalWrite(ledPin, HIGH);
  }
  if (receivedChar == '0')    // 收到消息是 '0' 关闭LED灯
   digitalWrite(ledPin, LOW);
  }
  Serial.println();
}
 
 
void reconnect() {
 while (!client.connected()) {
   Serial.print("Attempting MQTT connection...");
   if (client.connect("ESP8266 Client")) {
    Serial.println("connected");
    client.subscribe("ledStatus");  // 订阅 'ledStatus' 这个topic
   } else {
     Serial.print("failed, rc=");
     Serial.print(client.state());
     Serial.println(" try again in 5 seconds");
     delay(5000);
   }
 }
}
 
void setup()
{
 Serial.begin(9600);
 
 client.setServer(mqtt_server, 1883); // 连接mqtt
 client.setCallback(callback);        // 设置回调,控制led灯
 
 pinMode(ledPin, OUTPUT);
}
 
void loop()
{
 if (!client.connected()) {
  reconnect();
 }
 client.loop();
}

3、测试

开启MQTT服务,把上面程序烧录到ESP8266。

开启一个终端用于发送MQTT消息:

// 打开led灯
$ mosquitto_pub -h your_mqtt_ip -d -t ledStatus -m 1
// your_mqtt_ip换成自己的mqtt服务器ip
// 如果有用户名和密码,加上 -u userName -P password进行连接

// 关闭led灯
$ mosquitto_pub -h your_mqtt_ip -d -t ledStatus -m 0

最终效果:

00:00

/ 00:13

下载

播放速度

画中画

视频信息

镜像画面

循环播放

[X]

DeviceId

:

web_644411697706BF12

PlayerVersion

:

1.0.27

SessionId

:

3e346221-92ad-4181-960e-f4bac55ec09f

StreamHost

:

vdn6.vzuu.com

Res

:

mse mp4 h264 720x1280@25.00

Color

:

(tv bt709)

Codec

:

avc1.4d401f/mp4a.40.5

Frames

:

0/0 4/0

VideoBuffered

:

13520 ms

AudioBuffered

:

13491 ms

Speed

:

0.00 KB/s

TotalReceive

:

3459.35 KB

GPU

:

ANGLE (Intel, Intel(R) Iris(R) Xe Graphics Direct3D11 vs_5_0 ps_5_0, D3D11)

播放 (k)

00:00 / 00:13

倍速

2.0x1.5x1.25x1.0x0.75x0.5x

高清

高清 720P清晰 480P

画中画 (p)

网页全屏 (t)

全屏 (f)

00:13

现在的效果是通过终端进行控制,易用性是很差的;可以通过python、nodejs等语言做一个简易的客户端或者直接做一个小程序进行控制,这样就很好使用了。

Wi-Fi名称密码的变更这个情况没有集成到例子中,可以参考:

https://github.com/tzapu/WiFiManager​github.com/tzapu/WiFiManager

代码地址: https://github.com/CNBlackJ/iot-lesson/blob/master/esp8266/mqtt.cpp


原网址: 访问
创建于: 2023-10-08 11:02:33
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论