1. 项目背景与需求痛点

作为一个养了两只猫的嵌入式工程师,我经常因为加班或者短期出差,没法按时给家里的主子们喂食。市面上虽然有一些智能喂食器,但要么功能太简单只能定时,要么价格贵得离谱,而且很少有能真正满足多场景需求的。最让我头疼的是,很多产品连最基本的环境监测都没有,更别说手机远程控制了。

于是我自己动手,用STM32设计了一款智能宠物喂食系统。这个系统不仅能定时定量喂食,还能监测环境温湿度、光照强度,甚至能通过手机APP远程查看宠物状态和控制喂食。整个项目成本不到200元,但功能比市面上千元级的产品还要丰富。

如果你也是宠物主人,或者对嵌入式开发感兴趣,这个项目绝对值得一试。不需要太高深的编程基础,只要会C语言和基本的电路知识,就能跟着我一步步完成这个实用的物联网项目。

2. 系统整体设计框架

2.1 硬件架构设计

整个系统的核心是STM32F103C8T6单片机,这款芯片性价比超高,72MHz的主频完全够用,外设资源丰富,最重要的是社区资料很多,遇到问题很容易找到解决方案。

围绕主控芯片,我设计了几个关键模块:传感检测模块负责采集环境数据,包括温湿度、光照强度、水位和食物重量;执行控制模块包括步进电机(控制出粮)、水泵(补水)和LED灯(补光);人机交互模块有OLED屏幕和按键;通信模块选用ESP8266 WiFi模块,用来连接机智云平台。

这种模块化设计有个很大的好处——每个部分都可以独立调试。比如你可以先搞定传感器数据采集,再去做执行控制,最后再加上物联网功能。即使某个模块出了问题,也不会影响其他部分的正常工作。

2.2 软件架构设计

软件部分采用分层设计,底层是硬件驱动层,包括GPIO、PWM、I2C、USART等基础驱动;中间是设备控制层,负责舵机控制、传感器读取和RTC管理;上层是应用逻辑层,实现定时喂食、手动触发等功能;最顶层是交互与通信层,处理OLED显示、按键输入和WiFi通信。

我特意把业务逻辑和硬件驱动分开,这样以后如果想换其他型号的单片机或者传感器,只需要修改底层驱动,上层代码基本不用动。这种设计让代码的复用性和可维护性都大大提高。

3. 硬件选型与电路设计

3.1 核心控制器选择

为什么选STM32F103C8T6?其实最开始我也考虑过Arduino或者ESP32,但综合比较下来还是STM32最合适。Arduino性能有点弱,ESP32虽然自带WiFi但外设资源不如STM32丰富。STM32F103C8T6有64KB Flash和20KB RAM,运行FreeRTOS都没问题,而且价格只要十几块钱,真的是性价比之王。

这款芯片有3个USART、2个I2C、2个SPI,还有11个定时器,完全能满足我们的需求。比如可以用TIM3产生PWM信号控制舵机,用USART1和ESP8266通信,用USART3调试输出,还有多余的接口可以扩展其他功能。

3.2 传感器选型与使用

温湿度传感器我用的是DHT11,虽然精度不是最高,但胜在便宜好用,几块钱一个,精度对于宠物环境监测完全够用。光照检测用的是光敏电阻,通过ADC采集电压值,再换算成光照强度。水位传感器也是基于电阻原理,两个电极浸入水中时电阻变化,通过ADC读取。

最核心的是称重传感器,我选用HX711模块配合称重传感器。这里有个坑要注意:称重传感器需要校准,我采用的是两点校准法,先测空载时的AD值,再测已知重量(比如100克)时的AD值,然后就能建立线性关系。实际使用中发现,温度会影响精度,所以最好每次使用前都先去皮归零。

3.3 执行机构设计

出粮机构我用的是28BYJ-48步进电机配合ULN2003驱动板。这种电机扭矩足够推动宠物粮,而且价格便宜。控制精度方面,每步5.625度,64步为一圈,通过减速箱后输出轴每圈需要2048步,这样的精度控制出粮量足够了。

水泵选用的是5V微型潜水泵,直接从宠物饮水机中抽水补水。LED灯片用来模拟补光灯,实际应用中可以根据需要换成真正的植物生长灯。所有执行机构都通过继电器模块控制,避免电机反向电动势对主控芯片造成干扰。

