1. 项目概述
最近在做一个基于STM32的低功耗蓝牙防丢器项目,这个防丢器可以和手机APP配对,当距离超出安全范围时会双向报警。作为一个经常丢三落四的人,我觉得这个项目特别实用。下面我会详细分享整个开发过程,包括硬件选型、电路设计、STM32固件开发和Android APP开发。
这个防丢器的核心功能包括:
- 通过BLE蓝牙与手机配对连接
- 基于RSSI信号强度检测距离
- 超出安全距离时双向报警(防丢器端蜂鸣+震动,手机端声音+震动)
- 超低功耗设计,使用纽扣电池供电,续航可达1-2个月
2. 硬件设计与选型
2.1 核心组件选择
在选择硬件时,我主要考虑三个因素:低功耗、易用性和成本。经过对比,最终确定的方案如下:
主控芯片:STM32L051C8T6
- 选择理由:L0系列是ST专门为低功耗设计的MCU,在STOP模式下电流仅0.5μA
- 替代方案:也可以使用nRF52系列,但开发环境对新手不太友好
蓝牙模块:HC-08 BLE4.0模块
- 选择理由:价格便宜(约15元),支持AT指令配置,UART接口简单易用
- 注意点:工作电压是3.3V,不能接5V
供电方案:CR2032纽扣电池
- 容量:220mAh
- 电压:3V
- 续航计算:按平均电流100μA计算,理论续航=220mAh/0.1mA=2200小时≈91天
2.2 电路设计要点
在设计电路时,有几个关键点需要注意:
-
低功耗设计:
- 所有未使用的GPIO要设置为浮空输入
- 外设(蜂鸣器、马达)不使用时完全断电
- 使用STOP模式,仅保留UART和外部中断唤醒
-
电源管理:
- 增加一个10μF的滤波电容
- 在电池正极串联一个肖特基二极管,防止反接
-
蜂鸣器驱动:
- 无源蜂鸣器需要PWM驱动
- 串联1kΩ限流电阻
- 工作频率设置在2kHz左右
3. 固件开发
3.1 开发环境搭建
使用STM32CubeMX+Keil MDK的开发环境:
- 安装STM32CubeMX并下载STM32L0系列HAL库
- 安装Keil MDK-ARM和STM32L0器件包
- 使用ST-Link或USB转TTL工具下载程序
3.2 关键代码实现
低功耗管理:
c复制void Enter_STOP_Mode(void)
{
// 关闭不用的外设时钟
__HAL_RCC_GPIOB_CLK_DISABLE();
__HAL_RCC_GPIOC_CLK_DISABLE();
// 配置唤醒源
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
// 进入STOP模式
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 唤醒后重新初始化时钟
SystemClock_Config();
}
BLE数据处理:
c复制void BLE_Process_Data(uint8_t *data)
{
// 解析RSSI值
if(strstr(data, "RSSI:")){
int rssi = atoi(data+5);
if(rssi < -70){ // 超出安全距离
Trigger_Alarm();
}
}
// 处理手机指令
if(strstr(data, "FIND_DEVICE")){
Trigger_Alarm();
}
}
4. Android APP开发
4.1 开发环境
使用Android Studio开发,主要用到以下API:
- BluetoothAdapter:管理蓝牙设备
- BluetoothLeScanner:扫描BLE设备
- BluetoothGatt:连接和通信
4.2 关键功能实现
BLE设备扫描:
java复制private void startScan() {
if (!mBluetoothAdapter.isEnabled()) {
// 请求打开蓝牙
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
return;
}
mBluetoothLeScanner.startScan(mScanCallback);
new Handler().postDelayed(() -> {
mBluetoothLeScanner.stopScan(mScanCallback);
}, SCAN_PERIOD);
}
RSSI监控:
java复制private void monitorRssi() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if(mBluetoothGatt != null){
mBluetoothGatt.readRemoteRssi();
}
mHandler.postDelayed(this, 1000);
}
}, 1000);
}
5. 系统调试与优化
5.1 功耗测试
使用万用表测量不同模式下的电流:
- 运行模式:4.2mA
- STOP模式:1.8μA
- 广播模式:0.6mA
- 报警状态:12mA
5.2 RSSI校准
通过实测发现,RSSI和距离的关系不是线性的。我制作了一个校准表:
| 距离(m) | RSSI(dBm) |
|---|---|
| 0.5 | -45 |
| 1 | -55 |
| 2 | -65 |
| 5 | -75 |
| 10 | -85 |
5.3 常见问题解决
问题1:BLE连接不稳定
- 解决方法:调整HC-08的广播间隔(AT+ADVI=500)
问题2:误报警
- 解决方法:增加RSSI滤波算法,取5次平均值
问题3:电池续航短
- 解决方法:优化STOP模式下的GPIO配置,关闭所有不用的外设时钟
6. 项目总结
这个防丢器项目从硬件选型到软件开发完整走了一遍,有几个关键经验值得分享:
- 低功耗设计要从硬件和软件两方面入手
- RSSI测距受环境影响大,需要现场校准
- BLE连接参数需要根据应用场景优化
整个项目的物料成本约50元,如果量产可以降到30元以内。后续还可以增加GPS定位、OLED显示等功能。