ESP8266 实际应用
发送部分
// 原来
sprintf(buffer, "%s%02d%02d%02d%02d%02d", "T", Temperature, Humidity, smoke, Light, soil);
printf("%s", buffer); // 加 \r\n 表示一条指令传输完毕
sprintf(buffer, "%s%02d%02d%02d%02d%02d\r\n", "T", Temperature, Humidity, smoke, Light, soil);
printf("%s", buffer);
接收指令
X11 = 切换模式
A11=开风扇 A22=关风扇
B11=开灯 B22=关灯
C11=开水泵 C22=关水泵
D11=开报警 D22=关报警
代码实现

esp8266代码
#include <ESP8266WiFi.h>
#include <PubSubClient.h>const char* WIFI_SSID = "???";
const char* WIFI_PASSWORD = "???????????";
const char* MQTT_SERVER = "???????";
const int MQTT_PORT = 1883;
const char* MQTT_CLIENTID = "?????";
const char* MQTT_SUB_TOP = "test/chat1"; // 订阅(下发指令)
const char* MQTT_PUB_TOP = "test/chat2"; // 发布(上传数据)WiFiClient espClient;
PubSubClient client(espClient);// MQTT收到消息 → 转发给单片机
void callback(char* topic, byte* payload, unsigned int length) {for (int i = 0; i < length; i++) {Serial.write((char)payload[i]);}Serial.write('\r');Serial.write('\n');
}void reconnect() {while (!client.connected()) {if (client.connect(MQTT_CLIENTID)) {client.subscribe(MQTT_SUB_TOP);} else {delay(5000);}}
}void setup() {Serial.begin(115200); // 与单片机同波特率WiFi.begin(WIFI_SSID, WIFI_PASSWORD);while (WiFi.status() != WL_CONNECTED) delay(500);client.setServer(MQTT_SERVER, MQTT_PORT);client.setCallback(callback);
}void loop() {if (WiFi.status() != WL_CONNECTED) {WiFi.reconnect();delay(3000);return;}if (!client.connected()) reconnect();client.loop();// 单片机发来数据 → 上传 MQTTif (Serial.available()) {String data = Serial.readStringUntil('\n');if (data.length() > 3) {client.publish(MQTT_PUB_TOP, data.c_str());}}
}
| 单片机 | ESP8266 |
|---|---|
| 3.3V | 3.3V |
| GND | GND |
| TX | RX |
| RX | TX |