4. 物联网连接与通信实现

4.1 ESP8266与STM32通信

ESP8266是我最推荐的WiFi模块,价格不到10元,但功能强大。我选用的是ESP-01S型号,体积小,功耗低。STM32通过串口与ESP8266通信,波特率设置为115200。通信协议采用AT指令,虽然有点繁琐,但稳定性很好。

在实际调试中发现,ESP8266上电时需要一定的启动时间,所以STM32上电后要延迟2秒再初始化串口。另外,ESP8266工作时电流较大,最好单独供电,或者在主电源上并联一个大电容,避免电压波动导致模块重启。

4.2 机智云平台接入

选择机智云是因为它对个人开发者免费,而且提供了完整的数据点定义和设备接入方案。在机智云平台上创建产品后,系统会自动生成设备密钥和产品密钥,这些信息需要烧录到ESP8266中。

机智云的数据点定义很关键,要根据实际需求仔细规划。我定义了这些数据点:温度、湿度、光照强度、水位、食物重量为只读数据点;喂食开关、补水开关、补光开关为可写数据点;自动手动模式切换为枚举型数据点。每个数据点都有对应的地址和长度,在代码中要严格对应。

4.3 手机APP远程控制

机智云提供了标准版的APP,可以直接使用,也支持自定义开发。我直接用了他们的公版APP,扫描设备二维码就能绑定设备。在APP上可以实时查看所有传感器数据,远程控制喂食、补水、补光,还能设置自动模式下的各种阈值。

远程控制的关键是实时性,我测试过从手机操作到设备响应,延迟一般在1-2秒内,完全满足使用需求。数据上传频率设置为每10秒一次,既保证了实时性,又不会给网络带来太大压力。

5. 软件实现与核心代码解析

5.1 主程序框架

主程序采用轮询方式,在while循环中不断检测各种状态。为了不阻塞程序运行,我用了定时器中断来处理实时性要求高的任务。比如传感器数据采集放在定时器中断中,每1秒执行一次;按键检测和状态处理在主循环中执行。

int main(void)
{
    // 初始化所有外设
    delay_init();
    OLED_Init();
    uart3_init(9600);    // ESP8266通信
    uart1_init(115200);  // 调试输出
    HX711_Init();
    KEY_Init();
    DHT11_Init();
    Adc_Init();
    Control_Init();
    DS1302_Init(&SysDate);
    Uln2003_Init();
    TIME_Config();        // 定时器初始化

    while(1)
    {
        if(Time_Period[0] > 1000){
            get_all_sensor_data();    // 采集传感器数据
            Time_Period[0] = 0;
        }
        Key_event_handle();           // 按键处理
        // 页面显示更新
        if(page_num == 1){
            OLED_Show_FirstPage();
        }else if(page_num == 2){
            OLED_Show_SecondPage();
        }else if(page_num == 3){
            OLED_Show_ThirdPage();
        }
        Sensor_Data_Handle();         // 数据处理和执行控制
    }
}

5.2 传感器数据采集与处理

传感器数据采集要考虑抗干扰处理。比如DHT11偶尔会读取失败,需要加入重试机制。称重传感器 readings 会有波动,采用滑动平均滤波处理。光照和水位传感器用的是ADC采集,也做了软件滤波。

void get_all_sensor_data()
{
    // 温湿度读取,失败重试3次
    for(int i=0; i<3; i++){
        if(DHT11_Read_Data(&temp, &hum) == 0)
            break;
        delay_ms(100);
    }
    
    // 称重数据,连续采样5次取平均
    int32_t sum = 0;
    for(int i=0; i<5; i++){
        sum += HX711_GetData();
        delay_ms(10);
    }
    value = sum / 5;
    weight = (float)(value - reset) * Weights / (float)(Weights_100 - reset);
    
    // ADC采集的光照和水位数据
    Get_Water_Value(&Water_Value);
    Get_Light_Value(&Light_Value);
    
    // 读取RTC时间
    DS1302_DateRead(&SysDate);
}

5.3 控制逻辑实现

