Skip to main content

检测宠物仓鼠跑圈记录

家里养了一只小仓鼠,每天晚上都疯狂加班跑跑轮。
有一天对象问我能不能知道它每天晚上跑多少圈?
那当然能啊,哥们本科自动化的老本行了哈哈哈~
然后就有了这个好玩的项目~

方案#

家里有个去年心血来潮淘来的树莓派,使用树莓派做检测部分的控制器和项目前后端的服务器,整体分为以下几个部分,分别展开说说。

检测#

传感器使用超声波模块,在跑轮上固定一个厚度差不多3cm的硬纸板,每当鼠鼠跑一圈的时候,超声波的距离会呈现一定的波形变化。调试找到检测距离的阈值,在代码层面进行判断。(本来想使用红外对管进行检测,但是红外管的电路不好固定在跑轮上,只能用树莓派的电源,鼠鼠跑一圈,线就会缠一圈。。)python有内置的库,可以直接调用树莓派的GPIO引脚,进而控制超声波传感器。这里简单介绍一下超声波传感器模块,有4个引脚,vcc和gnd分别接电源和地线,还有两个引脚分别是输出信号和接受信号。一个引脚发出维持0.01ms的信号,另一个引脚会接收信号,同时记录开始时间和结束时间的时间差,超声波在声音中传播的速度大约是343m/s,由此可以计算出超声波到目标的距离。

后端服务#

鼠鼠的跑步圈数需要记录下来,就得有个后端服务,提供两个接口,用于展示鼠鼠每天的跑步运动量,和添加某次的运动量。使用nest框架作为后端服务,使用mysql作为数据库承载记录。这个还是比较简单,跟着nest文档很容易就起来,定义好数据实体,写一下controller映射路由,在service中插入记录到数据库中。

前端页面#

有了数据,可以将鼠鼠每天的运动量可视化展示出来,简单起个页面,拉到接口后,用echarts把鼠鼠的运动折线图画出来,就能清晰明了的看出来鼠鼠的运动趋势。使用vue简单起个项目(虽然平时都写react,感觉vue起项目脚手架好用一些哈哈),跟着文档接入echarts的折线图跑起来。

部署#

检测部分是一段python代码,直接运行就行,使用nohup python3 distance.py &运行在后台,不想运行的时候找到进程号,kill就好。
后端服务是nest写的,yarn build之后,用pm2来管理应用就好。
其余的用docker部署就好,前端页面用Nginx承载,后端也要用到Mysql,使用docker起两个容器就好。

部署nginx使用:sudo docker run -d -p 80:80 --name nicerain -v ~/code/nginx-nicerain/nginx/www:/usr/share/nginx/html -v ~/code/nginx-nicerain/nginx/logs:/var/log/nginx -v ~/code/nginx-nicerain/nginx/conf/nginx.conf:/etc/nginx/nginx.conf nginx,然后修改一下 nginx.conf 里的配置,在网上找一个通用的配置文件,修改一下页面路径就行。然后把前端项目打包的产物放进去。

效果#

运动量展示#

折线图跑步记录

硬件连线图#

硬件图硬件图

其他#

坑点#

中间还是遇到了一些坑点的。 树莓派是arm架构,下载mysql版本用最新的版本还不行,找了好多资料。sudo docker pull --platform=arm32 mysql/mysql-server sudo docker pull --platform=linux/arm/v8 mysql/mysql-server sudo docker run -p 3306:3306 --name mysql --privileged=true -v /mydata/mysql/log:/var/log/mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql/mysql-server

数据库的上传时间老是不对,时区有问题,在Mysql里设置了好多,最后发现是nest里初始化没设置时区。。

后记#

这个项目持续了两周,每周抽的空闲时间写的,有效时间应该20h左右吧哈哈~
找回了之前大学时光的快乐~
后续将代码都开源出来~ 项目地址