sunbeat 发表于 2024-4-22 02:19

支持小爱同学的ESP32+MG995做的自动喂鱼器

本帖最后由 sunbeat 于 2024-4-22 13:32 编辑

项目源码地址:
https://github.com/sunhanaix/FeedFish


## 简述

本项目基于ESP32做主控+MG995做舵机,做一个户外给鱼自动喂食的装置。

可以通过小爱同学,进行语音控制喂食;

可以通过web页面,进行状态查看,日志查看,喂食操作,定时设置;

可以根据定时设置情况,按定时计划,执行对应操作(比如喂食,比如重启自己);

[操作视频](https://www.bilibili.com/video/BV1Sw4m117XV)

## 功能描述

**1. ESP32部分**

在ESP32启动时,舵机先做一个初始化,正转一定时间,反转一定时间;

然后ESP32开始向自己的MQTT服务器发送一些状态信息(启动通知,执行动作通知等),订阅相关的主题(/xxx/servo/action),当收到类似{'act':'xx'}请求时,

act为query:查询当前连接信息,计划任务信息,将信息扔给MQTT的/xxx/servo/data;

act为reboot:重启自己;

act为do:执行一次喂鱼操作;

act为set_cfg:获得cfg_data(计划任务配置信息),将之写入boot.ini,然后重启自己,确保新任务生效;

由于ESP32的micropython不支持threading,在执行多个任务时,尽可能通过while循环来进行某个任务的执行;

计划任务的配置格式,参考linux的crontab配置格式(只是一个简易实现,仅完成部分简化功能);

由于之前没有操作过舵机,看淘宝上MG995是360度的,想着360度比180度的好,就买的这个。调试时发现,它没法儿像其它舵机那样,精确到某个角度。

MG995只能给它正转指令或者反转指令。然后它就开始转起来,停不下来了。

直到你再给它一个停止指令,它再停下来。

> MG995舵机的中点位置是1500微秒(usec), 脉冲宽度范围是500到2500微秒,死区宽度是8微秒。

> 舵机的控制信号通常遵循以下规律: 当脉冲宽度小于中点位置时,舵机向一个方向转动。 当脉冲宽度大于中点位置时,舵机向相反方向转动。

> 当脉冲宽度等于中点位置时,舵机停止转动。 因此由脉冲宽度范围是500到2500微秒可知,

> 当设置pwm.duty_ns(2500*1000)时,舵机反转速度最大

> 当设置pwm.duty_ns(500*1000)时,舵机正转速度最大

也就这么将就着用了。考虑舵机功率,从ESP32的VIN和GND引电(有5V)。

怕舵机启动时电流过大,给它正负极之间加了一个470uF的电容。

实际测了下,不加电容的话,带负载情况下启动舵机,电压在5V,电流在90mA-220mA之间,基本也还能接受。

连接如图:

!(https://www.sunbeatus.com/img/conn_pic.png)

为了在户外防雨,是把esp32和舵机放在外卖汤盒里面。

给汤盒钻了两个眼儿,一个插usb线供电,一个把舵机那个转轴露出到外面。

漏眼儿的地方,用热熔胶封上,避免进水。

矿泉水瓶子上把舵机戴的帽子用热熔胶固定在矿泉水瓶上。

矿泉水瓶上方瓶身处,用烧红的铁丝,扎许多洞洞,将来倒置它时,鱼食从此处流出来。

为了防止下雨等情况,给瓶身脖子处,拿塑料袋剪裁一个小裙子,也是热熔胶固定下。

下面是整个喂鱼器的完整外观,如下图:

![物理外观](https://www.sunbeatus.com/img/whole_face.png)

esp32会每隔一分钟,向主题/xxx/servo/log向mqtt服务器发送自己的心跳信息。

考虑到可能在线升级程序代码,给esp32增加了通过mqtt传送文件的部分,实现自己的“OTA”

**esp32涉及的程序文件目录为:iot_dev**

- > *pwm_servo.py* 这个是舵机操控部分代码

- > *act_mqtt.py* 这个是响应mqtt协议发过来的各种指令部分

- > *iot_config.py* 这个是配置文件部分,所有的关键参数,在这里进行配置

- > *main.py* 这个是主程序部分

- > *function.py* 这个是封装的一些常用函数部分。另外由于ESP32的RAM不大,有时会莫名其妙的内存不够,把一些功能拆分到function.py这里面后,这个情况就没有了。

**2. 公网服务器部分**

这部分部署在一个公网服务器上(我自己的VPS,上面装mosquitto的MQTT服务器),用于做web前端展现以及后端监听mqtt的几个主题进行响应。

!(https://www.sunbeatus.com/img/FeedFishWeb.png)

**监听是/xxx/servo/log的信息:** 将esp32发来的日志,入库到本地的sqlite3数据库中。在载入web管理页面时,通过本地sqlite3数据库的记录,判断ESP32是在线状态还是离线状态;

**监听巴法云的对应主题FeedFish001信息:** 收到巴法云的指令(或者小爱同学),操作mqtt想/xxx/servo/action发送开机指令给esp32执行动作;

**公网服务器涉及的程序文件目录为:pub_server**

- > *static/* 这个目录是放javascript脚本,css等素材,很多历史遗留的东西,抄来抄去也就没去除无用东西了。

- > *templates* 这个目录存放html的模板文件;

- [ ] login_templ.html 是登录模板文件;

- [ ] *index.html* 是首页模板文件;

- [ ] *logs.html* 是日志展示页面模板文件;

> - *servo_web.py* 这个是WEB的主页面

> - *config.py* 这个是公网服务器上涉及配置的各个参数

> - *MyDB.py* 这个是web鉴权的数据库管理模块

> - *log2sqlite.py* 这个是监听/xxx/servo/log的mqtt订阅,然后存入本地sqlite库

> - *bemfa.py* 这个是监听巴法云的订阅交互

> - *MyMQTT.py* 这个是封装的mqtt的一些模块

**3. 个人电脑部分**

这个主要是封装一个程序更新操作:

```
d:\>op_firmware.py
usage: op_firmware.py [-h] [-t TOPIC] [-a ACTION] [-sf SOURCE_FILE] [-tf TARGET_FILE]
op_firmware.py: error: No topic specified, add --topic /x/x/x or -t /x/x/x

d:\perl_wrk\ESP32_init\python带伺服电机\laptop>op_firmware.py -h
usage: op_firmware.py [-h] [-t TOPIC] [-a ACTION] [-sf SOURCE_FILE] [-tf TARGET_FILE]

Manage IoT device operations

options:
-h, --help            show this help message and exit
-t TOPIC, --topic TOPIC
                        which iot topic should be selected
-a ACTION, --action ACTION
                        get/push/cmd
-sf SOURCE_FILE, --source_file SOURCE_FILE
                        source file to be deal
-tf TARGET_FILE, --target_file TARGET_FILE
                        target file to be deal

example1, update local main.py to remote ESP32's main.py:
      op_firmware.py -a push -t /dean/servo -sf main.py -tf main.py

example2, get remote ESP32's main.py to local main_t.py:
      op_firmware.py -a get -t /dean/servo -sf main.py -tf main_t.py

```

**相关文件存放的目录为:laptop**
- op_firmware.py 这个是操作ESp32程序微码主程序

- pc_config.py 这个是对应的配置文件

1002217709 发表于 2024-4-22 04:57

esp01就可以办到,非要拿es32大材小用

sunbeat 发表于 2024-4-22 15:35

WalterWang 发表于 2024-4-22 11:50
我是用的 减速电机+延时关闭板子+智能插座 制作得 定时喂鱼,可以用远程控制插座实现随时开关 喂鱼。

我的这个舵机的正负极一直通着电,信号线只是需要的时候给个pwm信号。
不知道一直这样给舵机加电,会不会过热。
我模电这块儿底子弱。
你的智能插座方案,电源隔离性好。

hqt 发表于 2024-4-22 02:55

这样的话 esp32可玩性挺大啊 之前整过ha对接插座开关电
mqtt可以使用腾讯云的 有免费额度
小爱同学是如何调用的?

bluepeb 发表于 2024-4-22 06:36

小爱同学可玩性还是很高,我感觉智能家居很有前途!

ilpj 发表于 2024-4-22 07:47

这几天正在学8266,感谢楼主分享。{:1_893:}

潇洒超人 发表于 2024-4-22 08:19

网页有内嵌esp32-cam的视频流吗?
留个方式给我,交流~

dingqh 发表于 2024-4-22 08:20

厉害,家里鱼鱼有福了

wyesheng 发表于 2024-4-22 08:27

我去。。。大神呐,膜拜!可惜家里的几条鱼都被养死了。。。。呜呜

碉堡的小嗵 发表于 2024-4-22 08:32

感谢大佬的分享

apull 发表于 2024-4-22 08:50

这里还了,一直有这个想法,无从下手,学习了。
页: [1] 2 3 4
查看完整版本: 支持小爱同学的ESP32+MG995做的自动喂鱼器