控制逻辑分为手动模式和自动模式。手动模式下完全由用户控制;自动模式下系统根据设定的阈值自动执行相应操作。模式切换可以通过按键或者手机APP完成。

void Sensor_Data_Handle()
{
    if(auto_mode == 0){    // 手动模式
        if(water_flag == 1){
            water = 1;    // 打开水泵
        }else{
            water = 0;    // 关闭水泵
        }
        
        if(led_flag == 1){
            LED = 1;      // 打开补光灯
        }else{
            LED = 0;      // 关闭补光灯
        }
        
        if(food_flag == 1){
            Stepper_RotateByLoop(1, 1, 1);  // 步进电机转动一圈
            food_flag = 0;
        }
        
        // 定时喂食判断
        if(SysDate.hour == timeone && SysDate.min == timetwo && SysDate.sec == 0){
            food_flag = 1;
        }
    }else if(auto_mode == 1){    // 自动模式
        // 食物重量低于阈值,自动喂食
        if(weight < weight_door){
            Stepper_RotateByLoop(1, 1, 1);
        }
        
        // 水位低于阈值,自动补水
        if(Water_Value < level_door){
            water = 1;
        }else{
            water = 0;
        }
        
        // 光照强度低于阈值,自动补光
        if(Light_Value < light_door){
            LED = 1;
        }else{
            LED = 0;
        }
    }
}

6. 实际应用与效果测试

6.1 硬件组装与调试

组装时最大的挑战是出粮机构的设计。我试验了好几种方案,最后采用螺旋推进式结构,用步进电机带动螺旋杆旋转,把粮食推出去。这种方案出粮均匀,不容易卡粮,而且可以精确控制出粮量。

电路连接方面,建议先用面包板搭建测试电路,所有功能调试OK后再制作PCB。电源部分要特别注意,电机工作时电流较大,最好单独供电。我在实际使用中加了两个电容滤波,有效避免了电压波动导致的系统重启。

6.2 功能测试结果

经过一周的测试,系统运行稳定。定时喂食误差在1分钟以内,出粮量误差小于5%。温湿度监测与专业温湿度计对比,误差在2%以内。远程控制响应时间平均1.5秒,完全满足使用需求。

功耗方面,待机时整个系统功耗约0.5W,电机工作时瞬间功耗达到5W,所以电源适配器最好选择12V/2A的。如果要用电池供电,需要计算好电池容量,或者增加低功耗设计。

6.3 遇到的问题与解决方案

遇到最头疼的问题是WiFi偶尔断连。后来发现是ESP8266供电不足,在模块的VCC和GND之间加了一个100μF的电容后问题解决。另一个问题是称重传感器读数漂移,通过软件滤波和定期自动去皮解决了。

步进电机有时会失步,特别是在重载启动时。解决方法是在电机驱动代码中加入加速度控制,启动时慢慢加速,停止时慢慢减速,这样就不再失步了。

7. 项目优化与扩展方向

7.1 硬件优化建议

下一步我打算换成STM32F407,性能更强,可以跑更复杂的算法。传感器方面考虑升级为DHT22,精度更高;称重传感器换成更大量程的,适合大型宠物使用。

电源部分可以加入电池备份,这样即使停电系统也能继续工作。还可以增加太阳能充电板,实现完全自给自足的供电系统。

7.2 软件功能扩展

软件方面计划增加喂食记录功能,统计宠物每天的进食情况,生成报表。还可以加入智能学习算法,根据宠物的进食习惯自动调整喂食时间和量。

另一个方向是增加图像识别功能,加上摄像头模块,识别是哪个宠物在进食,甚至能识别宠物体重变化,及时调整喂食量。

7.3 物联网生态整合

未来可以考虑接入更多的物联网平台,比如华为云、阿里云等,实现多平台数据同步。还可以开发微信小程序,更方便地远程控制。

如果能打通宠物健康管理系统,记录宠物的体重、运动量等数据,结合进食数据给出健康建议,那就真正实现智能化宠物养护了。

做这个项目最大的收获不是做出了一个喂食器,而是把物联网技术的整个流程都跑通了。从传感器数据采集,到本地处理,再到云端传输和手机控制,每个环节都遇到了不同的问题,也都找到了解决方案。

Logo

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

更多推荐