基于 STM32F103C8T6 的嵌入式智能窗帘系统,采用事件驱动有限状态机架构,支持光照自动、定时自动、手动三种控制模式,并集成蓝牙、语音播报与多传感器融合。
- 三种控制模式
- 光照自动模式:根据环境光强度自动开合窗帘(滞回阈值防抖动)
- 定时自动模式:按设定时间点自动开合
- 手动模式:按键或蓝牙指令直接控制
- 多传感器融合:光照(GL5528)、CO 浓度(MQ-7)、温湿度(DHT11)实时采集,每秒聚合一次
- 蓝牙远程控制:HC-05 模块支持手机 APP 发送指令
- 语音播报:JR6001 模块在关键状态切换时进行语音提示
- OLED 菜单显示:SSD1306 显示当前模式、传感器数据、系统时间
- 软件定时器:TIM2 驱动 1 kHz 时基,维护系统时钟(时:分:秒),支持整点定时触发
- 安全机制:IWDG 看门狗防死机;CO 超标时强制进入错误保护状态
- 非阻塞按键消抖:状态机消抖,10 ms 扫描周期,不占用 HAL_Delay
| 模块 | 型号 / 规格 | 接口 |
|---|---|---|
| 主控 MCU | STM32F103C8T6(Blue Pill) | — |
| 步进电机 | 28BYJ-48 + ULN2003 驱动板 | PB8 / PB9 / PA12 / PA15 |
| 光敏电阻 | GL5528 + 分压电路 | PA0(ADC1 CH0) |
| CO 传感器 | MQ-7 | PA1(ADC1 CH1,DMA) |
| 温湿度传感器 | DHT11 | PA11(单总线) |
| OLED 显示屏 | SSD1306(0.96",128×64) | PB6 / PB7(I2C1) |
| 蓝牙模块 | HC-05 | PA2 / PA3(USART2) |
| 语音模块 | JR6001 | PB10 / PB11(USART3) |
| 按键 | 轻触按键 × 4 | PB12 / PB13 / PB14 / PB15 |
| LED | 状态指示灯 | PB0 |
| 蜂鸣器 | 无源蜂鸣器 | PC13 |
| 调试串口 | — | PA9 / PA10(USART1) |
| 调试器 | ST-Link V2 | SWD |
┌─────────────────────────────────────────────┐
│ Application Layer (main.c) │
│ FSM 状态处理函数 + System_Dispatch 分发器 │
├─────────────────────────────────────────────┤
│ Event System (EVENT/) │
│ 事件队列(10 槽环形缓冲区) │
├──────────────┬──────────────────────────────┤
│ TIME/ │ BSP/ │
│ 软件定时器 │ KEY · MOTOR · SENSOR │
│ (TIM2 1kHz) │ OLED · BT · VOICE · BEEP │
├──────────────┴──────────────────────────────┤
│ Drivers/ (HAL + CMSIS) │
│ ⛔ 禁止修改 │
└─────────────────────────────────────────────┘
系统共 9 个状态,所有输入均通过 System_Dispatch 路由,每个状态仅响应白名单内的事件。
┌──────────────────────────────┐
│ │
EVT_KEY (KEY1 模式切换) │
│ │
┌────────────▼─────┐ │
│ FSM_IDLE_LUX │◄── 光照传感器触发 ──── 自动开合
│ (光照自动模式) │
└────────────┬─────┘
│ KEY1
┌────────────▼─────┐
│ FSM_IDLE_TIM │◄── 整点定时触发 ─────── 自动开合
│ (定时自动模式) │
│ ├──► FSM_SET_OPEN_TIME
│ ├──► FSM_SET_CLOSE_TIME
└────────────┬─────┘
│ KEY1
┌────────────▼─────┐
│ FSM_IDLE_MANUAL │◄── 按键 / 蓝牙指令 ──── 手动开合
│ (手动模式) ├──► FSM_SET_SYSTEM_TIME
└──────────────────┘
FSM_IDLE_* ──► FSM_OPENING ──► FSM_IDLE_*(到位后自动返回)
FSM_IDLE_* ──► FSM_CLOSING ──► FSM_IDLE_*
任意状态 ──► FSM_ERROR (CO 超标 / 硬件异常)
| 事件 | 来源 | 说明 |
|---|---|---|
EVT_KEY_PRESS |
按键 BSP | 携带键号 |
EVT_BT_CMD |
蓝牙 BSP | 携带指令字节 |
EVT_SENSOR_LIGHT |
传感器聚合器 | 光照阈值穿越 |
EVT_SENSOR_CO |
传感器聚合器 | CO 阈值穿越 |
EVT_MOTOR_STATE |
电机 BSP | 到位 / 停止 |
EVT_TIMER_CTRL |
软件定时器 | 整点触发 |
EVT_SET_COMPLETE |
设置状态处理 | 参数确认完成 |
EVT_ERROR |
任意模块 | 错误上报 |
| 问题 | 方案 |
|---|---|
| 按键抖动 | 状态机消抖(IDLE→DEBOUNCE→PRESSED),无 HAL_Delay |
| 光照临界抖动 | 滞回比较:开启阈值 ≠ 关闭阈值,中间形成死区 |
| ISR 安全 | ISR 只设标志位或调用轻量 tick;真正处理在主循环 |
| 并发访问时间 | 原子操作(关中断读写)保护系统时间变量 |
| 内存安全 | 禁用动态内存,全部静态分配;栈约 1 KB |
Smart_Curtain/
├── Core/
│ ├── Inc/
│ │ └── main.h # FSM / 事件 / 系统状态类型定义
│ └── Src/
│ ├── main.c # 主循环 + 所有 FSM 状态处理函数
│ ├── stm32f1xx_hal_msp.c # MSP 外设初始化
│ └── stm32f1xx_it.c # 中断向量表
├── BSP/
│ ├── BEEP/ # 蜂鸣器驱动
│ ├── BT/ # 蓝牙 HC-05(USART2)
│ ├── DHT11/ # 温湿度传感器(单总线)
│ ├── KEY/ # 按键状态机消抖
│ ├── LED/ # 状态指示灯
│ ├── LIGHT/ # 光敏 ADC 采样
│ ├── MOTOR/ # 28BYJ-48 步进电机
│ ├── MQ-7/ # CO 传感器 ADC
│ ├── OLED/ # SSD1306 + 菜单 UI
│ ├── SENSOR/ # 传感器聚合(1 s 扫描 + 滞回判断)
│ └── VOICE/ # 语音模块 JR6001(USART3)
├── EVENT/
│ ├── event.h # 事件类型定义
│ └── event.c # 环形事件队列(入队/出队)
├── TIME/
│ ├── soft_time.h
│ └── soft_time.c # TIM2 1 kHz 时基 + 系统时钟
├── Drivers/ # STM32 HAL + CMSIS(禁止修改)
└── Smart_Curtain.ioc # STM32CubeMX 配置文件
本项目使用 EIDE(VSCode 嵌入式 IDE 插件) 作为主要构建工具,Keil µVision 作为备选。
# EIDE (VSCode)
EIDE: Build Project # 编译
EIDE: Rebuild Project # 清除并重新编译
EIDE: Flash (ST-Link) # 通过 ST-Link 下载到 MCU
# Keil µVision
F7 # 编译
F8 # 下载到设备
如需通过 STM32CubeMX 重新生成代码,自定义代码必须放在
/* USER CODE BEGIN *///* USER CODE END */块内,否则将被覆盖。
版本: v1.0 · 最后更新: 2026年2月