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物联网开发!如有疑问欢迎在评论区留言讨论。

相关推荐
亿道电子Emdoor12 小时前
【Arm】MDK查看语句的执行累积时间和次数
stm32·单片机·物联网
Tel1992530800412 小时前
CCD相机同步外触发拍照抓拍识别高速脉冲计数器信号采集模块
单片机·数码相机·物联网·自动化·工业自动化·仪器仪表
l3538o6757313 小时前
国产POE降压恒压芯片方案选型:48v-52v输入转5v-12v/1-3A电源芯片
人工智能·科技·单片机·嵌入式硬件·电脑·智能家居
JSMSEMI1113 小时前
SC6D10170H-JSM 碳化硅肖特基二极管
stm32·单片机·嵌入式硬件
乐迪信息13 小时前
乐迪信息:AI摄像机识别煤矿出入井车辆数量异常检测
大数据·运维·人工智能·物联网·安全
Wpa.wk13 小时前
硬件环境配置-两台电脑进行局域网构建
物联网·microsoft·电脑·信息与通信·局域网构建
盈创力和200713 小时前
工业物联网下的智能安全防线:基于以太网的多参量传感器设计与应用
物联网·气体传感器·以太网多参量传感器·智能环境监测终端·双气体模组·三十四种组合可定制
点灯小铭14 小时前
基于单片机的智能传送带自动计数与数据管理系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
anghost15014 小时前
基于 STM32 的湖泊水位报警系统设计
stm32·嵌入式硬件·数据挖掘
珠海西格电力14 小时前
零碳园区边缘计算节点规划:数字底座的硬件部署与能耗控制方案
运维·人工智能·物联网·能源·边缘计算