1. 系统整体设计思路

做这个智能宠物投喂系统的时候,我一开始就想好了要解决几个实际问题:主人不在家时宠物会不会挨饿?食物储备够不够?水质干不干净?这些都需要一个完整的解决方案。我选择用STM32作为主控芯片,主要是因为它性能稳定、外设丰富,而且我之前在好几个项目里都用过,比较熟悉。

整个系统其实可以分为三个主要部分:硬件感知层、网络传输层和应用控制层。硬件部分负责采集各种数据,比如食物重量、环境温湿度、水位情况,还有宠物是否在进食的状态;网络部分用ESP8266和ESP32-CAM搞定无线连接和图传;应用层就是手机APP和云端平台,让主人可以随时随地查看和控制。

我特别注重多传感器数据的融合处理,因为单个传感器可能会有误差或者盲区。比如重量传感器可能会因为震动产生波动,红外传感器在强光环境下可能不太准,把这些数据综合起来分析,就能得到更可靠的判断。实际测试下来,这种多传感器融合的策略确实让系统更加智能和可靠。

2. 硬件设计与元器件选型

2.1 STM32主控模块

我选用的是STM32F103C8T6这款芯片,性价比很高,有足够的GPIO口和通信接口来连接各种传感器。它自带ADC模块可以直接读取模拟传感器的数据,多个定时器可以同时处理舵机控制和传感器采样,还有USART接口用来和WiFi模块通信。

在实际接线时,要注意电源部分的去耦设计。我在每个电源引脚附近都加了0.1uF的电容,数字地和模拟地之间用0欧电阻隔离,这样能减少噪声干扰。STM32的晶振电路也要尽量靠近芯片,走线要短,不然可能会影响系统稳定性。

2.2 传感器模块选型

重量传感器我选的是HX711模块配合称重传感器,量程5kg,精度能达到0.1g,完全够用。接线时要注意传感器本身的应变片很敏感,机械结构要固定好,不然读数会漂。我在程序里做了滑动平均滤波,这样重量数据就比较稳定了。

温湿度用的是DHT11,虽然精度不是最高的,但胜在便宜好用。红外传感器用了HC-SR501,用来检测宠物是否在进食区域。水位检测用了个简单的浮子开关,成本低而且可靠。

2.3 无线通信模块

ESP8266负责主要的网络通信,我用的是ESP-01S模块,体积小而且便宜。它通过串口和STM32通信,配置成STA模式连接家里的WiFi。我在代码里实现了自动重连机制,万一网络断了能自己尝试重新连接。

ESP32-CAM专门负责图像传输,它自带摄像头和WiFi功能,可以直接输出JPEG图像。我把它配置成AP模式,手机APP直接连接它获取视频流,这样就不需要经过云端中转,延迟更低。

2.4 执行机构设计

投食机构我用的是SG90舵机加上自制的阀门结构,通过PWM信号控制开合角度。调试时发现舵机在启动瞬间电流很大,会导致电源电压波动,所以我在电源部分加了个大电容缓冲,效果很好。

蜂鸣器用来做报警提示,比如食物不足或者水位过低时会发出声音提醒。OLED显示屏显示当前状态,方便本地查看。整个系统的供电用了一个5V/2A的电源适配器,加上AMS1117-3.3给单片机供电。

3. 软件架构与通信协议

3.1 STM32嵌入式程序设计

程序用了FreeRTOS实时操作系统,这样可以把不同任务分开管理。我创建了四个主要任务:传感器数据采集、网络通信处理、执行机构控制和状态显示。每个任务有独立的优先级,保证关键任务能及时响应。

传感器采集任务每100ms读取一次数据,包括重量、温湿度和红外状态。读取后先进行数据滤波处理,然后用一个专门的数据融合算法计算最终结果。网络通信任务负责通过串口和ESP8266交互,采用AT指令配置模块和传输数据。

// 示例代码:重量传感器读取与滤波
#define FILTER_LEN 10
static uint32_t weight_buffer[FILTER_LEN];
static uint8_t filter_index = 0;

uint32_t read_filtered_weight(void)
{
    uint32_t raw_weight = HX711_Read();
    weight_buffer[filter_index] = raw_weight;
    filter_index = (filter_index + 1) % FILTER_LEN;
    
    uint32_t sum = 0;
    for(int i = 0; i < FILTER_LEN; i++) {
        sum += weight_buffer[i];
    }
    return sum / FILTER_LEN;
}

3.2 MQTT通信协议实现

MQTT协议我选择是因为它特别适合物联网场景,轻量而且支持发布订阅模式。设备作为客户端连接到MQTT服务器,定时发布传感器数据到特定的topic,同时订阅控制topic接收来自APP的指令。

数据格式我用JSON封装,这样可读性好而且扩展方便。比如传感器数据包看起来是这样的:

{
    "device_id": "pet_feeder_001",
    "weight": 250,
    "temperature": 25.6,
    "humidity": 60.2,
    "water_level": 1,
    "feeding": 0,
    "timestamp": 1637824332
}

我在代码里做了重发机制,如果发布失败会自动重试几次。同时设置了遗言消息,万一设备异常离线,服务器会收到通知,APP就能显示设备离线状态。

3.3 多传感器数据融合策略

这是系统的核心智能所在。单个传感器数据可能不可靠,比如重量传感器可能会因为震动产生波动,红外传感器在特定光照条件下可能误判。我把多个传感器的数据融合起来,用加权算法得到更准确的状态判断。

