- 智能家居控制系统(手机控制灯光、风扇)
- 环境监测系统(温湿度、光照数据上传)
- 远程数据采集系统(传感器数据实时监控)
本文将基于Arduino框架,通过三个完整项目手把手教你使用ESP32开发物联网应用。每个代码块都包含详细注释说明,适合0基础开发者学习。
一、开发环境搭建
1.1 所需硬件
-
ESP32开发板
-
DHT11温湿度传感器
-
光敏电阻模块
-
LED灯及继电器模块
-
杜邦线若干
-
5V电源适配器
1.2 软件准备
-
Arduino IDE安装
-
添加ESP32开发板支持
- 文件 > 首选项 > 附加开发板管理器URL添加:
https://dl.espressif.com/dl/package_esp32_index.json
- 文件 > 首选项 > 附加开发板管理器URL添加:
-
安装必要库:
-
PubSubClient(MQTT通信)
-
DHT sensor library
-
ArduinoJson
-
二、智能家居控制系统
2.1 硬件连接
元件 | ESP32引脚 |
---|---|
LED灯 | GPIO5 |
继电器 | GPIO23 |
2.2 完整代码
cpp
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "Your_WiFi_SSID";
const char* password = "Your_WiFi_Password";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
delay(10);
Serial.println("Connecting to " + String(ssid));
WiFi.begin(ssid, password); // 启动WiFi连接
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
}
void callback(char* topic, byte* payload, unsigned int length) {
String message;
for (int i=0; i<length; i++) {
message += (char)payload[i]; // 将字节数组转换为字符串
}
if(String(topic) == "home/light"){
digitalWrite(5, message == "ON" ? HIGH : LOW); // 控制GPIO5电平
}
else if(String(topic) == "home/fan"){
digitalWrite(23, message == "ON" ? HIGH : LOW); // 控制GPIO23电平
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client")) { // 客户端ID必须唯一
client.subscribe("home/light"); // 订阅灯光控制主题
client.subscribe("home/fan"); // 订阅风扇控制主题
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" retrying in 5s");
delay(5000);
}
}
}
void setup() {
pinMode(5, OUTPUT); // 初始化GPIO5为输出模式
pinMode(23, OUTPUT); // 初始化GPIO23为输出模式
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883); // 设置MQTT服务器端口
client.setCallback(callback); // 设置消息回调函数
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop(); // 维持MQTT连接
}
2.3 核心函数解析
-
setup_wifi()
:-
使用
WiFi.begin()
启动WiFi连接 -
循环检测连接状态,使用
WiFi.status()
返回连接状态
-
-
callback()
:-
MQTT消息到达时自动触发
-
使用
digitalWrite()
控制GPIO输出电平 -
字符串比较使用
==
运算符重载
-
-
reconnect()
:-
使用
client.connect()
建立MQTT连接 -
client.subscribe()
订阅指定主题
-
三、环境监测系统
3.1 硬件连接
传感器 | ESP32引脚 |
---|---|
DHT11 | GPIO4 |
光敏电阻 | GPIO34 |
3.2 数据上报代码
cpp
#include <DHT.h>
#define DHT_PIN 4
#define DHT_TYPE DHT11
DHT dht(DHT_PIN, DHT_TYPE);
void readSensors(){
float humidity = dht.readHumidity(); // 读取湿度数据
float temperature = dht.readTemperature(); // 读取温度(摄氏度)
int lightRaw = analogRead(34); // 读取模拟量光照值
float lightPercent = map(lightRaw, 0, 4095, 0, 100); // 转换为百分比
if (isnan(humidity) || isnan(temperature)) {
Serial.println("DHT读取失败!");
return;
}
String payload = "{";
payload += "\"temp\":" + String(temperature) + ",";
payload += "\"humi\":" + String(humidity) + ",";
payload += "\"light\":" + String(lightPercent);
payload += "}";
client.publish("env/data", payload.c_str()); // 发布JSON数据
}
void setup() {
// ...其他初始化代码...
dht.begin(); // 启动DHT传感器
analogReadResolution(12); // 设置ADC为12位精度
}
void loop() {
// ...维持MQTT连接...
static unsigned long lastMsg = 0;
if (millis() - lastMsg > 5000) { // 每5秒上报一次
readSensors();
lastMsg = millis();
}
}
3.3 关键技术点
-
analogReadResolution(12)
:- 设置ADC分辨率为12位(0-4095)
-
map()
函数:- 线性映射原始值到百分比范围
-
JSON数据构造:
- 使用字符串拼接生成标准JSON格式
四、远程数据采集系统
4.1 Web仪表盘实现
cpp
#include <WebServer.h>
WebServer server(80);
void handleRoot() {
String html = "<html><body>";
html += "<h1>实时环境数据</h1>";
html += "<p>温度: " + String(temperature) + "℃</p>";
html += "<p>湿度: " + String(humidity) + "%</p>";
html += "<p>光照: " + String(lightPercent) + "%</p>";
html += "</body></html>";
server.send(200, "text/html", html); // 返回HTML页面
}
void setup() {
// ...其他初始化...
server.on("/", handleRoot); // 注册根路径处理函数
server.begin(); // 启动Web服务器
}
void loop() {
server.handleClient(); // 处理HTTP请求
// ...其他循环代码...
}
4.2 功能扩展建议
-
添加历史数据存储
-
实现用户身份验证
-
增加自动报警功能
-
开发手机APP控制界面
五、项目集成与优化
5.1 综合接线图
+---------------+
| ESP32 |
+-------+-------+
|
+-------+-------+
| 3.3V/5V |
+---------------+
| |
DHT11数据---GPIO4 |
光敏电阻---GPIO34 |
LED控制---GPIO5 |
继电器控制---GPIO23 |
+---------------+
5.2 常见问题解决
-
WiFi连接失败:
-
检查SSID/密码是否正确
-
尝试重启路由器
-
-
MQTT连接不稳定:
-
检查broker地址和端口
-
增加心跳间隔
client.setKeepAlive(60)
-
-
传感器读数异常:
-
检查电源电压是否稳定
-
添加软件滤波算法
-
六、项目总结
通过这三个项目的实践,我们已经掌握了:
-
ESP32 GPIO控制
-
传感器数据采集
-
WiFi/MQTT通信
-
Web服务器开发
下一步可以尝试:
-
接入更多类型传感器
-
使用SSL加密通信
-
部署私有MQTT服务器
-
开发微信小程序控制端
建议在正式部署时:
使用EEPROM存储WiFi配置
实现OTA无线升级
添加看门狗定时器
采用深睡眠模式节能
希望本教程能帮助您快速入门ESP32物联网开发!如有疑问欢迎在评论区留言讨论。