1. 项目概述与设计背景
作为一名嵌入式系统开发者,我最近完成了一个基于STM32的智能伸缩晾衣架项目。这个项目源于我自己的实际生活需求——每次遇到突然下雨时,总是来不及收衣服,导致衣物被淋湿。传统晾衣架完全依赖人工操作,在现代快节奏生活中显得尤为不便。
这个智能晾衣架系统的核心设计理念是"环境感知+自动控制"。通过集成多种传感器模块,系统能够实时监测环境变化(光照强度、降雨情况等),并自动做出响应。主控芯片选用STM32F103C8T6,这是一款性价比极高的ARM Cortex-M3内核单片机,72MHz主频完全能满足本项目的实时性要求。
系统主要实现了以下智能化功能:
- 定时自动伸缩:通过DS1302时钟模块实现
- 光照感应控制:使用5516光敏电阻检测环境亮度
- 雨水检测保护:YS雨水传感器在检测到降雨时立即触发收回动作
- 多种控制方式:支持红外遥控、蓝牙手机控制和物理按键操作
- 状态实时显示:OLED屏幕提供系统状态反馈
2. 硬件系统设计与关键模块选型
2.1 主控芯片与核心电路
STM32F103C8T6作为主控芯片,具有以下优势:
- 48KB Flash + 20KB SRAM存储空间
- 37个GPIO接口,满足多外设连接需求
- 内置12位ADC,可直接读取模拟传感器信号
- 丰富的外设资源(USART、SPI、I2C等)
主控电路设计要点:
- 电源部分采用AMS1117-3.3V稳压芯片,为MCU和部分外设提供稳定3.3V电压
- 复位电路采用10kΩ上拉电阻+0.1μF电容的经典设计
- 调试接口引出SWD引脚,方便程序下载和调试
- 所有GPIO口都添加了保护电阻,防止过流损坏
注意:STM32的BOOT0和BOOT1引脚必须正确配置,本项目采用内置Flash启动模式(BOOT0=0,BOOT1=0)
2.2 传感器模块选型与电路设计
2.2.1 环境感知模块
光敏传感器:
选用5516光敏电阻,其特性如下:
- 光照强度范围:1-1000 Lux
- 响应时间:约20ms
- 电路设计采用分压原理,与10kΩ固定电阻组成电压 divider
光照值计算公式:
code复制Vout = 3.3V × (Rfixed / (Rfixed + Rphoto))
其中Rphoto随光照强度变化而变化
雨水检测模块:
YS系列雨水传感器特点:
- 工作电压:3.3-5V
- 输出形式:数字量(高低电平)和模拟量双输出
- 灵敏度可调电位器
- 本项目使用数字输出模式,直接连接STM32 GPIO
2.2.2 时钟模块
DS1302实时时钟模块关键参数:
- 计时精度:±2分钟/月(25℃)
- 工作电压:2.0-5.5V
- 接口:三线制SPI(CE, I/O, SCLK)
- 内置31字节RAM可用于数据存储
电路连接注意事项:
- 需外接32.768kHz晶振
- 备份电池建议使用CR2032纽扣电池
- 上拉电阻推荐值:4.7kΩ
2.3 执行机构设计
步进电机选型:
选用28BYJ-48型5V步进电机,参数如下:
- 步距角:5.625°/64(64步/转)
- 减速比:1/64
- 扭矩:≥34.3mN.m
- 相电流:约100mA
驱动电路:
ULN2003A达林顿阵列驱动芯片特点:
- 7路NPN达林顿管
- 每路500mA驱动能力
- 内置续流二极管
- 可直接驱动28BYJ-48电机
电机控制真值表:
| 步序 | IN1 | IN2 | IN3 | IN4 |
|---|---|---|---|---|
| 1 | 1 | 0 | 0 | 0 |
| 2 | 1 | 1 | 0 | 0 |
| 3 | 0 | 1 | 0 | 0 |
| 4 | 0 | 1 | 1 | 0 |
| ... | ... | ... | ... | ... |
2.4 人机交互模块
OLED显示模块:
选用0.96寸SSD1306驱动的OLED,特点:
- 分辨率:128×64
- 接口:I2C(节省IO口)
- 可视角度:>160°
- 工作电压:3.3V
按键输入设计:
采用3个独立按键实现功能控制:
- KEY1:模式切换(自动/手动)
- KEY2:参数+
- KEY3:参数-
每个按键都添加了10kΩ上拉电阻和0.1μF消抖电容
3. 软件系统设计与实现
3.1 系统整体架构
软件采用模块化设计,主要包含以下功能模块:
- 主控制循环
- 传感器数据采集
- 电机驱动控制
- 人机交互界面
- 通信协议处理
- 异常处理机制
程序流程图如下:
code复制初始化外设 → 主循环:
读取传感器数据 →
处理用户输入 →
执行控制逻辑 →
更新显示内容
3.2 关键驱动实现
3.2.1 步进电机驱动
c复制// 步进电机控制函数
void Stepper_Move(uint8_t dir, uint16_t steps) {
static const uint8_t phase[] = {0x09,0x08,0x0C,0x04,0x06,0x02,0x03,0x01};
static uint8_t current_phase = 0;
for(uint16_t i=0; i<steps; i++) {
if(dir == CW) {
current_phase = (current_phase + 1) % 8;
} else {
current_phase = (current_phase + 7) % 8;
}
GPIO_Write(GPIOB, phase[current_phase] << 4);
Delay_ms(2); // 控制转速
}
// 最后断电防止过热
GPIO_Write(GPIOB, 0x00 << 4);
}
3.2.2 光照传感器读取
c复制// 获取光照强度(0-100%)
uint8_t Get_Light_Level(void) {
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = 1;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
uint16_t adc_val = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);
// 转换为百分比
return (uint8_t)((adc_val * 100) / 4095);
}
3.3 多任务调度实现
由于STM32F103没有RTOS支持,采用时间片轮询方式实现多任务:
c复制void Main_Loop(void) {
static uint32_t tick = 0;
while(1) {
if(HAL_GetTick() - tick > 100) { // 100ms周期
tick = HAL_GetTick();
// 任务1:读取传感器
if(tick % 1 == 0) Read_Sensors();
// 任务2:更新显示(500ms周期)
if(tick % 5 == 0) Update_Display();
// 任务3:检查控制逻辑(200ms周期)
if(tick % 2 == 0) Check_Control_Logic();
}
// 实时处理用户输入
Process_User_Input();
}
}
4. 系统调试与优化
4.1 常见问题与解决方案
问题1:步进电机抖动或不转
- 检查ULN2003A供电是否足够(建议单独5V 1A电源)
- 确认电机相序接线正确
- 适当调整步进延迟时间(2-5ms)
问题2:光照检测不准确
- 校准传感器在不同光照下的ADC值
- 添加软件滤波(如移动平均)
- 避免传感器直接受强光照射
问题3:蓝牙连接不稳定
- 确保ECB02模块天线不受遮挡
- 检查电源稳定性(建议添加100μF电容)
- 调整蓝牙通信间隔(建议≥200ms)
4.2 性能优化技巧
-
电源管理优化:
- 添加100μF电解电容+0.1μF陶瓷电容组合
- 电机电源与MCU电源分开供电
- 不使用时关闭部分外设时钟
-
软件优化:
c复制// 使用寄存器操作替代HAL库提高速度 #define MOTOR_PORT GPIOB #define MOTOR_PHASE (0x0F << 4) void Stepper_Write(uint8_t pattern) { MOTOR_PORT->ODR = (MOTOR_PORT->ODR & ~MOTOR_PHASE) | ((pattern & 0x0F) << 4); } -
抗干扰设计:
- 所有长信号线添加100Ω电阻串联
- 模拟信号线使用屏蔽线
- 数字地模拟地单点连接
5. 实际应用效果
经过两周的实际使用测试,系统表现如下:
-
响应速度:
- 雨水检测到完全收回:平均1.2秒
- 光照变化响应时间:约3秒(防误触发延时)
-
可靠性:
- 雨天检测准确率:100%(测试15次)
- 定时控制误差:<±1分钟/周
-
功耗表现:
- 待机电流:约15mA
- 电机工作电流:约300mA
- 建议电源:5V 2A适配器
在实际安装时,我有几个小建议:
- 雨水传感器应倾斜30°安装,避免积水
- 光敏传感器避免朝向北面(反光影响)
- 电机传动部分定期添加润滑脂
- 蓝牙天线尽量远离金属物体
这个项目从构思到实现大约花费了三周时间,最耗时的部分是机械结构的调试和传感器的校准。通过这个实践,我深刻体会到嵌入式系统开发需要综合考虑硬件、软件和实际使用环境的多重因素。特别是在家居环境中,可靠性和安全性必须放在首位。