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 小时前
晶振PCB设计核心要点与规范
嵌入式硬件·硬件工程·智能硬件
whaosoft-1431 小时前
51c嵌入式~单片机~合集9
嵌入式硬件
夜月yeyue3 小时前
CCM/TCM在STM32中的含义和用途
stm32·单片机·嵌入式硬件
天波信息技术分享4 小时前
AI 边缘计算网关十大品牌
人工智能·物联网·边缘计算
学习和思考5 小时前
瑞芯微芯片算法开发初步实践
arm开发·人工智能·嵌入式硬件·深度学习·神经网络·算法
无脑学c++5 小时前
STM32printf重定向到串口含armcc和gcc两种方案
stm32·单片机·物联网
梁下轻语的秋缘8 小时前
华为云loT物联网介绍与使用
物联网·学习·华为·华为云
夜月yeyue9 小时前
静态库与动态库简介
linux·c++·stm32·单片机·嵌入式硬件
程序员JerrySUN9 小时前
驱动开发硬核特训 │ Day 23(下篇): i.MX8MP LCDIFv3 驱动中的 Regulator 系统全解
linux·驱动开发·嵌入式硬件
霖0010 小时前
FPGA中级项目8———UART-RAM-TFT
网络·经验分享·嵌入式硬件·fpga开发·显示器·fpga