【STM32项目开源】基于STM32的智能宠物喂食系统物联网应用实战
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 物联网生态整合
未来可以考虑接入更多的物联网平台,比如华为云、阿里云等,实现多平台数据同步。还可以开发微信小程序,更方便地远程控制。
如果能打通宠物健康管理系统,记录宠物的体重、运动量等数据,结合进食数据给出健康建议,那就真正实现智能化宠物养护了。
做这个项目最大的收获不是做出了一个喂食器,而是把物联网技术的整个流程都跑通了。从传感器数据采集,到本地处理,再到云端传输和手机控制,每个环节都遇到了不同的问题,也都找到了解决方案。
更多推荐
所有评论(0)