1. 项目概述:智能存取柜系统设计
这个基于STM32的智能存取柜系统是我去年为校园快递中心开发的一个实际项目,经过三个月的迭代优化最终成型。整套系统整合了多种物联网技术,实现了从存件、取件到后台管理的全流程自动化。相比市面上常见的快递柜,我们增加了红外检测、语音交互和无线APP控制等创新功能,使得用户体验更加友好。
系统核心采用STM32F103C8T6作为主控,这是一款性价比极高的Cortex-M3内核单片机,72MHz主频完全能够满足我们的实时控制需求。我在项目中特别注重硬件选型的平衡性——既保证性能又控制成本,比如选用ISD1820语音模块而非更贵的MP3解码芯片,因为实际测试发现简单的语音提示并不需要高音质。
提示:STM32F103系列虽然性能不是最强,但其丰富的外设接口(5个USART、2个SPI、2个I2C)特别适合这种多模块集成的项目。
2. 硬件系统架构解析
2.1 核心控制单元
主控板采用最小系统板设计,包含:
- STM32F103C8T6(64KB Flash/20KB SRAM)
- 8MHz晶振+32.768kHz RTC晶振
- 复位电路(采用SP708S电压监控芯片)
- SWD调试接口
- 5V转3.3V LDO(AMS1117-3.3)
我在PCB布局时将数字电源和模拟电源分区处理,特别在语音模块供电路径上增加了π型滤波电路,实测可将底噪降低约40%。
2.2 功能模块选型
显示模块:
- 0.96寸OLED(SSD1306驱动)
- 分辨率128x64
- I2C接口(节省IO口)
无线通信:
- HC-05蓝牙模块(Class2,10米传输距离)
- 设置AT指令:AT+UART=115200,0,0
机械控制:
- 4个SG90舵机(180°旋转角度)
- PCA9685 PWM扩展板(I2C控制)
- 每个舵机工作电流约200mA,需单独供电
传感器模块:
- E18-D80NK红外避障传感器
- 检测距离3-80cm可调
- NPN常开型输出
语音模块:
- ISD1820录音芯片
- 支持20秒录音时长
- 直驱8Ω/0.5W喇叭
3. 软件系统设计与实现
3.1 系统工作流程
整个系统采用事件驱动架构,主程序流程图如下:
c复制void main() {
hardware_init();
while(1) {
switch(current_state) {
case IDLE:
handle_touch();
break;
case INPUT_MODE:
process_password();
break;
case SCAN_MODE:
generate_qrcode();
break;
// 其他状态处理...
}
check_infrared();
update_display();
}
}
3.2 关键算法实现
取件码生成算法:
c复制// 基于时间戳的随机数生成
uint32_t generate_code(uint8_t phone[11]) {
uint32_t seed = RTC->CNTL + (phone[0]<<24)|(phone[1]<<16)|(phone[3]<<8)|phone[5];
srand(seed);
return 100000 + (rand() % 900000);
}
二维码生成方案:
采用QR Code开源库,生成内容格式:
code复制ACTION:TAKE|PHONE:13812345678|TIME:202406151430
3.3 蓝牙通信协议设计
定义简单的帧结构:
code复制[HEAD][LEN][CMD][DATA][CRC]
- HEAD: 0xAA 0x55
- LEN: 数据长度
- CMD:
- 0x01 查询状态
- 0x02 开柜指令
- 0x03 设置参数
- DATA: 变长数据
- CRC: 累加和校验
4. 系统功能实现细节
4.1 存件流程实现
- 工作人员输入密码"123123"
- 系统验证通过后:
- 语音提示:"请选择空闲柜门"
- OLED显示可用柜门编号
- 选择柜门后:
- 舵机旋转90°(模拟开门)
- 语音提示:"请输入收件人手机号"
- 手机号输入完成后:
- 生成6位取件码
- 存储记录到EEPROM
- 语音播报:"存件成功,取件码是XXXXXX"
注意:EEPROM存储结构设计为循环队列,每个记录占32字节:
- 柜门号:1字节
- 手机号:11字节
- 取件码:4字节(存储数值)
- 时间戳:4字节
- 状态位:1字节
- 保留:11字节
4.2 取件功能实现
取件码取件:
- 用户输入6位取件码
- 系统遍历EEPROM查找匹配记录
- 找到后:
- 控制对应舵机开门
- 语音播报:"请取走您的包裹"
- OLED显示柜门编号
- 更新记录状态为"已取件"
扫码取件:
- OLED显示动态二维码(每30秒刷新)
- APP扫码后发送开柜指令
- 系统验证手机号匹配性
- 执行开柜操作
5. 特殊功能实现
5.1 红外检测功能
E18模块检测逻辑:
c复制void check_infrared() {
if(HAL_GPIO_ReadPin(INFRARED_GPIO_Port, INFRARED_Pin) == GPIO_PIN_RESET) {
play_sound(OBSTACLE_WARNING);
HAL_Delay(3000); // 持续报警3秒
}
}
5.2 语音播报优化
通过实验发现,在语音播放期间关闭OLED刷新可以显著降低杂音。实现方式:
c复制void play_sound(int index) {
OLED_Clear();
// 触发语音模块...
while(IS_BUSY_PIN_HIGH());
OLED_Refresh();
}
6. 移动端APP设计
6.1 用户端功能
- 手机号绑定验证
- 存件状态查询
- 扫码取件功能
- 取件记录查看
关键Activity交互流程:
java复制public class TakeActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// 初始化蓝牙连接
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// 二维码扫描回调
mScannerView.setResultHandler(this);
}
}
6.2 管理端功能
- 柜门状态监控
- 远程开柜控制
- 消毒/照明控制
- 数据统计分析
7. 系统调试与优化
7.1 常见问题排查
问题1:舵机偶尔不响应
- 原因:电源功率不足
- 解决:增加4700μF电容稳压
问题2:蓝牙连接不稳定
- 原因:天线附近有金属干扰
- 解决:调整模块位置,增加PCB天线长度
问题3:语音杂音大
- 原因:电源纹波干扰
- 解决:增加LC滤波电路
7.2 性能优化记录
- 将OLED刷新率从60Hz降至30Hz,CPU负载降低15%
- 采用差分更新策略,二维码刷新仅更新变化区域
- 实现EEPROM的磨损均衡算法,延长寿命
8. 项目总结与改进方向
经过实际部署测试,这套系统平均取件时间控制在8秒以内,错误率低于0.5%。有几个值得分享的经验:
- 电源设计要预留至少30%余量,我们的第一版设计因为低估了多舵机同时工作的电流需求,导致稳压芯片过热
- STM32的硬件I2C确实不太好用,最终改用软件模拟反而更稳定
- 红外传感器安装角度很关键,需要多次调整才能获得最佳检测范围
下一步计划加入人脸识别开柜功能,正在测试OV2640摄像头模块的驱动移植。同时发现如果用F4系列替换F1,可以轻松实现H.264视频编码,为远程监控提供可能。