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

相关推荐
无垠的广袤1 小时前
【萤火工场GD32VW553-IOT开发板】流水灯
c++·单片机·嵌入式硬件·物联网
深圳市尚想信息技术有限公司1 小时前
【深尚想!爱普特APT32F1023H8S6单片机重构智能电机控制新标杆】
单片机·嵌入式硬件
小灰灰搞电子3 小时前
STM32+腾讯物联网平台OTA升级详细教程
stm32·嵌入式硬件·物联网
小石(努力版)4 小时前
嵌入式STM32学习——ESP8266 01S的基础介绍
stm32·嵌入式硬件·学习
雪兽软件4 小时前
什么是物联网 (IoT):2024 年物联网概述
物联网
广州创科水利6 小时前
案例分享——福建洋柄水库大桥智慧桥梁安全监测
物联网·安全·数据分析·自动化
gower_dcg7 小时前
56 在standby待机打通uart调试的方法
单片机·嵌入式硬件
长流小哥8 小时前
STM32:深度解析RS-485总线与SP3485芯片
stm32·单片机·嵌入式硬件·keil5
国科安芯8 小时前
【AS32X601驱动系列教程】GPIO_点亮LED详解
单片机·嵌入式硬件
O。o.尊都假都8 小时前
STM32之温湿度传感器(DHT11)
stm32·单片机·嵌入式硬件