比如判断宠物是否在进食,我会综合红外传感器信号、重量变化趋势和最近投喂时间。只有多个条件都满足,才认为是有效的进食状态。实际测试中,这种多传感器融合的方法大大减少了误判。

4. ESP32-CAM图传实现

4.1 硬件连接与配置

ESP32-CAM模块本身就是一个完整的系统,有ESP32芯片和OV2640摄像头。我把它和主控系统分开供电,因为图传时功耗比较大,单独供电更稳定。接线方面主要连接了电源和几个IO口用于控制。

在配置摄像头参数时,我选择了QVGA分辨率(320x240),帧率15fps,这样既能保证流畅度,又不会占用太多带宽。图像质量参数调整了好几次,最终找到了在室内光线条件下效果最好的设置。

4.2 视频流服务器搭建

我在ESP32-CAM上跑了两个服务:一个是HTTP服务器用于提供网页界面,另一个是视频流服务器。视频流用的是MJPG格式,每个帧都是独立的JPEG图片,这样即使某帧传输错误也不会影响后面的帧。

为了优化传输效率,我调整了JPEG的压缩质量,在清晰度和带宽之间找到了平衡点。实际测试在一般的家庭WiFi环境下,延迟可以控制在200-300ms左右,完全能满足监控需求。

4.3 手机APP集成显示

APP端显示视频流其实很简单,就是用标准的VideoView组件,数据源设置为ESP32-CAM的IP地址和端口。我做了自动重连机制,网络波动时会自动重新连接。

在APP里我还加了截图和录像功能,方便主人记录宠物的有趣瞬间。视频流传输和传感器数据显示是独立的,这样即使视频传输占用较多带宽,也不会影响关键传感器数据的及时更新。

5. 手机APP设计与实现

5.1 开发环境与框架选择

APP我用Android Studio开发,语言是Java。界面布局用了ConstraintLayout,适配不同尺寸屏幕效果很好。网络通信用了OkHttp库,比原生HttpURLConnection更好用。

数据格式解析用了Gson库,把MQTT收到的JSON字符串转换成Java对象。图表显示用了MPAndroidChart库,可以很直观地展示温湿度变化趋势。

5.2 主要功能界面设计

主界面显示当前状态概览:食物剩余量、水温湿度、设备在线状态。点击各项可以进入详细页面查看历史数据和调整设置。

投喂控制界面可以手动控制舵机投放食物,有单次投放和定时投放两种模式。定时投放可以设置多个时间段,比如早晚各一次,非常灵活。

设置界面可以调整各种阈值参数,比如食物不足报警阈值、温度适宜范围等。所有设置都会保存到云端,即使换手机也不会丢失。

5.3 数据通信与实时更新

APP通过MQTT协议与设备通信,订阅设备发布的topic接收实时数据,同时向控制topic发送指令。我用了MQTT的QoS 1等级,保证重要指令至少送达一次。

数据更新用了观察者模式,当收到新数据时自动更新界面显示。为了节省电量,当APP切换到后台时,会减少数据更新频率,但关键报警信息还是会及时推送。

6. 系统调试与优化

6.1 常见问题与解决方案

调试过程中遇到了不少问题。最开始是电源噪声导致重量读数不稳定,后来加了滤波电容和软件滤波算法就好了。WiFi连接有时会不稳定,我增加了心跳包机制和自动重连逻辑。

ESP32-CAM的图传刚开始延迟很大,发现是默认的图像质量设置太高,降低分辨率和帧率后就好了。手机APP有时收不到数据更新,是因为MQTT连接被系统休眠机制断开了,加了持久化连接和心跳保持就稳定了。

6.2 性能优化技巧

电源管理方面,我做了动态功耗调整。当宠物不在进食区域时,降低传感器采样频率;夜晚时关闭图传功能,只保持基本监控。这样整体功耗降低了约40%。

数据传输方面,对传感器数据做了差分压缩,只有变化超过一定阈值时才发送新数据,减少了网络流量。图片传输用了自适应压缩,网络好时用高质量,网络差时自动降低质量。

6.3 实际使用测试

我在自己家猫身上测试了两周,系统运行很稳定。自动投喂功能很实用,出门几天也不用担心猫咪饿着。图传画质足够看清猫咪在做什么,延迟也在可接受范围内。

电量消耗方面,待机时整个系统功耗约3W,图传时约7W。按本地电费计算,一个月电费也就几块钱,完全可以接受。报警功能很及时,有次水位低了马上收到通知,避免了缺水问题。

7. 扩展功能与改进方向

现在的系统已经能满足基本需求,但还有很多可以改进的地方。比如可以加个语音模块,投食时发出呼唤声音,让宠物形成条件反射。或者加个喂药功能,需要给宠物吃药时特别有用。

机器学习算法也值得尝试,通过分析宠物进食习惯,自动调整投食时间和分量。甚至可以做个体重监测,如果发现宠物变胖了就自动减少投食量。

硬件方面可以考虑太阳能供电,这样就更省电环保。或者加个4G模块,即使家里停电断网了也能通过蜂窝网络保持连接。这些扩展功能都留给了未来的版本迭代。

做这个项目最大的体会就是,物联网系统设计要综合考虑硬件、软件和用户体验。每个部分都要精心设计和调试,任何一个环节出问题都会影响整体效果。实际开发中遇到的问题远比想象的多,但解决问题的过程也最有成就感。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