前言
上次 土壤湿度传感器 完成之后,就立下一个 flag 要搭建一个智慧浇水的智能场景,现在终于有时间填坑了!(o゚▽゚)o
智慧浇水场景的核心设备有三个:
检测土壤状态的:土壤湿度传感器 通过这个传感器来获取土壤信息,作为是否浇水的依据。
智能浇水器:执行装置,通过 Spirit 1 控制。
Spirit 1
这次就来制作智慧浇水的智能场景的核心: 智能浇水器,我准备买一个便宜的傻不拉几的浇水器自己改造一下,想办法给他连上脑子。
主要交互流程如下图:
(σ゚∀゚)σ…:*☆哎哟不错哦,是不是很厉害啊!
硬件选择
万年不变的 安信可的 ESP32S ,别问,问就是便宜才 24元。
继电器,因为不清楚浇水器电路情况保险起见,使用了继电器进行隔离,4.5元
浇水器 淘宝随便找的 99元,选择它是因为这个方便改造,有一个可以拆卸的电池盒方便塞开发板和继电器,按钮是机械式的,可以通过继电器短接模拟按钮效果进行控制,并且有一个手动浇水的功能,也就是按钮摁一下就浇水,再摁一下就关闭,我们从这个功能下手。
(写文章的时候这东西已经被我拆掉了,就拿淘宝的图凑活一下吧,图上按的中间按钮就是我们需要接管的按钮)
(((((((((((っ•ω•)っ Σ(σ`•ω•´)σ 起飞!
改造接线
硬件都到了之后就开始改造电路!
控制电路:
浇水器面板中间的按钮就是手动控制按钮下降沿触发,而我们在这里使用了一个继电器常开端接到按钮上,当开发板 12号 IO 口给继电器电压时,继电器常开端闭合,按钮被短接,两端电压被拉至5V,0.1S后断开,电压拉低,下降沿触发。
休眠检测电路:
浇水器中有一个10S左右没有控制就进入休眠状态的设置我们没办法修改,进入休眠状态后需要一个额外的触发来唤醒浇水器,而浇水器唤醒时,会点亮数码管,于是就通过 A0 引脚接到数码管的共阳级,如果检测到数码管的共阳级为低电平,就认为浇水器进入休眠状态,在触发命令之前额外触发一次,解除浇水器的休眠状态。
浇水器工作状态检测电路:
浇水器面板通过信号线来控制下面水泵电机的工作,这里我通过5号 IO 监控信号线的电压来确定电机的工作状态。
代码解析
为了方便讲解逻辑,我会打乱代码的顺序可能还会进行裁剪,要是想直接拿代码跑的朋友可以直接去 灵感桌面的秘密宝库 获取代码,或者直接 clone:
https://gitee.com/inspiration-desktop/DEV-lib-arduino.git
要是连 git 是什么都不知道,可以参考简单无脑,上手即用 - 手把手教你使用 智能红外温度传感器代码以及依赖的 gitee 库!
下载或者 clone 代码后这次用到的是这个三个文件夹:
cjson:我移植的 cjson 库,就是标准的 cjson 库,放到 arduino 安装目录下的 libraries 文件夹里,百度一下 cjson 的函数使用就行了。
libsddc:是我移植自官方的SDDC库和自己写的 SDK,也是放入 libraries 文件夹里就行。里面是 SDDC 协议的处理函数,我们不用管。
demo 文件夹里面就是我们各种传感器的 demo 代码了:
具体 arduino 使用教程可以看我之前的文章 arduino开发指导 和 手把手带你 arduino 开发:基于ESP32S 的第一个应用-红外测温枪(带引脚图)
设备控制命令:
通过 Spirit 1 的应用程序或者 嗅探器 向传感器设备发送的命令:
通过向浇水器发送 “ON”/“OFF” 的 set 命令可以控制浇水器是否浇水:
{
"method": "set", // 控制浇水器开始/停止浇水
"watering": "ON"/"OFF"
}
通过向浇水器发送 “watering” 的 get 命令可以获取浇水器是否有在浇水:
{
"method": "get", // 获取浇水器工作状态
"obj": ["watering"]
}
设备和协议初始化流程:
基于官方 demo 写的不需要做什么修改,主要是设备初始化,管脚配置,和协议初始化部分。
因为涉及到 IO 口的输入和输出,所以需要手动配置一下 IO 口状态。并且创建一个一个消息队列来储存和传递收到的命令
void sensor_init()
{
pinMode(water_pin, OUTPUT);
pinMode(sign_pin, INPUT);
pinMode(monitor_pin,INPUT);
// 设置一个消息队列来缓存命令,防止命令丢失
Message_Queue = xQueueCreate(MESSAGE_Q_NUM, MESSAGE_REC_LEN); //创建消息Message_Queue
if(Message_Queue == 0)