ESP32-S3入门第八天:往期知识回顾与实战练习
往期知识回顾与迷你环境监测站实战
- 一、前七天核心知识回顾
- 1. 基础能力模块(Day1-Day2)
- 2. 模拟与通信模块(Day3-Day7)
- 3. 知识串联逻辑
- 二、实验小产品:迷你环境监测站(融合全知识点)
- 1. 产品功能定义
- 2. 硬件清单(含往期元件复用)
- 3. 硬件接线图(整合多模块)
- 三、产品开发实战
- 1. 功能模块拆解与代码实现
- (1)基础配置(整合 Day1-Day2)
- (2)传感器数据采集(Day4 ADC 核心)
- (3)OLED 本地显示(Day5 I2C 实战)
- (4)PWM 报警与 UART 上报(Day3+Day7)
- (5)新增 Wi-Fi 基础配网(衔接物联网)
- (6)主函数整合(全流程串联)
- 4. 实验现象与验收标准
- 四、知识拓展与进阶方向
- 1. 功能升级(基于现有代码)
- 2. 排错指南(整合往期常见问题)
- 五、第八天总结与后续规划
- 1. 今日成果
- 2. 后续学习方向
- 本章节系列教学
一、前七天核心知识回顾
1. 基础能力模块(Day1-Day2)
天数 | 核心内容 | 关键技能 | 应用场景 |
---|---|---|---|
Day1 | Arduino IDE 使用 | 开发环境搭建、驱动安装、代码上传 | 所有 ESP32-S3 基础实验 |
Day2 | GPIO / 延时 / 定时器 | 输入(按钮)/ 输出(LED)、阻塞 / 非阻塞延时、Ticker 定时器 | 硬件开关控制、多任务调度 |
2. 模拟与通信模块(Day3-Day7)
天数 | 核心内容 | 关键技能 | 代表实验 |
---|---|---|---|
Day3 | PWM 脉冲调制 | ledc 库配置、占空比 / 频率调节 | LED 呼吸灯、舵机控制 |
Day4 | ADC 模数转换 | 分辨率 / 衰减器配置、模拟信号采集 | 电位器读取、光敏 / 湿度传感 |
Day5 | I2C 通信 | 设备扫描、多设备总线共享 | OLED 显示、BME280 数据采集 |
Day6 | SPI 通信 | 硬件 SPI 配置、多设备片选控制 | TFT 显示、SPI Flash 存储 |
Day7 | UART 通信 | 多串口配置、指令解析 | 串口控制硬件、数据上报 |
3. 知识串联逻辑
二、实验小产品:迷你环境监测站(融合全知识点)
1. 产品功能定义
实现「温湿度 + 光照强度」采集,通过 OLED 本地显示、串口上报数据,LED 指示灯提示湿度状态(干 / 湿),核心融合前七天 80% 知识点,新增基础 Wi-Fi 配网能力。
2. 硬件清单(含往期元件复用)
元件 | 数量 | 对应知识点 | 用途 |
---|---|---|---|
ESP32-S3 开发板 | 1 | 全流程基础 | 核心控制 |
DHT11 温湿度传感器 | 1 | ADC/Day4 | 温湿度采集 |
光敏电阻 + 10kΩ 电阻 | 1 组 | ADC/Day4 | 光照检测 |
0.96 寸 I2C OLED | 1 | I2C/Day5 | 数据本地显示 |
板载 LED + 外接 LED | 2 | GPIO/PWM/Day2-Day3 | 状态指示(呼吸灯 + 湿度报警) |
杜邦线 + 面包板 | 若干 | 全流程 | 电路搭建 |
3. 硬件接线图(整合多模块)
元件引脚 | ESP32-S3 引脚 | 对应模块 |
---|---|---|
DHT11 DATA | GPIO2(ADC1_CH2) | ADC 采集 |
光敏电阻分压点 | GPIO36(ADC1_CH0) | ADC 采集 |
OLED SDA/SCL | GPIO21/GPIO22 | I2C 通信 |
湿度报警 LED | GPIO10(PWM 通道 1) | PWM 亮度提示 |
UART 上报 | GPIO17/GPIO16(UART2) | UART 通信 |
提示:复用 I2C/SPI/UART 引脚时,需确保不同设备片选 / 地址不冲突(如 OLED 地址 0x3C,无其他 I2C 设备)。
三、产品开发实战
1. 功能模块拆解与代码实现
(1)基础配置(整合 Day1-Day2)
// 引入所需库(覆盖Day4-Day7)
#include "DHT.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Ticker.h>// 引脚定义(Day2 GPIO基础)
#define DHT_PIN 2
#define LDR_PIN 36
#define ALARM_LED_PIN 10
#define UART2_TX 17
#define UART2_RX 16// 模块初始化(Day1-Day7配置逻辑)
DHT dht(DHT_PIN, DHT11);
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
HardwareSerial UART2(2);
Ticker timer; // Day2 定时器// 全局变量
float temp = 0.0, humi = 0.0;
int light = 0;
(2)传感器数据采集(Day4 ADC 核心)
// ADC采集函数(含滤波优化)
int readADCFiltered(int pin) {long sum = 0;for (int i = 0; i < 10; i++) { // 滑动平均滤波sum += analogRead(pin);delay(1);}return sum / 10;
}// 数据更新函数(定时器触发,Day2 非阻塞逻辑)
void updateSensorData() {// DHT11数据(Day4 模拟传感器)humi = dht.readHumidity();temp = dht.readTemperature();// 光敏电阻数据(Day4 ADC转换)int ldrVal = readADCFiltered(LDR_PIN);light = map(ldrVal, 0, 4095, 100, 0); // 光照越强值越大
}
(3)OLED 本地显示(Day5 I2C 实战)
void initOLED() {if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {while (1); // 初始化失败卡死}oled.clearDisplay();oled.setTextColor(SSD1306_WHITE);oled.setTextSize(1);
}void displayData() {oled.clearDisplay();// 显示温湿度(Day5 文本显示)oled.setCursor(0, 0);oled.print("Temp: ");oled.print(temp, 1);oled.println(" C");oled.setCursor(0, 16);oled.print("Humi: ");oled.print(humi, 0);oled.println(" %");// 显示光照(Day5 图形辅助)oled.setCursor(0, 32);oled.print("Light: ");oled.print(light);oled.println(" %");// 湿度状态提示oled.setCursor(0, 48);if (humi < 30) oled.println("Status: Dry");else if (humi < 60) oled.println("Status: Normal");else oled.println("Status: Wet");oled.display();
}
(4)PWM 报警与 UART 上报(Day3+Day7)
void initPWM() {// Day3 PWM配置:报警LED呼吸灯ledcSetup(1, 1000, 8);ledcAttachPin(ALARM_LED_PIN, 1);
}void checkHumidityAlarm() {// 湿度低于30%时LED呼吸(Day3 占空比变化)if (humi < 30) {static int duty = 0;static bool up = true;duty = up ? duty + 5 : duty - 5;if (duty >= 255) up = false;if (duty <= 0) up = true;ledcWrite(1, duty);} else {ledcWrite(1, 0); // 正常时熄灭}
}void uartReport() {// Day7 UART2上报数据(格式化)String report = "TEMP:" + String(temp,1) + ",HUMI:" + String(humi,0) + ",LIGHT:" + String(light);UART2.println(report);
}
(5)新增 Wi-Fi 基础配网(衔接物联网)
#include <WiFi.h>const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";void initWiFi() {WiFi.begin(ssid, password);oled.setCursor(0, 56);oled.print("WiFi: Connecting");oled.display();while (WiFi.status() != WL_CONNECTED) {delay(500);oled.print(".");oled.display();}oled.clearDisplay();oled.setCursor(0, 56);oled.print("WiFi: Connected");oled.display();
}
(6)主函数整合(全流程串联)
void setup() {// 基础初始化(Day1-Day2)Serial.begin(115200);UART2.begin(115200, SERIAL_8N1, UART2_RX, UART2_TX);dht.begin();analogSetPinAttenuation(LDR_PIN, ADC_11db); // Day4 ADC衰减器// 模块初始化initOLED();initPWM();initWiFi(); // 新增Wi-Fi// 定时器配置(Day2 非阻塞)timer.attach_ms(2000, updateSensorData); // 2秒更新一次数据
}void loop() {// 数据处理与输出(串联全知识点)displayData(); // I2C OLED显示(Day5)checkHumidityAlarm();// PWM报警(Day3)uartReport(); // UART上报(Day7)// 调试日志(Day1)Serial.print("Temp:");Serial.print(temp,1);Serial.print(" Humi:");Serial.print(humi,0);Serial.print(" Light:");Serial.println(light);delay(1000);
}
4. 实验现象与验收标准
-
OLED 显示:分区域显示温度(保留 1 位小数)、湿度(整数)、光照(百分比)及湿度状态
-
报警功能:湿度<30% 时,外接 LED 呈呼吸灯效果(PWM 动态调节)
-
串口上报:
- UART0(USB)打印调试日志
- UART2 输出格式化数据(如 “TEMP:25.3,HUMI:45,LIGHT:60”)
-
Wi-Fi 状态:初始化时 OLED 显示连接过程,成功后提示 “WiFi: Connected”
四、知识拓展与进阶方向
1. 功能升级(基于现有代码)
- ✅ 新增 SPI Flash 存储(Day6):将历史数据写入 Flash,断电不丢失
- ✅ 加入舵机控制(Day3):湿度>70% 时舵机触发 “浇水” 动作
- ✅ 实现 HTTP 请求(Day8+):通过 Wi-Fi 将数据上传至物联网平台(如 Blinker)
2. 排错指南(整合往期常见问题)
问题现象 | 关联知识点 | 解决方法 |
---|---|---|
OLED 不显示 | I2C/Day5 | 检查地址(0x3C/0x3D)、SDA/SCL 接线 |
传感器数据异常 | ADC/Day4 | 增加滤波、校准阈值、检查接线极性 |
串口乱码 | UART/Day7 | 统一波特率(115200)、配置 8N1 格式 |
Wi-Fi 连接失败 | 新增内容 | 确认 SSID / 密码、连接 2.4GHz 网络 |
五、第八天总结与后续规划
1. 今日成果
- ✅ 系统回顾前七天核心知识点,形成 “基础 - 模拟 - 通信” 知识体系
- ✅ 完成首个综合产品,实现多模块协同工作
- ✅ 新增 Wi-Fi 基础能力,衔接物联网进阶内容
2. 后续学习方向
-
物联网深化:MQTT 协议、OTA 无线更新、云端平台对接
-
硬件拓展:摄像头(ESP32-S3 NPU 加速)、蓝牙 BLE 通信
-
项目实战:智能花盆、环境监测仪表盘、低功耗传感器节点
可根据兴趣选择方向,后续教程将聚焦 “物联网数据上传” 或 “硬件拓展”,带你从 “模块实验” 走向 “完整项目”!
本章节系列教学
ESP32-S3 入门第一天:Arduino IDE使用
ESP32-S3 入门第二天:IO口、延时与定时器核心知识实战
ESP32-S3 入门第三天:PWM 脉冲宽度调制
ESP32-S3 入门第四天:ADC 模数转换
ESP32-S3 入门第五天:I2C通信协议
ESP32-S3入门第六天:SPI通信协议与高速外设控制
ESP32-S3入门第七天:UART串口通信与设备交互
ESP32-S3入门第八天:往期知识回顾与实战练习