Skip to content

oran9eLi/Smart_Curtain

Repository files navigation

智能窗帘控制器

基于 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)            │
│              ⛔ 禁止修改                     │
└─────────────────────────────────────────────┘

有限状态机(FSM)

系统共 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月

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors