从零开始的DIY智能家居 - 基于 ESP32 的智能浇水器


前言

上次 土壤湿度传感器 完成之后,就立下一个 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)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值