硬件入门 + 单片机基础(第14天)综合通信实训
ESP32 物联网结业项目WiFi MQTT 继电器 温湿度 整合完整版项目说明这是物联网综合结业项目整合了你学过的所有核心技术WiFi 自动联网 断网重连MQTT 远程控制继电器开关DHT11 温湿度自动上报心跳包 消息防丢失 掉线自动重连公共 EMQX 服务器外网可远程控制一、硬件清单ESP32 开发板DHT11 温湿度传感器5V 继电器模块杜邦线接线DHT11 数据引脚 →GPIO4继电器 IN 引脚 →GPIO5共地、共 5V/3.3V二、完整代码直接上传可结业#include WiFi.h #include PubSubClient.h #include DHT.h #include DHT_U.h // 1. 基础配置必须修改 // WIFI 信息 const char* WIFI_SSID 你的WiFi名称; const char* WIFI_PASSWORD 你的WiFi密码; // MQTT 公共服务器EMQX 免费外网 const char* MQTT_BROKER broker.emqx.io; const int MQTT_PORT 1883; // 设备唯一ID防止重复 const char* MQTT_CLIENT_ID ESP32_IOT_Project_8866; // MQTT 主题远程控制 上报数据 #define SUB_TOPIC iot/esp32/relay/control // 订阅远程控制继电器 #define PUB_TEMP iot/esp32/sensor/temp // 发布温度 #define PUB_HUMI iot/esp32/sensor/humi // 发布湿度 #define PUB_HEART iot/esp32/heartbeat // 发布心跳包 // 2. 硬件引脚 #define DHT_PIN 4 // DHT11 数据脚 #define DHT_TYPE DHT11 #define RELAY_PIN 5 // 继电器控制脚 // 3. 全局对象 DHT dht(DHT_PIN, DHT_TYPE); WiFiClient espClient; PubSubClient client(espClient); // 定时任务 unsigned long lastSensorSend 0; // 温湿度上次上报时间 unsigned long lastHeartbeat 0; // 心跳上次发送时间 const long SENSOR_INTERVAL 5000; // 5秒上报一次 const long HEART_INTERVAL 10000; // 10秒心跳一次 // 设备状态 bool relayState false; // 4. WIFI 连接带重连 void setupWiFi() { Serial.println(正在连接 WiFi...); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); int retry 0; while (WiFi.status() ! WL_CONNECTED retry 20) { delay(500); Serial.print(.); retry; } if (WiFi.status() WL_CONNECTED) { Serial.println(\nWiFi 连接成功); Serial.print(IP: ); Serial.println(WiFi.localIP()); } else { Serial.println(\nWiFi 连接失败重启重试...); ESP.restart(); } } // 5. MQTT 消息回调接收远程指令 void callback(char* topic, byte* payload, unsigned int length) { Serial.print(收到指令); String cmd ; for (int i 0; i length; i) { cmd (char)payload[i]; } Serial.println(cmd); // 远程控制继电器 if (cmd ON) { relayState true; digitalWrite(RELAY_PIN, HIGH); Serial.println(✅ 继电器已打开); } else if (cmd OFF) { relayState false; digitalWrite(RELAY_PIN, LOW); Serial.println(❌ 继电器已关闭); } } // 6. MQTT 重连防掉线 void reconnectMQTT() { while (!client.connected()) { Serial.println(尝试连接 MQTT 服务器...); // 尝试连接 if (client.connect(MQTT_CLIENT_ID)) { Serial.println(MQTT 连接成功 ✅); client.subscribe(SUB_TOPIC); // 订阅控制主题 Serial.println(已订阅远程控制主题 String(SUB_TOPIC)); } else { Serial.print(失败原因); Serial.print(client.state()); Serial.println( 2秒后重试...); delay(2000); } } } // 7. 发送温湿度 void sendSensorData() { if (millis() - lastSensorSend SENSOR_INTERVAL) { lastSensorSend millis(); float temp dht.readTemperature(); float humi dht.readHumidity(); if (isnan(temp) || isnan(humi)) { Serial.println(DHT11 读取失败); return; } // 转字符串发送 String tempStr String(temp); String humiStr String(humi); client.publish(PUB_TEMP, tempStr.c_str()); client.publish(PUB_HUMI, humiStr.c_str()); Serial.print( 温度); Serial.print(temp); Serial.print( ℃ | 湿度); Serial.print(humi); Serial.println( %RH); } } // 8. 发送心跳包在线检测 void sendHeartbeat() { if (millis() - lastHeartbeat HEART_INTERVAL) { lastHeartbeat millis(); client.publish(PUB_HEART, ESP32 is online); Serial.println(❤️ 心跳已发送); } } // 9. 初始化 void setup() { Serial.begin(115200); // 硬件初始化 pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN, LOW); dht.begin(); // 网络初始化 setupWiFi(); // MQTT 初始化 client.setServer(MQTT_BROKER, MQTT_PORT); client.setCallback(callback); } // 10. 主循环 void loop() { // MQTT 断网自动重连 if (!client.connected()) { reconnectMQTT(); } // MQTT 必须运行的循环 client.loop(); // 定时上报温湿度 sendSensorData(); // 定时发送心跳 sendHeartbeat(); delay(100); }三、功能详解结业必备1. 整合功能WiFi 自动连接MQTT 远程控制继电器DHT11 温湿度定时上报外网远程控制EMQX 公共服务器2. 优化功能专业级WiFi 断网自动重连MQTT 掉线自动重连心跳包检测设备在线状态消息稳定不丢失DHT11 数据异常容错四、手机 / 电脑远程控制方法打开 EMQX 在线 MQTT 工具https://www.emqx.io/online-mqtt-client连接broker.emqx.io:1883订阅查看iot/esp32/sensor/tempiot/esp32/sensor/humiiot/esp32/heartbeat发布控制主题iot/esp32/relay/control消息ON/OFF五、本周结业目标✅ 完成物联网综合项目✅ 掌握WiFi MQTT 传感器 继电器✅ 实现外网远程控制 数据上传✅ 代码具备重连、心跳、防丢包工业级稳定性
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2622542.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!