ESP8266 实际应用

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=关报警

代码实现

image-20260505180114451

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();

  // 单片机发来数据 → 上传 MQTT
  if (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

image-20260505180413125

posted @ 2026-05-05 18:19  Q&25  阅读(10)  评论(0)    收藏  举报