1. 项目概述
这款基于STM32F103C8T6的智能香薰灯是我在嵌入式系统课程设计中的实践成果。作为一名电子工程专业的学生,我发现市面上大多数香薰产品要么功能单一,要么价格昂贵,于是萌生了设计一款高性价比智能香薰灯的想法。这个项目从构思到实现历时两个月,最终完成了一个具备环境感知、智能调控和远程控制功能的完整系统。
传统香薰灯普遍存在三个痛点:一是需要人工频繁操作,无法根据环境变化自动调节;二是缺乏液位监测,经常出现干烧情况;三是功能单一,无法满足不同场景需求。我的设计正是针对这些问题,通过嵌入式技术实现了温湿度联动控制、液位安全监测、多模式切换和手机远程交互四大核心功能。
提示:选择STM32F103C8T6作为主控是因为其性价比高,72MHz主频足够处理传感器数据,且具有丰富的外设接口,非常适合这类智能家居应用。
2. 系统架构设计
2.1 整体硬件框架
系统采用模块化设计思想,硬件架构可分为五个层次:
- 感知层:DHT11温湿度传感器+YW01液位传感器
- 控制层:STM32F103C8T6最小系统板
- 执行层:继电器驱动雾化片+RGB灯带
- 交互层:OLED显示屏+独立按键+蜂鸣器
- 通信层:ECB02蓝牙模块
(注:实际项目中应替换为真实的架构图)
2.2 关键模块选型
2.2.1 主控芯片选择
对比了Arduino、ESP8266和STM32三种方案后,最终选择STM32F103C8T6,主要考虑因素:
- 成本:零售价仅10元左右
- 性能:Cortex-M3内核,72MHz主频
- 外设资源:具备ADC、PWM、USART等必要接口
- 开发环境:Keil MDK生态完善
2.2.2 传感器选型
温湿度传感器选用DHT11而非更精确的DHT22,主要基于两点考虑:
- 香薰控制对温湿度精度要求不高(±2℃误差可接受)
- DHT11价格仅为DHT22的1/3
液位检测采用YW01光电式传感器而非浮球式,优势在于:
- 非接触式检测,避免香薰液体腐蚀
- 数字信号输出,无需额外ADC电路
- 响应时间<100ms
3. 硬件电路设计
3.1 主控电路设计
STM32最小系统包含以下关键电路:
- 电源电路:AMS1117-3.3稳压芯片,输入5V输出3.3V
- 复位电路:10kΩ上拉电阻+0.1μF电容
- 时钟电路:8MHz晶振+22pF负载电容
- 下载接口:SWD四线接口
注意:PCB布局时晶振要尽量靠近芯片,走线长度不超过10mm,否则可能导致时钟不稳定。
3.2 传感器接口电路
DHT11连接示意图:
code复制VCC ---- 3.3V
DATA --- PA1 (需接4.7kΩ上拉电阻)
GND ---- GND
YW01液位传感器接口:
code复制VCC ---- 5V
OUT --- PC13 (直接连接,内部已集成上拉)
GND ---- GND
实测中发现的问题及解决方案:
- 问题:DHT11偶尔读取失败
- 原因:上拉电阻值过大导致上升沿缓慢
- 解决:将上拉电阻从10kΩ改为4.7kΩ
3.3 功率驱动电路
雾化片驱动采用继电器方案而非MOS管,考虑因素:
- 雾化片工作电流达300mA,超过普通MOS管额定值
- 继电器隔离性好,避免高压干扰MCU
- 香薰控制不需要高频开关(最长间隔2小时)
继电器驱动电路关键参数:
- 三极管:S8050 (Ic=500mA)
- 基极电阻:1kΩ
- 续流二极管:1N4148
4. 软件设计实现
4.1 主程序流程图
c复制void main() {
hardware_init(); // 硬件初始化
while(1) {
read_sensors(); // 读取传感器数据
process_logic(); // 业务逻辑处理
update_display(); // 刷新OLED显示
check_buttons(); // 按键扫描
handle_ble(); // 蓝牙通信处理
}
}
4.2 温湿度控制算法
香薰释放控制逻辑采用状态机实现:
c复制typedef enum {
NORMAL_MODE,
HIGH_TEMP_MODE,
HIGH_HUMID_MODE
} AromaMode;
AromaMode current_mode = NORMAL_MODE;
void update_aroma_mode() {
if(temp > temp_threshold) {
current_mode = HIGH_TEMP_MODE;
} else if(humid > humid_threshold) {
current_mode = HIGH_HUMID_MODE;
} else {
current_mode = NORMAL_MODE;
}
}
4.3 蓝牙通信协议
自定义简化协议格式:
code复制[HEAD][CMD][LEN][DATA][CRC]
- HEAD: 0xAA
- CMD: 指令类型(1字节)
- LEN: 数据长度(1字节)
- DATA: 有效载荷
- CRC: 校验和(1字节)
常用指令示例:
- 0x01: 设置温湿度阈值
- 0x02: 启动/停止香薰
- 0x03: 切换灯光模式
5. 功能测试与优化
5.1 温湿度控制测试
测试数据记录表:
| 测试场景 | 设定阈值 | 实际触发值 | 误差分析 |
|---|---|---|---|
| 高温触发 | 30℃ | 30.2℃ | 传感器误差 |
| 高湿触发 | 70% | 69.8% | 响应延迟 |
| 正常模式 | - | 间隔2小时 | 定时器准确 |
5.2 液位报警测试
发现三个典型问题及解决方案:
-
问题:液位波动导致误报警
解决:增加软件滤波,连续3次检测到低液位才触发 -
问题:报警声太小
解决:更换蜂鸣器驱动电路,增加三极管放大 -
问题:OLED显示闪烁
解决:优化刷新策略,只局部更新变化区域
5.3 功耗优化措施
通过以下方式降低待机功耗:
- 使用STM32的Stop模式,功耗降至20μA
- 传感器采用间歇工作模式(每5分钟唤醒一次)
- OLED关闭时切断电源(通过MOS管控制)
实测功耗对比:
- 工作状态:85mA
- 待机状态:0.5mA
- 睡眠模式:0.02mA
6. 项目总结与改进方向
经过实际使用测试,这款香薰灯基本实现了设计目标,但仍有改进空间:
- 可增加WiFi连接,实现远程控制(当前蓝牙距离有限)
- 加入香薰类型识别功能,自动匹配最佳工作参数
- 优化外壳设计,目前3D打印件存在漏光问题
成本核算表:
| 部件 | 单价(元) | 数量 | 小计 |
|---|---|---|---|
| STM32核心板 | 12.8 | 1 | 12.8 |
| DHT11 | 4.5 | 1 | 4.5 |
| YW01 | 6.2 | 1 | 6.2 |
| OLED | 8.0 | 1 | 8.0 |
| 雾化片 | 3.5 | 1 | 3.5 |
| 合计 | - | - | 35.0 |
这个项目让我深刻体会到嵌入式系统设计的乐趣与挑战。最大的收获是学会了如何平衡功能需求与实现成本,以及在资源受限环境下优化系统性能的方法。建议后续开发者可以尝试用RTOS重构代码,会大大提升系统的可维护性。
