手把手教你用STM32+Air780EG做个宠物追踪器(附Android App源码)

发布时间:2026/7/7 4:13:31

手把手教你用STM32+Air780EG做个宠物追踪器(附Android App源码) 从零打造低功耗宠物追踪器STM32Air780EG实战指南家里那只总爱溜出门的橘猫又不见了每次带狗狗去公园都担心它跑丢作为铲屎官兼技术爱好者我花了三个月时间迭代了五版硬件方案终于做出续航30天的宠物定位器。本文将分享如何用STM32F103C8T6蓝丸子和Air780EG模块打造一套带电子围栏的追踪系统。1. 硬件选型与低功耗设计1.1 核心器件选型对比市面上的4G模组五花八门经过实测对比Air780EG在功耗和价格上表现突出型号待机电流定位精度单价(元)特色功能Air780EG1.2mA基站50m68内置TCP/IP协议栈EC200T2.1mAGPS 5m92支持GNSSSIM7600CE3.8mAGPS 5m145全网通支持提示宠物追踪不需要米级精度基站定位完全够用。实测在市区环境下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(ATCPIN?\r\n, READY, 1000) ! 0); while(Send_AT_Command(ATCGATT?\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(p1); p strchr(p1, ,); if(p) *lon atof(p1); } }建议添加移动判断逻辑只有位置变化超过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(ListLatLng 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成本分析部件单价(元)备注STM32F103C812.5国产替代型号Air780EG68含天线电池8.81200mAh聚合物锂电池PCB3.2四层板设计外壳6.5批量注塑合计99不含组装人工把玩着最终版的追踪器看着App上实时更新的猫咪位置突然觉得这三个月掉的头发都值了。特别提醒第一次部署时记得设置合理的电子围栏半径我家猫因为初始范围设太小第一天就报了28次警...

相关新闻