5.4 ESP32物联网开发实战教学:三大项目详解

  • 智能家居控制系统(手机控制灯光、风扇)
  • 环境监测系统(温湿度、光照数据上传)
  • 远程数据采集系统(传感器数据实时监控)

本文将基于Arduino框架,通过三个完整项目手把手教你使用ESP32开发物联网应用。每个代码块都包含详细注释说明,适合0基础开发者学习。


一、开发环境搭建

1.1 所需硬件

  • ESP32开发板

  • DHT11温湿度传感器

  • 光敏电阻模块

  • LED灯及继电器模块

  • 杜邦线若干

  • 5V电源适配器

1.2 软件准备

  1. Arduino IDE安装

  2. 添加ESP32开发板支持

    • 文件 > 首选项 > 附加开发板管理器URL添加:
      https://dl.espressif.com/dl/package_esp32_index.json
  3. 安装必要库:

    • 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 核心函数解析

  1. setup_wifi():

    • 使用WiFi.begin()启动WiFi连接

    • 循环检测连接状态,使用WiFi.status()返回连接状态

  2. callback():

    • MQTT消息到达时自动触发

    • 使用digitalWrite()控制GPIO输出电平

    • 字符串比较使用==运算符重载

  3. 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 关键技术点

  1. analogReadResolution(12):

    • 设置ADC分辨率为12位(0-4095)
  2. map()函数:

    • 线性映射原始值到百分比范围
  3. 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 功能扩展建议

  1. 添加历史数据存储

  2. 实现用户身份验证

  3. 增加自动报警功能

  4. 开发手机APP控制界面


五、项目集成与优化

5.1 综合接线图

复制代码
           +---------------+
           |     ESP32     |
           +-------+-------+
                   |
           +-------+-------+
           |   3.3V/5V    |
           +---------------+
           |               |
DHT11数据---GPIO4           |
光敏电阻---GPIO34          |
LED控制---GPIO5            |
继电器控制---GPIO23         |
           +---------------+

5.2 常见问题解决

  1. WiFi连接失败:

    • 检查SSID/密码是否正确

    • 尝试重启路由器

  2. MQTT连接不稳定:

    • 检查broker地址和端口

    • 增加心跳间隔client.setKeepAlive(60)

  3. 传感器读数异常:

    • 检查电源电压是否稳定

    • 添加软件滤波算法


六、项目总结

通过这三个项目的实践,我们已经掌握了:

  • ESP32 GPIO控制

  • 传感器数据采集

  • WiFi/MQTT通信

  • Web服务器开发

下一步可以尝试:

  1. 接入更多类型传感器

  2. 使用SSL加密通信

  3. 部署私有MQTT服务器

  4. 开发微信小程序控制端

建议在正式部署时:

  1. 使用EEPROM存储WiFi配置

  2. 实现OTA无线升级

  3. 添加看门狗定时器

  4. 采用深睡眠模式节能

希望本教程能帮助您快速入门ESP32物联网开发!如有疑问欢迎在评论区留言讨论。

相关推荐
CODECOLLECT14 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen14 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
acrelwwj16 小时前
智慧照明新引擎,ASL600 4GWJ开启城市照明精细化管理新时代
大数据·经验分享·物联网
全栈游侠17 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
Lsir10110_17 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
深圳市九鼎创展科技19 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计19 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
小龙报21 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业21 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件
Industio_触觉智能21 小时前
瑞芯微RK3566开发板规格书,详细参数配置,型号EVB3566-V1,基于RK3566核心板SOM3566邮票孔封装
嵌入式硬件·开发板·rk3568·rk3566·核心板·瑞芯微