以下是我设计的低成本、自动化且“智能”的猫粮喂食器。
特点:
- 每天给你的猫喂两次食
- 只提供“推荐”的口粮配给
- 检测到你的猫正在进食,并在你的手机上收到通知
- 看到你的猫正在吃东西
规格参数:
- 大容量猫粮容器(可储存约1个月的猫粮)
- 抗干扰系统
- 防蚂蚁系统
- 防溢出系统
价格:不到40欧元(是的,没错……详见BOM文件)
概述
2017年,我出版了这本著作。这个项目的初稿从那以后,这台喂猫机每天都在正常运行。其机械结构至今未变,多年来也充分证明了自身的可靠性。
软件方面也经历了变革:先是尝试使用人工智能(当时效果不佳),接着用旧智能手机当作网络摄像头,如今则采用了一种更为紧凑且价格低廉的解决方案!
以下是它在 2017 年的样子:
遗憾的是,奇查(视频中的我的猫咪)去年已经去世了,今天的视频里它不会出现了。。。。
经验教训
以下是我们在8年日常运营中总结出的经验教训:
- 蚂蚁特别喜欢偷吃东西……比如把盘子放在地板上,第二天盘子里就会爬满蚂蚁。所以盘子必须要悬空放置,避免直接接触地面。
- 猫是猎手,它总是更偏爱松鼠、鸟类或老鼠,而非小孩子。要是给它喂同样多的食物,第二天盘子里就会剩下很多(甚至会被蚂蚁吃掉!)
- 狗粮就像一个“三维俄罗斯方块游戏”,它们往往会掉落、堆积在一起,堵塞喂食器。因此,配备可靠的防堵塞功能是必不可少的。
- 比如,要想休一个月的假,配备大容量喂食器是必不可少的。但同样重要的是,要能及时发现喂食器里的食物已经吃完了。
- 收到关于你的猫正在进食的通知固然有趣,但这种提醒应该只在猫真正在吃东西时触发,而不是当有人站在猫粮盘前时发出!
- 能看到你的猫咪正在进食,这真是个贴心的功能。虽然不是必需的,但确实很有趣啊!
让我们来看看这些担忧是如何得到解决的。
机械设计
机械设计基于一个金字塔形漏斗,该漏斗将狗粮投放到一个大型螺旋输送机上进行输送。
蠕虫螺丝由一个360度遥控舵机和两个齿轮驱动。
一个360度伺服电机可以实现顺时针或逆时针方向的连续旋转。
然后用几颗螺丝将盖子固定住,以便让齿轮保持原位。
抗干扰能力:
为防止堵塞蜗轮,系统通过软件实现双向运动控制(可观看第一段视频)。这种设计能有效震动饲料颗粒,助其从料斗落入蜗轮中,完成输送过程。
为了避免在“前进”过程中阻塞蜗轮,在料斗的前侧粘贴了一块橡胶唇。这块柔软的唇会吸收所有的阻力,配合前后移动的动作,防止任何卡塞现象。相信我,这个方法确实有效!
正如您在这张图片中看到的,一根PVC管被插入到蜗轮周围,管顶部开有一个槽口,用于让狗粮颗粒落入蜗轮内部。
聚氯乙烯(PVC)非常适合实现管道内的无摩擦运动。它强度高、质地柔软,且表面自然光滑
给这道菜称重
给菜肴称重这个办法,能一举解决上述提到的诸多难题!
- 这种装置能让食物悬浮在地面之上,防止蚂蚁吃掉狗粮。
- 猫咪进食时,餐盘的重量会逐渐减轻。这是一种巧妙检测“猫咪进食”行为的方式。
- 每当猫粮掉落时,我们就能精确测量出想要投喂给猫咪的份量,并停止蠕轮的运转。
- 若盘子尚未空置,我们只会将食物准确地装满至盘子容量,避免出现食物溢出的情况。
- 如果狗粮没有掉落,那要么是卡住了,要么是料斗空了。系统会将相关通知推送到你的智能手机上。
- 最后,视频中的绿色餐盘位于3D打印餐盘之上。你可以轻松将其取下进行清洗,以保持其清洁。
因此,在料斗下方加装了一个称重传感器,它就相当于一个厨房秤了!
外墙组装
最后,如图所示,在料斗周围添加了木制围墙。这些围墙是用3D打印的支脚和5毫米的木螺丝固定在一起的。切割18毫米胶合板的尺寸已包含在3D打印部件的配套文件中(.dxf文件格式)。
以下是其爆炸图:将所有这些部件组装起来相当简单直接。
如您所见,前面板上钻有孔洞,用于安装摄像头和运动探测器(红外传感器)。
打印猫粮喂食器
大部分零件都是用PLAフィラメント打印出来的。
最大的部件是料斗!不过,它可以在我的 Prusa i3 Mk2 打印机上直接打印,无需任何支撑结构。
螺旋钻必须尽可能坚固且表面尽可能光滑。因此,它采用ABS丝材进行打印制造。
为了让它更坚固并避免使用支撑结构,螺旋钻被横向切割成两半进行打印。随后用丙酮将其粘合在一起。最后还用丙酮对其表面进行了打磨处理(详见下文)。下面介绍一下怎么做这件事)
打印其他所有部件都很简单,也不需要任何支撑结构!
那个大齿轮也是用ABS材料打印的,然后用螺丝固定并粘贴到螺旋钻上的。
请注意,打印ABS材料并非易事,而且需要将打印机置于封闭环境中,以避免出现翘曲问题。详情请参见点击这个链接,就能轻松制作一个简单的视频了。!
盖子也是用PLA材料打印的,它被切割成四个部分,以便能适配我的普瑞萨i3 mk2S打印机。随后,这些部件被用环氧胶粘贴在一个平面上,组装成完整的盖子。
若要打印所有部件:打开.STL文件,如果需要的话可以更换耗材(如果没有ABS或PLA,PETG会是个不错的选择)。如果有必要,还可以调整喷嘴直径(我用的是0.6mm的,这样打印部件会更快),然后就可以开始打印了!
等这一切都完成后,你的自动喂食器就差不多完成了……不过还是缺一些电子元件!
电子产品
原理图
微控制器
系统的核心是一个 。爱思泰克 ESP32-CAM 微控制器。这是一款价格低廉但性能强大的32位双核微控制器,你可以轻松对其进行编程操作。阿杜伊诺集成开发环境
这款微控制器配备了一枚微型的OV2640相机,像素数仅为200万,像素密度极低,但用来监控我们的猫咪再合适不过了!
其中有几个输入
这些产品我大部分都用过!
- 使用IO12和IO13来控制称重传感器驱动器HX711。
- 使用 IO15 来控制遥控伺服电机
- 通过IO12端口获取PIR传感器的信号。
- 使用 IO1、IO2 和 IO0 来刷新固件
- 使用 IO14 来配置 Wi-Fi 并进行称重传感器校准。
所使用的传感器
360度伺服控制系统:
一个360度伺服电机能够实现顺时针或逆时针方向的连续旋转。PWM信号仅能控制旋转方向和速度(无法控制位置)。
这些舵机很容易采购到:速卖通上的伺服电机产品
它们的尺寸是标准的:40.8*20.2*28.5毫米。
需要一款配备金属齿轮且扭矩大于10公斤·厘米的模型。当发生卡住的情况时,蜗轮可以向狗粮输送装置施加强大的推力……
被动红外传感器
多核微控制器
它会被红外传感器通过中断信号唤醒。
,我选的这款是价格最便宜的一款:HC-SR501
白色圆顶罩可以拆卸,这样传感器就能安装进 3D 打印部件,并从前壁内部观察猫咪的情况了。
每当有物体经过喂食器前方时,PIR传感器的输出信号就会变为高电平,从而唤醒ESP32微控制器。
称重传感器
称重传感器将测量食物的重量。
,我选择了一个1公斤的称重传感器。该设备需要一个HX711放大器来转换其测量值。
称重传感器与放大器之间的连接遵循以下电路原理图:
编程ESP32-CAM开发板
遗憾的是,这款微控制器
确实有很多解决方案。我选择了这个:CP2102 USB转串口转换器
稍后我们会讲解如何使用它。
印刷电路板
我设计了一块美观紧凑的 PCB,能够容纳 ESP32 微控制器,并实现所有传感器的连接。
我的第一个版本没有使用PCB板,一切都是通过线缆连接的!有几位用户让我制作一个。现在终于完成了,不得不说组装起来确实简单多了!
该印刷电路板由 PCBWay 友情赞助,质量一如既往地出色。
您可以在此处下单:PCBWay 共享项目价格实惠,送货速度超快,而且看起来特别专业!
若您是 PCBWay 的新用户,请使用以下合作链接:https://pcbway.com/g/o35z4O
这款PCB板将所有用于各个模块的原生连接器一一暴露出来,焊接起来简直易如反掌!
只有USB连接器的焊接比较“困难”,但这并非必要步骤(详见下文)。
完整的物料清单可在本网站的“文件”板块中查阅。
权力考量
电路板为ESP32微控制器及所有传感器提供5V直流电源。伺服电机同样由5V电源供电,其最大电流需求可达1安培或更高。因此,若智能手机充电器的输出电流超过1A(2A则更为理想),便可用于为该系统供电。
您可以将 5V 电源直接连接到 USB 接口(PW)或 PCB 板上的针脚接口(PW1)上。
软件:ESP32固件
猫粮自动分配器的固件可在以下网址获取:我的GitHub页面
您可以在那里找到编译和配置您的 catFeeder 所需的一切资源。
安装 Arduino 开发板
你需要安装 Aduino IDE 软件:https://www.arduino.cc/en/software
然后,你需要为你的ESP32开发板添加一个参考链接。只需打开偏好设置,在“附加开发板管理器网址”中添加以下链接即可:https://espressif.github.io/arduino-esp32/package_esp32_index.json
然后,你应该能在“开发板管理器”菜单中看到你的ESP32开发板了。
书店的布置
编译你的CatFeeder之前,你需要安装几个库... 其中大部分库都可以通过库管理器进行安装。
股票代码显示屏用于伺服控制
WiFi管理器用于配置您的 Wi-Fi 登录信息
时间用于 NTP 时间同步
网址编码用于WhatsApp通知的模板
完成以上所有操作后,你应该能够顺利编译你的自动喂食器程序,毫无错误!
解压缩GitHub 项目然后在集成开发环境
你应该能看到 5 个已打开的文件
我只修改了.ino文件。其他四个文件都是原始文件,来自AI-Thinker 仓库它们可能是“旧版”,但确实能和我用的电路板兼容!
你可以尝试编译一下,应该能成功,但我们需要深入研究源代码,调整一些参数设置。
而且我还得解释一下怎么刷入固件……
刷新固件
将USB转串口转接器连接到猫粮喂食器上。别忘了短接JP1跳线。这会将GIO0引脚接地,使ESP32进入引导加载程序模式。
请勿连接加密狗上的5V或+3.3V电源(但当然可以将其插入电脑的USB接口!)。相反,请将+5V电源连接到你的开发板上,然后点击编译按钮。几秒钟后,固件就会成功上传。
移除JP1上的跳线,并重置ESP32(或断开/重新连接+5V电源)。你的智能喂食器就会启动了!
配置无线网络
若要配置无线网络,只需按照以下步骤操作即可:
我用过这款产品。ESP32 WifiManager 库能够在ESP32开发板上输入Wi-Fi凭证。
因此,如果你重启主板(或通过重置按钮将其重置)同时触摸 PCB 上的 "CAL50" 触摸板时,随后,ESP32会启用一个名为"JP eCatfeeder"的Wi-Fi热点,用户可以通过该热点连接任何智能手机(或个人电脑)。
连接到它后,系统会自动打开一个配置窗口。
点击“配置 Wi-Fi”按钮,选择一个你已知晓其密码的现有 Wi-Fi 网络并输入相关信息!ESP32 将重启并连接到你的路由器。
你的ESP32开发板现在已经配置好了Wi-Fi功能,你可以用它来监控你的猫咪,并接收相关通知啦!
要是你没有无线网络也没关系,你的智能喂食器依然能正常工作,不过就是无法使用那些“智能功能”而已!
微信通知
你的猫咪还能给你发送WhatsApp通知呢!
很简单……我使用了 CallMeBot 服务,将短信通知发送到我的手机上。
去呼叫我机器人页面然后在你的手机上通过WhatsApp按照提示操作即可。
你会收到一条包含API密钥的消息。
允许 CallMeBot 向您发送通知后,您需要在源代码中配置您的电话号码和 API 密钥(第 145 行)。
//WhatsApp 通话机器人:https://www.callmebot.com/blog/free-api-whatsapp-messages/
// +国际国家代码 + 电话号码
// 法国 +33,示例:+36010100101
字符串 phoneNumber = "+YOUR_PHONE";
字符串 apiKey = "您的 API 密钥";
现在你可以再次编译你的代码了,这样你应该就能收到来自你的猫咪的消息了!
每日饲料配给的校准工作
无论何种类型的猫粮喂食器,都必须进行校准操作:
- 称重操作应在秤盘空置的情况下进行。首先,启动自动喂食器,待其启动完成后,再在其进入深度睡眠状态(约40秒)前,持续按压电路板上的CAL50触摸板4秒钟(按压时间需超过3秒但不超过6秒)。整个操作就这么简单!
- 完成称重后,应校准每日喂食量。将所需的猫粮放入托盘,启动喂食器,待其启动完成后,按住CAL50触摸板持续7秒钟(时间超过6秒亦可)。
针对上述每项操作,您都会收到WhatsApp通知,提醒您确认校准结果。
喂食时间已写入代码,但用户可以轻松更改这些时间设置(第255行/第256行)。
FeedHour1 = preferences.getInt("FeedHour1", 7);
喂食时间2 = 偏好设置中的整数值 "FeedHour2",默认值为20;
我的确会在早上7点和晚上8点给猫喂食!这意味着猫粮分配器会将其时钟与NTP时间同步(看看代码,你会发现这一点的!)
你可能还会注意到,我用50克的饲料量对喂食器进行了校准。不过由于显示屏上永远不会显示实际重量,你可以随意设定所需的饲料量。即使你把80克当作50克来输入,校准功能依然能正常工作 :-)
看着你的猫咪吃东西的样子
既然你能看到这段长长的描述的结尾,那说明你渴望得到回报,期待看到自己的猫咪进食的场景吧。
它是如何运作的?
1)PIR传感器检测到物体后,会触发ESP32的启动程序。
只需要两行代码就能实现这个功能!
您需要为 GPIO 定义一个位掩码:
#define PIR_PIN_BITMASK 0x4 // 十六进制表示的 2^2(指数即 GPIO 引脚编号)
并且,当该 GPIO 信号变为高电平时,您可以启用外部中断功能,将 ESP32 从深度睡眠状态中唤醒。
esp_sleep_enable_ext1_wakeup(PIR_PIN_BITMASK, ESP_EXT1_WAKEUP_ANY_HIGH); // 这段代码将用于进入深度睡眠状态,并在 GPIO2 引脚电压升高时唤醒设备。
2)现已成功启动ESP32,并进入了设置程序界面。
3)这样一来,你就能准确称出盘子里的食物重量了。刚在启动后进入设置程序时
平均重量 = 获取原始重量();
平均重量 = 校准零值 - 平均重量;
平均重量 = 平均重量 * 50.0 / 卡路里数;
实时体重 = 平均体重;
4)你在循环程序中不断重复做同一件事情。
要是你发现猫咪体重有变化,那就说明你的猫(或者邻居家的猫!)正在进食。
若((平均体重 - 实时体重)的绝对值大于10.0)且(发送进食信号为真) // 如果体重变化超过10克,则说明猫正在进食 {
SendAlarm = true;
混乱场面 = "猫正在吃东西。直播链接在此 \n\"http://";
消息 += IpAddress2String(WiFi.localIP());
消息内容 += ":81/stream\"";
SendEating = false; // 清除标志,仅发送一次通知! }
实时体重 = 平均体重; // 并更新实时体重数据
5)喂食器会发送一条通知。(仅此一次)
6)如果您点击该链接,你将可以观看你家猫咪的实时直播画面。:
正如我所说,我的猫奇查已经去世了,所以我从网上找了张照片来充数(还把照片模糊处理了一下,以免侵犯版权!)。对不起,约瑟夫!
请注意,该网址是本地的。如果你想在全球任何地方通过互联网观看你的猫咪,那么我需要对此进行特殊设置。端口转发您需要在您的无线路由器上进行相关设置,以便将该地址暴露到家庭网络之外。(操作步骤简单,但具体步骤会因路由器型号而异,所以这里就不详细说明了!)
7)最后,循环结束时,ESP32 将进入深度睡眠状态若您未连接到直播流(超时时间为50秒),并且PIR传感器前方没有任何物体移动的话。
ESP32 会根据 PIR 传感器的触发信号,或者在你设定好的特定时间段内自动唤醒,以便为你的猫咪喂食!
if ((millis() - Timeout) > 50000) // 如果超过40秒仍未建立连接,则进入睡眠状态 {
#if defined DEBUG_OUT
serial.println("连接超时 --> 立即停止");
#endif
doStop = 1; //强制停止
if ((doStop == 1) && (digitalRead(PIR_PIN) == LOW)) {
浮点数 hourDec 的计算公式为:hour() + minute() / 60 + second() / 3600。
浮点数 sleepTimeDec;
若(hourDec > FeedHour2),则 timeToSleepDec 应设为 24 + FeedHour1 - hourDec 。
否则,如果小时数小于喂奶时间1,那么睡眠时间应为喂奶时间1减去当前小时数。
否则,睡眠时间减去的值为:FeedHour2 - hourDec。
serial.print("将睡眠(小时数):");
serial.println(timeToSleepDec);
睡眠时间 = 3600 * 睡眠时间系数;
serial.print("将睡眠(秒数):");
serial.println(睡眠时间);
esp_sleep_enable_timer_wakeup(timeToSleep * uS_TO_S_FACTOR); //允许定时器唤醒设备进入深度睡眠状态
serial.println("现在要去睡觉了");
延迟200毫秒;
esp_deep_sleep_start(); // 如果PIR传感器处于关闭状态且超时未被触发,则进入深度睡眠模式
』
标签
模型来源
