随着控制部分ESP32C3代码的完成,整个项目就算基本完成了。我这里是以面包板搭建的ESP32C3控制电路,电路框图如下:

供粮部分的机构:

程序工作流程:

在我的程序中,上下限被定死为60、120。
最终作品图:

主程序代码使用Arduino开发:
#include "motor.h"
#include "hx711.h"
#include "display.h"
#include "post.h"
#include "life.h"
// 猫粮的重量(初始化时去除盘子的重量)
long weight = 0;
void setup() {
Serial.begin(115200);
delay(100);
// 初始化WIFI接线
initPost();
// 初始化OLED显示屏
initDisplay();
// 初始化HX711
initHX711();
// 初始化步进电机
initMotor();
// 初始化生命检测传感器
initLife();
// 设置1ms定时中断
timer.attach_ms(1, onTick);
delay(2000);
// 显示屏初始化,显示标题等必要的信息
dispTitle();
// 初始化,取得当前重量
calibrateZero();
// 清除信息区
clearInfo();
}
void loop() {
//Serial.println("Start loop...");
weight = getWeight(); // 猫粮重量
// 测试重量
dispWeight(weight);
// 检查猫进食情况
checkEating();
delay(1000);
}
// 检查猫进食情况
uint8_t isEatingFlag = 0;
// 请求电机动作的信号,1-启动;0-停止
uint8_t stepDirectRequst = 0;
// 检查猫猫是否在进食
void checkEating() {
uint8_t flag = isEating();
// 发现猫过来进食了?
// 是:检查当前猫粮是否足够60克
// 不足指定量(60克):启动电机,开始补充猫粮
// 猫粮超过120克?
// 否:什么也不做
// 是:关闭电机,停止补充
// 否:关闭电机,停止补充
if (flag) {
//Serial.println("is Eating...");
if (isEatingFlag == 0) {
//Serial.println("isEatingFlag 0 -> 1");
Serial.println("Eating...");
isEatingFlag = 1;
dispInfo("Eating...");
if (WiFi.status() == WL_CONNECTED) {
// 猫猫来进食,发送信息给服务器保存
Serial.println("sendFormDataToServer(1)");
sendFormDataToServer(1, weight);
}
}
// 检查当前猫粮是否足够60克。
if (weight < 60) {
// 猫粮不足
//Serial.println("weight < 60");
// 启动电机
if (stepDirect == 0) {
//Serial.println("Start motor.");
stepDirect = 1; // 继续转
}
}
// 猫粮超过120克?防止加过量
if (weight >= 120) {
//Serial.println("weight >= 120");
stepDirectRequst = 1;
}
} else {
//Serial.println("is Leaving...");
// 离开,不在进食状态
if (isEatingFlag == 1) {
isEatingFlag = 0;
dispInfo("Leave.");
Serial.println("Leave.");
//Serial.println("Leave...");
if (WiFi.status() == WL_CONNECTED) {
// 猫猫离开,发送信息给服务器保存
Serial.println("sendFormDataToServer(2)");
sendFormDataToServer(2, weight);
}
}
// 请求停止电机,由定时中断判断什么时候停
stepDirectRequst = 1;
}
}整机测试:
在初始状态下,猫盘中不加猫粮,这样初始化阶段获取的重量是包括了猫盘的重量,方便后面准确猫粮计算。需要加粮的时候,称重获取的重量去除初始重量后,得到的就是猫粮的重量。目前猫粮补充的上下限量,固定在程序中。测试时以黄豆代替猫粮进行测试。称重那一块,拆解了一款家用厨房电子称,将自己的传感器和称重模块HX711内置到原来的电子称中。
测试之前,要保证WIFI打开,先将树莓派5 的Ubuntu启动起来,最后再给控制装置加电,以免后面控制装置在发送信息给服务器时失败,导致信息不能及时记录过程信息。
测试中还发现一个问题,在使用微运动感知传感器场合,猫粮掉落一样会让传感器产生检测感知信号,而这个信号对于检测猫猫是否来进食这一状况是一个错误的信号。解决办法是:
1、安装这个位运动感知传感器时,必须保证正确的安装位置,保证猫粮的掉落不会影响它的正常工作。
2、换用生命检测传感器,比如LD2410B,只对生命活体的存在产生信号。
下面是测试视频链接以及在运行过程中服务器端数据库数据的的变化:
1、测试视频
测试视频有两个,一个是测试不足下限、超过上限的测试;一个是模拟多次进食、离开过程中,根据猫粮的量决定是否驱动电机、补充猫粮的处理。
视频链接:https://pan.baidu.com/s/1zVwfTxzycU8uvBbeOsG8SQ
提取码:eepw
2、测试产生的数据库记录
其中food_water=1的是来进食的记录;food_water=2的是离开的记录。

对于家中有宠物猫的,及时给猫提供猫粮及水,是铲屎官必须要做的事情之一。通常猫粮是特制的,有一定的气味。有些铲屎官因为工作等原因,往往会一次性提供太多的猫粮。这样的话,猫粮长期暴露在空中,会慢慢失去猫粮的香味,容易使猫失去胃口。有了这样的装置,将猫粮平时封闭于容器之中,当猫猫过来进食的时候,才补偿一定量的猫粮。猫粮不足,会自动补充。
其实最初的时候,我也是考虑过补水也按照这个思路去操作。但经验发现,水这种东西,时间长了一定会长绿苔。更何况供水的碗基本上得每天一刷洗,所以这个装置对于水来说,有点鸡肋的赶脚。
我要赚赏金
