使用MQTT实现ESP8266开发板数据交互
创作时间:
作者:
@小白创作中心
使用MQTT实现ESP8266开发板数据交互
引用
CSDN
1.
https://m.blog.csdn.net/weixin_48895167/article/details/143367415
本文将介绍如何使用MQTT协议实现ESP8266开发板与传感器的数据交互。通过温湿度传感器、水位传感器和继电器的组合,可以构建一个功能丰富的物联网应用。
硬件准备工作
- ESP8266开发板
- 温湿度传感器(DHT11)
- 水位传感器
- 继电器模块
接线工作
- 水位传感器接线:
- ESP8266的3V接水位检测模块的“+”
- GND接“-”
- A0接“S”
- 温湿度传感器接线:
- ESP8266的D4接温湿度传感器的“DATA”
- GND对“G”
- VCC对"3V"
- 继电器模块接线:
- 继电器的GND连接esp8266的G
- 继电器In1连接esp8266的D1
- Vcc接3V
软件准备工作
- Arduino IDE(用于编写C代码)
- IntelliJ IDEA(用于编写Java代码,JDK版本>=1.8)
- MQTT服务器(下载地址:https://www.emqx.io/downloads)
代码实现
首先需要在ESP8266板子上写入通信协议,比如MQTT、TCP、UDP等,根据需求选择。
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <ArduinoJson.h>
// WiFi配置
const char* ssid = "wifi名称";
const char* password = "wifi密码";
const char* mqtt_server = "mqtt服务器地址";
// DHT11传感器配置
#define DHTPIN 2
#define DHTTYPE DHT11
// 水位传感器配置
#define WATER_LEVEL_PIN A0
// 继电器配置
#define RELAY_PIN_1 5
#define RELAY_PIN_2 4
bool relay1State = false;
bool relay2State = false;
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
int value = 0;
// DHT传感器对象
DHT dht(DHTPIN, DHTTYPE);
// 继电器状态标志
bool relayState = false;
void setup() {
// 设置双路继电器引脚为输出模式
pinMode(RELAY_PIN_1, OUTPUT);
pinMode(RELAY_PIN_2, OUTPUT);
// 初始状态下关闭双路继电器
digitalWrite(RELAY_PIN_1, HIGH);
digitalWrite(RELAY_PIN_2, HIGH);
Serial.begin(115200);
setup_wifi();
// 设置MQTT服务器地址和端口,并设置回调函数
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
// 初始化DHT11传感器
dht.begin();
}
void setup_wifi() {
delay(10);
// 开始连接到指定的WiFi网络
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
// 循环等待直到连接到WiFi
while (WiFi.status()!= WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
// MQTT消息回调函数
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++) {
Serial.print((char)payload[i]);
Serial.print(" (ASCII: ");
Serial.print((int)payload[i]);
Serial.println(")");
}
Serial.println();
// 正确的声明位置
char* charPayload = new char[length + 1];
for (int i = 0; i < length; i++) {
charPayload[i] = (char)payload[i];
}
charPayload[length] = '\0';
// 如果消息第一个字符是'1',打开内置LED
if ((char)payload[0] == '1') {
digitalWrite(BUILTIN_LED, LOW); // Turn the LED on
}
else {
digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off
}
// 检查是否是控制继电器的消息
if (strcmp(topic, "relay_topic") == 0) {
// 控制第一路继电器
if (strcmp(charPayload, "relay1_on") == 0) {
digitalWrite(RELAY_PIN_1, LOW);
relay1State = true;
Serial.println("Relay 1 is turned on");
} else if (strcmp(charPayload, "relay1_off") == 0) {
digitalWrite(RELAY_PIN_1, HIGH);
relay1State = false;
Serial.println("Relay 1 is turned off");
}
// 控制第二路继电器
if (strcmp(charPayload, "relay2_on") == 0) {
digitalWrite(RELAY_PIN_2, LOW);
relay2State = true;
Serial.println("Relay 2 is turned on");
} else if (strcmp(charPayload, "relay2_off") == 0) {
digitalWrite(RELAY_PIN_2, HIGH);
relay2State = false;
Serial.println("Relay 2 is turned off");
}
}
delete[] charPayload;
}
void reconnect() {
// 循环直到重新连接到MQTT服务器
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// 尝试连接到MQTT服务器
if (client.connect("ESP8266Client")) {
Serial.println("connected");
// 连接成功后,发布一条消息并订阅相关主题
client.publish("outTopic", "hello world");
client.subscribe("relay_topic");
// 重新发布继电器状态(示例)
if (relayState) {
client.publish("relay_status", "relay_on");
}
else {
client.publish("relay_status", "relay_off");
}
}
else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// 等待5秒后重试连接
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 2500) {
lastMsg = now;
++value;
// 获取温湿度数据
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
if (!isnan(humidity) && !isnan(temperature)) {
// 创建一个JSON文档对象,用于构建JSON数据
StaticJsonDocument<200> jsonDoc;
jsonDoc["temperature"] = temperature;
jsonDoc["humidity"] = humidity;
// 获取水位传感器数据并转换为百分比
int waterLevelRaw = analogRead(WATER_LEVEL_PIN);
int waterLevelPercentage = (waterLevelRaw * 100) / 1024;
jsonDoc["waterLevelPercentage"] = waterLevelPercentage;
// 分配足够的空间来存储JSON字符串
char jsonMsg[200];
serializeJson(jsonDoc, jsonMsg);
Serial.print("Publish JSON message: ");
Serial.println(jsonMsg);
// 发布JSON格式的温湿度和水位百分比数据到MQTT主题
client.publish("sensor/temperature_humidity_waterlevel", jsonMsg);
}
}
}
运行步骤
- 使用USB线将电脑与ESP8266开发板连接,确保供电和下载功能正常。
- 将上述代码烧录到ESP8266开发板中。
- 启动MQTT服务器(如EMQX),默认访问地址为http://127.0.0.1:18083/,默认账号密码为admin/public。
- 在MQTT客户端中订阅
sensor/temperature_humidity_waterlevel
主题,即可接收温湿度和水位数据。 - 若要控制继电器,向
relay_topic
主题发送relay1_on
或relay1_off
等指令。
热门推荐
出国劳务打工需要具备哪些条件?
神经性皮炎在头上怎么治疗
数字的五行属性查询表从1到10
钛合金与不锈钢:性能对比与应用选择
滥竽充数的主人公是谁?——探究南郭先生关于吹竽的故事
看“花”眼了!2024版大连追花日历来了
本田CR-V离地间隙实测:两驱198mm,四驱208mm
从宫廷到街头,一口咬下冰糖葫芦的千年故事
在 macOS 上编译 OpenJDK:从零开始的完整指南
今年的中秋静悄悄,月饼为何卖不动了?告诉大家背后的现实原因
探索酸面包:传统发酵的艺术
上海大学新校区的建设项目获得批准,他一晚没睡着
海绵城市在校园的实践,打造可持续发展的绿色空间
紫菜有保质期吗?紫菜放多久会“变质”?
山姜的五大药用价值
应收据的定义是什么?应收据在财务管理中有何作用?
乌克兰全面战争三周年:人道需求持续攀升,儿童承受深重苦难
泰山和杭州普陀山一日游攻略:看日出日落、品美食、赏文化
使用MHDD教程(掌握MHDD工具,轻松修复硬盘故障)
希金斯获2025斯诺克世界公开赛冠军
太湖三白:白鱼、银鱼和白虾的美食文化
PCR实验室中污染的预防与控制
守护肿瘤患者的生命线之PICC
农村自建房一楼防潮的最佳方法
张锡纯的名方,滋补气血不上火,脾虚气血不足的人,冬天越吃越“养人”
大连赏樱花的地方有哪些
香菇炒青菜(干香菇版)的做法
幽门螺旋杆菌抽血和吹气哪个好?医生专业解析
第五人格木偶师背景故事是什么?第五人格木偶师背景故事介绍
瑞香:品种特性与药用价值全解析