作为一名长期从事嵌入式系统开发的工程师,我最近完成了一个基于STM32的宠物狗自动投喂系统项目。这个系统的设计初衷源于我自己的亲身经历——由于工作繁忙,经常无法按时回家给爱犬喂食,导致它要么饿肚子,要么一次性吃太多。传统定时喂食器又无法根据实际余粮情况自动补充,于是萌生了开发一套更智能的解决方案的想法。
系统核心功能包括:
关键设计理念:不仅要实现自动化,更要模拟主人日常喂养的"人性化"操作。比如投喂前会有蜂鸣提示,给宠物适应时间;水温加热不会过高,保持在25-30℃最适饮用范围。
经过对比Atmega328P、ESP32和STM32F103C8T6三款主流微控制器,最终选定STM32F103C8T6(俗称"蓝莓派")作为核心控制器。这个选择基于以下考量:
性能需求:
开发便利性:
成本控制:
选用HX711搭配5kg称重传感器,分辨率达0.1g。实际测试中发现几个关键点:
采用YW-J型光电液位传感器而非传统浮球式,优势在于:
DS18B20防水型号直接浸入水中测量,注意:
| 模块 | 型号 | 关键参数 | 注意事项 |
|---|---|---|---|
| 时钟 | DS1302 | 精度±2ppm | 需备份电池 |
| 显示 | SSD1306 0.96" OLED | 128x64 | 避免长时间静态显示 |
| WiFi | ESP8266-01S | 802.11 b/g/n | 需外接天线 |
| 电机 | JGA25-370 | 6V/100rpm | 加装减速齿轮 |
| 水泵 | DC3-6V微型泵 | 流量120L/h | 定期清洗防堵塞 |
STM32最小系统包含:
重要经验:电源输入端务必加TVS二极管防护,我曾在电机启停时因电压尖峰烧毁过芯片。
HX711与STM32连接方案:
code复制HX711_DOUT --> PA0
HX711_SCK --> PA1
称重传感器采用全桥接法,注意应变片要对称粘贴。
YW-J传感器仅需3.3V供电,输出直接接PC13,内部上拉。
DS18B20采用寄生电源模式:
code复制VDD --┐
├-- 4.7k上拉 --> PB0
GND --┘
电机和水泵通过5V继电器控制,驱动电路要点:
采用前后台系统设计:
c复制void main() {
hardware_init();
wifi_connect();
while(1) {
check_sensors();
process_feed_logic();
update_display();
handle_buttons();
wifi_handler();
}
}
原始数据波动较大,采用滑动平均+阈值滤波:
c复制#define SAMPLE_SIZE 10
static int32_t weight_samples[SAMPLE_SIZE];
int32_t get_filtered_weight() {
static uint8_t index = 0;
weight_samples[index++] = HX711_Read();
if(index >= SAMPLE_SIZE) index = 0;
int32_t sum = 0;
for(int i=0; i<SAMPLE_SIZE; i++) {
sum += weight_samples[i];
}
return sum/SAMPLE_SIZE;
}
c复制void check_feeding_time() {
if(rtc.hour == feed_time[0] && rtc.min == 0 && rtc.sec < 3) {
buzzer_beep(3);
if(current_weight < min_weight) {
motor_on();
while(get_filtered_weight() < max_weight);
motor_off();
}
}
// 同样处理其他两个喂食时间
}
ESP8266采用AT指令通信,关键流程:
c复制void wifi_handler() {
if(USART2_RX_flag) {
if(strstr(USART2_RX_BUF, "GET /feed")) {
manual_feed();
sprintf(tx_buf, "HTTP/1.1 200 OK\r\nContent:喂食完成");
ESP8266_SendData(tx_buf);
}
USART2_RX_flag = 0;
}
}
现象:静止状态下重量值缓慢变化
原因:HX711基准电压不稳
解决:
现象:ESP8266每隔几分钟重连
解决:
现象:电机运行时温度读数异常
解决:
功耗优化:
稳定性提升:
用户体验改进:
系统连续运行测试数据:
| 指标 | 测试结果 | 行业标准 |
|---|---|---|
| 投喂时间误差 | ±1秒/天 | ±30秒/天 |
| 重量控制精度 | ±2g | ±10g |
| 水位保持误差 | ±3mm | ±10mm |
| 温度控制精度 | ±0.5℃ | ±2℃ |
| WiFi响应时间 | <500ms | <2s |
用户反馈:
在实际使用中,我发现还可以进一步优化:
机械结构改进:
功能扩展:
低功耗优化:
这个项目给我的最大启示是:嵌入式开发不仅要考虑技术实现,更要深入理解应用场景。比如最初设计时没考虑到宠物会扒拉食盆导致重量检测异常,后来增加了防扒设计才解决问题。每个细节的完善都让系统更可靠实用。