手把手教你用STM32+Air780EG做个宠物追踪器(附Android App源码)
从零打造低功耗宠物追踪器:STM32+Air780EG实战指南
家里那只总爱溜出门的橘猫又不见了?每次带狗狗去公园都担心它跑丢?作为铲屎官兼技术爱好者,我花了三个月时间迭代了五版硬件方案,终于做出续航30天的宠物定位器。本文将分享如何用STM32F103C8T6蓝丸子和Air780EG模块,打造一套带电子围栏的追踪系统。
1. 硬件选型与低功耗设计
1.1 核心器件选型对比
市面上的4G模组五花八门,经过实测对比,Air780EG在功耗和价格上表现突出:
| 型号 | 待机电流 | 定位精度 | 单价(元) | 特色功能 |
|---|---|---|---|---|
| Air780EG | 1.2mA | 基站50m | 68 | 内置TCP/IP协议栈 |
| EC200T | 2.1mA | GPS 5m | 92 | 支持GNSS |
| SIM7600CE | 3.8mA | GPS 5m | 145 | 全网通支持 |
提示:宠物追踪不需要米级精度,基站定位完全够用。实测在市区环境下,Air780EG的LBS定位误差约30-80米。
1.2 电源管理实战技巧
要让设备持续工作30天,电源设计是关键:
// STM32低功耗配置示例 void Enter_StopMode(void) { HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后需要重新配置时钟 SystemClock_Config(); }硬件上建议:
- 采用TP4056充电管理+3.7V 1200mAh软包电池
- 添加HT7333 LDO为STM32供电
- 使用MOSFET控制4G模块电源通断
实测数据:
- 持续工作模式:续航约72小时
- 10分钟唤醒一次:续航可达28天
- 运动触发唤醒:续航35天+
2. 固件开发关键实现
2.1 模块初始化最佳实践
很多开发者遇到的第一个坑就是模块初始化失败。经过反复测试,这套初始化序列成功率最高:
- 硬件复位保持至少500ms低电平
- 发送ATE0关闭回显
- 检查SIM卡状态
- 等待网络附着完成
- 配置MQTT参数
// 稳定的初始化流程 void Air780EG_Init_Sequence(void) { HAL_GPIO_WritePin(RST_GPIO_Port, RST_Pin, GPIO_PIN_RESET); HAL_Delay(600); HAL_GPIO_WritePin(RST_GPIO_Port, RST_Pin, GPIO_PIN_SET); Send_AT_Command("ATE0\r\n", "OK", 2000); while(Send_AT_Command("AT+CPIN?\r\n", "READY", 1000) != 0); while(Send_AT_Command("AT+CGATT?\r\n", "+CGATT:1", 5000) != 0); }2.2 定位数据优化处理
基站定位原始数据往往包含多余信息,这段代码可以高效提取经纬度:
void Parse_Location(char* raw, float* lat, float* lon) { char *p = strchr(raw, ','); if(p) { *lat = atof(p+1); p = strchr(p+1, ','); if(p) *lon = atof(p+1); } }建议添加移动判断逻辑,只有位置变化超过50米时才上传数据,可节省80%的流量。
3. Android端功能实现
3.1 百度地图SDK集成要点
新版百度地图SDK(5.3.0)需要特别注意:
- 在AndroidManifest.xml添加网络权限
- 在Application初始化时设置AK
- 添加以下proguard规则:
-keep class com.baidu.** {*;} -keep class vi.com.** {*;}地图轨迹绘制代码示例:
// 绘制宠物活动轨迹 private void drawPath(List<LatLng> points) { OverlayOptions options = new PolylineOptions() .width(10) .color(Color.RED) .points(points); mBaiduMap.addOverlay(options); }3.2 电子围栏智能提醒
利用Geofence API实现越界报警:
// 创建电子围栏 public void addGeofence(double lat, double lng, float radius) { Geofence fence = new Geofence.Builder() .setCircularRegion(lat, lng, radius) .setExpirationDuration(Geofence.NEVER_EXPIRE) .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_EXIT) .build(); GeofencingRequest request = new GeofencingRequest.Builder() .addGeofence(fence) .build(); LocationServices.getGeofencingClient(this) .addGeofences(request, getGeofencePendingIntent()); }当宠物离开安全区域时,App会推送类似这样的通知: "⚠️ 叮当已离开安全区域!当前位置:朝阳公园东门"
4. 云端配置与数据分析
4.1 阿里云物联网平台规则引擎
设置异常位置报警规则:
- 进入规则引擎 > 创建规则
- 编写SQL处理设备上报数据:
SELECT deviceName() as deviceName, timestamp('yyyy-MM-dd HH:mm:ss') as time, abs(params.Longitude - 116.404)*100000 as offset FROM "/sys/+/+/thing/event/property/post" WHERE abs(params.Longitude - 116.404)*100000 > 50000- 配置邮件/短信通知动作
4.2 历史轨迹存储方案
建议采用组合存储策略:
- 最近7天数据:存储在阿里云表格存储
- 长期数据:转存到OSS降低成本
- 热数据:使用Redis缓存加速查询
轨迹查询API响应示例:
{ "code": 200, "data": [ { "time": "2024-03-15 08:00", "location": "39.9042,116.4074", "address": "北京市东城区" }, { "time": "2024-03-15 08:05", "location": "39.9088,116.3975", "address": "北京市朝阳区" } ] }5. 产品化改进建议
5.1 外壳与佩戴方案
经过多次迭代,推荐这些配件组合:
- 3D打印防水外壳(TPU材料)
- 硅胶项圈固定套件
- 防拆磁吸扣设计
实测防水等级:
- IP67:可承受1米水深30分钟
- 防尘:完全防止灰尘进入
5.2 量产成本控制
小批量(100台)BOM成本分析:
| 部件 | 单价(元) | 备注 |
|---|---|---|
| STM32F103C8 | 12.5 | 国产替代型号 |
| Air780EG | 68 | 含天线 |
| 电池 | 8.8 | 1200mAh聚合物锂电池 |
| PCB | 3.2 | 四层板设计 |
| 外壳 | 6.5 | 批量注塑 |
| 合计 | 99 | 不含组装人工 |
把玩着最终版的追踪器,看着App上实时更新的猫咪位置,突然觉得这三个月掉的头发都值了。特别提醒:第一次部署时记得设置合理的电子围栏半径,我家猫因为初始范围设太小,第一天就报了28次警...
