1. 项目概述
这个基于STM32单片机的电子项圈项目,是我去年为自家走失的柴犬设计的防丢解决方案。市面上同类产品要么价格虚高,要么续航拉胯,于是决定自己动手做一个真正实用的宠物定位器。核心功能包括实时GPS定位、电子围栏报警和运动轨迹记录,整套硬件成本控制在150元以内,待机时间可达72小时。
电子项圈由STM32F103C8T6作为主控,搭配SIM800L GSM模块和NEO-6M GPS模块实现通信定位功能。当宠物超出预设的电子围栏范围时,会通过短信和APP推送双重报警。相比商业产品,这个DIY方案最大的优势是可完全自定义功能,比如我增加了体温监测和运动量统计,后续还打算集成摄像头模块。
2. 硬件设计与选型
2.1 核心器件选型
主控选用STM32F103C8T6这颗性价比之王,72MHz主频足够处理定位数据,内置的硬件浮点单元能快速计算地理坐标。实测发现,用DMA方式接收GPS数据时CPU占用率不到5%。
GPS模块选择UBLOX NEO-6M而非更便宜的ATK模块,原因有三:
- 冷启动时间快30%(平均28秒)
- 定位精度可达2.5米(实测开阔地带)
- 自带EEPROM保存配置信息
通信模块选用SIM800L而非SIM900A,虽然体积稍大但支持四频段,在地下室等弱信号场景下仍能保持连接。特别注意要选择带MIC输入和SPK输出的版本,方便后期扩展语音功能。
2.2 电源管理设计
采用TP4056充电管理芯片+3.7V 2000mAh软包电池的方案,关键设计点:
- 充电电流设置为500mA(RPROG=1.2KΩ)
- 增加DW01保护电路防止过放
- 使用TPS61030升压芯片提供稳定3.3V
实测待机电流:
- 纯待机模式:0.15mA(RTC保持)
- GPS定位模式:45mA
- GSM通信峰值:350mA
重要提示:SIM800L启动瞬间电流可达2A,必须在VBAT引脚并联至少1000μF的钽电容!
2.3 传感器扩展接口
预留了以下扩展接口:
- I2C接口:连接BME280环境传感器
- ADC通道:监测电池电压(分压比2:1)
- USART3:备用串口可接蓝牙模块
- GPIO:外接震动马达和蜂鸣器
3. 软件架构实现
3.1 固件开发环境
使用Keil MDK开发环境,关键配置:
- 启用FPU硬件加速
- 设置串口1/2中断优先级为2
- 开启RTC日历功能
- 使用FreeRTOS任务调度
任务划分:
- Task1(高优先级):GPS数据处理
- Task2:GSM通信管理
- Task3:电子围栏计算
- Task4:传感器采集
3.2 GPS数据处理流程
c复制void GPS_Task(void *pvParameters) {
while(1) {
if(UART2_RxFlag) {
parseGNGGA(gpsBuffer); //解析NMEA语句
if(gpsData.valid) {
xQueueSend(gpsQueue, &gpsData, portMAX_DELAY);
updateGeofence(gpsData.latitude, gpsData.longitude);
}
UART2_RxFlag = 0;
}
osDelay(10);
}
}
特别注意:
- 使用环形缓冲区存储原始数据
- 只解析GNGGA和GNRMC语句
- 增加海拔高度滤波算法(滑动平均)
3.3 电子围栏算法
采用射线法判断位置是否在电子围栏内,关键步骤:
- 将预设围栏点按顺时针排序
- 从检测点向右发水平射线
- 计算与各边的交点数量
- 奇数在内部,偶数在外部
优化措施:
- 先进行快速矩形范围筛选
- 使用查表法存储常用围栏形状
- 定点数运算替代浮点运算
4. 实际应用测试
4.1 定位精度测试
在不同环境下的定位误差:
| 环境 | 平均误差 | 最大误差 | 定位耗时 |
|---|---|---|---|
| 开阔广场 | 2.1m | 4.3m | 25s |
| 小区楼下 | 5.7m | 11.2m | 38s |
| 地下停车场 | 无法定位 | - | - |
| 树木茂盛公园 | 8.3m | 15.6m | 42s |
4.2 电子围栏灵敏度
测试半径为50米的圆形围栏:
| 触发距离 | 响应时间 | 误报率 |
|---|---|---|
| 52m | 3.2s | 0% |
| 55m | 4.1s | 0% |
| 60m | 5.3s | 2% |
注意:误报多发生在高楼密集区,建议在城市使用时不小于80米半径
5. 常见问题解决方案
5.1 GPS模块无法定位
排查步骤:
- 检查天线阻抗匹配(应50Ω)
- 测量VCC电压(需3.3V±5%)
- 确认NMEA输出波特率(默认9600)
- 查看卫星锁定指示灯状态
5.2 SIM800L频繁掉线
优化方案:
- 在VBAT引脚加1000μF电容
- 设置AT+CREG=1注册网络
- 启用AT+CIPSHUT异常复位
- 调整AT+CFUN=1全功能模式
5.3 电池续航不足
省电技巧:
- 设置GPS 1Hz更新频率
- 启用GSM的PSM模式
- 关闭未用传感器电源
- 降低MCU主频至36MHz
6. 进阶改进方向
- 增加LoRa模块实现本地组网
- 集成MPU6050检测宠物异常行为
- 开发微信小程序替代短信通知
- 采用TinyML实现活动模式识别
这个项目最让我惊喜的是电子围栏的稳定性,经过三个月的实际使用,报警准确率达到98%以上。下次准备尝试改用STM32U5系列单片机,功耗可以再降低40%左右。