1. 项目概述:当传统窗帘遇上智能家居
去年装修新房时,我发现市面上的智能窗帘要么价格虚高,要么功能单一。作为一名嵌入式开发者,我决定用STM32打造一款集语音控制、光线感应和防盗预警于一体的智能窗帘系统。这个项目最吸引我的地方在于——它完美融合了硬件控制、传感器技术和语音交互这三个嵌入式开发的核心领域。
整套系统由STM32F103C8T6最小系统板作为主控,通过继电器模块驱动窗帘电机,光照传感器实时监测环境亮度,红外对管实现防盗检测,同时接入LD3320语音识别芯片实现本地化指令处理。与市面上同类产品相比,这套方案最大的优势是实现了完全离线的语音控制,所有数据处理都在本地完成,既保护隐私又降低延迟。
2. 硬件架构设计
2.1 核心控制器选型
经过对比STM32F1系列的几款芯片,最终选择Cortex-M3内核的STM32F103C8T6,主要基于三点考量:
- 72MHz主频足够处理传感器数据融合和语音特征匹配
- 64KB Flash完全容纳语音识别固件和主程序
- 丰富的GPIO和外设接口(3个USART、2个SPI、2个I2C)
实际开发中发现USART1的TX(PA9)与SWD调试接口冲突,最终将语音模块改接到USART2(PA2/PA3)
2.2 传感器组配置方案
光照检测部分:
选用BH1750数字光强传感器,相比传统光敏电阻有以下优势:
- 直接输出lux值(范围1-65535lx)
- I2C接口仅需2根信号线
- 内置16bit ADC无需额外电路
实测数据表明,室内环境照度通常在50-500lx之间,因此将自动模式阈值设为:
- 开帘条件:持续10秒低于100lx
- 关帘条件:持续10秒高于300lx
防盗检测方案:
采用红外对管E18-D80NK实现非接触式检测:
- 检测距离3-80cm可调
- 数字输出直接接MCU GPIO
- 安装时在窗框两侧成对布置
当系统处于离家模式时,若检测到光束阻断立即触发:
- 窗帘电机急停
- 蜂鸣器报警
- 通过SIM800模块发送短信提醒
2.3 语音交互实现
使用LD3320离线语音识别芯片的关键配置:
c复制// 语音指令列表定义
const char *voice_cmd[] = {
"kai chuang lian", // 对应指令码0x01
"guan chuang lian", // 0x02
"zi dong mo shi", // 0x03
"fang dao mo shi" // 0x04
};
// 初始化配置
LD3320_Init(UART2);
LD3320_SetCMD(voice_cmd, 4);
实测识别率约85%,通过以下技巧提升效果:
- 麦克风选用驻极体咪头(灵敏度-38±3dB)
- 在PCB上增加pop减震结构
- 训练时在不同距离(0.5m/1m/1.5m)多次采样
3. 软件系统实现
3.1 主控程序架构
采用时间片轮询+中断的混合架构:
mermaid复制graph TD
A[系统初始化] --> B[1ms定时中断]
B --> C[传感器数据采集]
B --> D[语音指令检测]
B --> E[状态机处理]
E --> F[电机控制]
E --> G[报警触发]
关键状态机逻辑:
c复制typedef enum {
MODE_MANUAL,
MODE_AUTO,
MODE_SECURITY
} sys_mode_t;
void FSM_Update(void)
{
static uint32_t light_timer = 0;
switch(current_mode){
case MODE_AUTO:
if(bh1750_val < 100) light_timer++;
else light_timer = 0;
if(light_timer > 10000) // 10秒阈值
Curtain_Open();
break;
case MODE_SECURITY:
if(ir_sensor_trig){
Buzzer_Alert(3);
GSM_SendMsg("ALERT: Window intrusion!");
}
break;
}
}
3.2 电机驱动策略
选用JGA25-370直流减速电机,驱动要点:
- 通过L298N模块实现正反转控制
- 限位开关采用机械微动开关
- PWM频率设为1kHz(TIM4_CH1)
运动控制算法:
c复制void Curtain_Move(uint8_t dir)
{
if(dir == OPEN){
HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(IN2_GPIO_Port, IN2_Pin, GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 800); // 80%占空比
}
else{
HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(IN2_GPIO_Port, IN2_Pin, GPIO_PIN_SET);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 600); // 反向时降低速度
}
}
4. 系统优化与实测
4.1 功耗控制方案
通过以下措施将待机功耗控制在0.5W以内:
- 光照传感器改为间隔采样(每5秒唤醒一次)
- 语音模块在不使用时进入休眠模式
- STM32开启STOP模式,通过EXTI唤醒
实测功耗对比:
| 工作模式 | 电流消耗 | 唤醒延迟 |
|---|---|---|
| 全速运行 | 120mA | 0ms |
| 低功耗模式 | 4.2mA | 200ms |
4.2 安装调试要点
机械安装时踩过的坑:
- 导轨水平度误差需<2mm/m,否则会导致电机卡顿
- 限位开关位置要预留3-5mm缓冲距离
- 红外对管安装后需用遮光胶带密封缝隙
电路调试技巧:
- 电机电源与MCU完全隔离(使用光耦HCPL-817)
- 所有信号线增加磁珠滤波
- 语音模块的3.3V电源单独稳压(AMS1117)
5. 扩展改进方向
当前系统已稳定运行半年,后续计划升级:
- 增加WiFi模块接入HomeAssistant
- 改用TMC5160步进驱动实现静音控制
- 开发手机APP实现情景模式设置
这个项目给我的最大启示是:嵌入式开发中,硬件可靠性设计往往比软件算法更重要。比如最初版本因为没加电机续流二极管,导致一个月内烧毁了3个L298N驱动芯片。现在我的PCB上一定会预留这些保护电路的空间,哪怕初期觉得"可能用不上"。