1. 项目概述
这个基于STM32F103C8T6单片机的智能香薰灯系统,是我在指导毕业设计时遇到的一个非常实用的物联网应用案例。它不仅仅是一个简单的香薰灯,而是融合了环境感知、智能控制和远程监控功能的完整解决方案。
系统核心功能包括:
- 环境温湿度监测与自适应喷洒控制
- 香薰液位检测与缺水保护
- 多模式灯光控制(睡眠/休闲模式)
- 本地按键与手机蓝牙双控制通道
- 状态信息实时显示
在实际应用中,这种设计特别适合卧室、办公室等需要营造舒适环境的场景。相比传统香薰灯,它的智能化程度更高,能够根据环境条件自动调节工作状态,同时避免了干烧风险。
2. 硬件系统设计
2.1 核心控制器选型
选择STM32F103C8T6作为主控芯片主要基于以下考虑:
- 72MHz主频的Cortex-M3内核,性能足够处理传感器数据和控制逻辑
- 64KB Flash + 20KB RAM的存储配置满足程序需求
- 丰富的外设接口(USART、I2C、GPIO等)
- 广泛的社区支持和成熟的开发工具链
- 性价比高,适合学生项目预算
提示:对于初学者,建议使用STM32CubeMX工具进行引脚分配和初始化代码生成,可以大幅降低开发难度。
2.2 传感器模块设计
2.2.1 DHT11温湿度传感器
DHT11采用单总线协议,与STM32连接仅需一个GPIO引脚。实际使用中需要注意:
- 供电电压3.3V-5.5V
- 测量范围:20-90%RH(湿度),0-50℃(温度)
- 采样周期需大于1秒
- 数据线需接上拉电阻(通常4.7KΩ)
典型接线方式:
code复制DHT11 STM32
VCC -> 3.3V
DATA -> PA0(配置为上拉输入)
GND -> GND
2.2.2 液位检测模块
采用电容式液位传感器,通过检测电容变化判断液位状态。实现要点:
- 安装时需确保传感器与容器壁良好接触
- 阈值设置要考虑不同香薰液体的介电常数差异
- 防误触发设计:连续3次检测到缺水才触发报警
2.3 输出模块设计
2.3.1 雾化片驱动电路
采用继电器控制雾化片工作,电路设计注意事项:
- 雾化片工作电压通常为24V,需独立供电
- 继电器线圈端加续流二极管(1N4007)
- MOS管驱动电路要保证充分饱和导通
- 实际测试中,5秒喷洒时间可使3-5平米空间达到适宜香薰浓度
2.3.2 LED调光电路
模式切换对应的灯光控制:
- 睡眠模式:20% PWM占空比(约100lm)
- 休闲模式:80% PWM占空比(约400lm)
- RGB调色采用WS2812B灯珠,通过DMA+PWM实现高效控制
2.4 电源系统设计
系统供电方案:
- 输入:5V/2A Type-C接口
- 主控:AMS1117-3.3稳压芯片
- 雾化片:24V/1A独立电源
- 各模块间电源隔离:使用磁珠或0Ω电阻分隔模拟/数字地
3. 软件系统实现
3.1 主程序架构
采用前后台系统架构:
c复制void main() {
// 硬件初始化
System_Init();
while(1) {
// 传感器数据采集
Sensor_Update();
// 业务逻辑处理
Manage_Function();
// 状态显示更新
Display_Update();
// 低功耗处理
Power_Manage();
}
}
3.2 关键算法实现
3.2.1 自适应喷洒控制算法
c复制void Spray_Control(void) {
static uint32_t last_spray_time = 0;
uint32_t interval;
// 确定喷洒间隔
if(temp_value > temp_max*10 || humi_value > humi_max*10) {
interval = 3600000; // 1小时
} else {
interval = 7200000; // 2小时
}
// 执行喷洒逻辑
if(HAL_GetTick() - last_spray_time >= interval) {
RELAY_ON(); // 打开继电器
HAL_Delay(5000); // 持续5秒
RELAY_OFF(); // 关闭继电器
last_spray_time = HAL_GetTick();
}
}
3.2.2 液位检测与保护
c复制#define WATER_LOW_COUNT 3
void Water_Check(void) {
static uint8_t low_count = 0;
if(Water_GetLevel() == LOW) {
low_count++;
if(low_count >= WATER_LOW_COUNT) {
Buzzer_Alert(3); // 报警3声
RELAY_OFF(); // 关闭雾化片
OLED_ShowWarning();
}
} else {
low_count = 0;
}
}
3.3 蓝牙通信协议
自定义简单协议格式:
code复制[HEAD][LEN][CMD][DATA][CRC]
其中:
- HEAD:固定为0xAA
- LEN:数据长度
- CMD:命令字(如0x01设置阈值)
- DATA:参数数据
- CRC:校验和
典型手机指令示例:
- 设置温度阈值:AA 03 01 1E 4C (设置阈值为30℃)
- 切换工作模式:AA 02 02 01 05 (切换至休闲模式)
4. PCB设计要点
4.1 布局策略
-
电源分区布局:
- 左上角:24V电源输入及滤波
- 右下角:3.3V稳压电路
- 各模块电源入口加π型滤波
-
信号流向:
code复制
传感器区 -> STM32 -> 驱动电路 -> 显示模块 -> 蓝牙模块 -
关键间距:
- 高压部分(24V)与低压部分间距≥3mm
- 晶振靠近MCU,下方禁止走线
4.2 布线规范
-
电源线宽:
- 24V主线:40mil
- 3.3V支路:20mil
- 数字地铺铜全覆盖
-
敏感信号处理:
- DHT11数据线:包地处理
- USB差分线:等长±50mil
- 晶振线路:最短路径,下方铺地
-
过孔使用:
- 电源过孔:直径0.5mm/孔径0.3mm
- 信号过孔:直径0.4mm/孔径0.2mm
5. 调试与优化
5.1 常见问题排查
-
雾化片不工作:
- 检查24V电源是否正常
- 测量继电器线圈电压(应≥3V)
- 用万用表检测MOS管G极控制信号
-
DHT11数据异常:
- 确认上拉电阻已连接
- 检查时序是否符合规格书要求
- 尝试降低总线速度(增加延时)
-
蓝牙连接不稳定:
- 检查天线附近是否有金属遮挡
- 确认供电电压稳定(3.3V±5%)
- 测试不同距离下的信号强度
5.2 性能优化技巧
-
低功耗优化:
- 空闲时切换至STOP模式
- 传感器采用间歇工作方式
- 关闭未使用的外设时钟
-
响应速度提升:
- 关键中断设为最高优先级
- 使用DMA传输显示数据
- 将频繁调用的函数放入RAM
-
稳定性增强:
- 添加看门狗定时器
- 重要变量使用volatile修饰
- 关键操作加入异常处理
6. 项目扩展方向
-
增加WiFi联网功能:
- 使用ESP8266模块
- 对接云平台实现远程监控
- 支持定时任务和场景联动
-
加入空气质量检测:
- 集成PM2.5传感器
- 根据空气质量自动调节工作模式
- 提供环境质量历史数据
-
改进喷洒控制:
- 采用PID算法实现精准控制
- 增加多档位调节
- 支持不同香型的自动识别
在实际开发过程中,我发现最影响用户体验的是雾化片的启动延迟问题。通过优化驱动电路和添加预热功能,最终将响应时间从原来的2秒缩短到了0.5秒以内。这个案例告诉我们,在物联网设备开发中,硬件和软件的协同优化往往能带来意想不到的效果。