基于ESP32 C6的物联网浇花系统制作教程
基于ESP32 C6的物联网浇花系统制作教程
随着智能家居的普及,越来越多的DIY爱好者开始尝试将物联网技术应用到家庭生活中。本文将介绍如何基于ESP32 C6和物联网技术,制作一个自动浇花系统。该系统能够实时监测土壤湿度,并根据设定的阈值自动浇水,同时支持通过行空板进行远程控制。
项目概况
项目基于如下图所示的软硬件环境,首先通过连接到ESP32 C6上的土壤湿度传感器获取土壤湿度,显示在四位数码管上,根据土壤的湿度由程序决定是否开启水泵进行浇水,并将湿度数据发送到SIoT。行空板上会获取并显示SIoT上的湿度数据,通过按钮也可以实现是否浇水。
所需硬件
- Firebeetle ESP32 C6
- 土壤湿度传感器
- 继电器
- 小水泵+塑料管
- TM1637四位数码管
- 行空板
- 若干杜邦线、数据线、鳄鱼夹等
项目实现
硬件连接
根据下图进行硬件的连接。请注意连接的端口,在编程时不要搞错。
- 土壤湿度传感器的模拟口连接ESP32-C6的5号引脚。
- 继电器的in连接ESP32-C6的15号引脚。
- 四位数码管的CLK和DIO分别连接23和22引脚。
- 继电器与小水泵的连接可以使用外置电源,也可以连接ESP32 C6上的VCC和GND口。
软件编程
- 土壤湿度检测程序
土壤湿度检测是本项目的重点。在本块主控板的mpy环境中,检测到的数据始终有问题。把主控板换成Beetle ESP32 C6或者ESP32 DEVKITV1时,获取模拟数据都没有问题。另外,还发现在这块板上共有6个支持ADC模数转换的引脚,分别是0~6,但只有5号端口可以获取数据。
要实现ADC模数转换,需要导入以下模块
from machine import Pin,ADC
然后通过下面的语句来指定端口
p_soil=ADC(Pin(5))
这样只要使用下面的语句就可以持续获取土壤湿度的数据了。
While True:
val= p_soil.read()
time.sleep(1)
因此这部分完整的程序是:
from machine import Pin,ADC
import time
p_soil=ADC(Pin(5)) #接土壤传感器
While True:
val = p_soil.read()
time.sleep(1)
- 将获取到的数据显示在四位数码管
以下程序中,加粗部分是用于四位数码管显示湿度的。
from machine import Pin,ADC
from lib import tm1637
import time
tm = tm1637.TM1637(clk=Pin(23),dio=Pin(22)) #初始化四位数码管
p_soil=ADC(Pin(5)) #接土壤传感器
While True:
val = p_soil.read()
tm.number(val) # 四位数码管上显示湿度值
time.sleep(1)
- 将湿度值发送到SIoT
在刚才的程序中添加连接WIFI和SIoT的语句,注意加粗语句
from machine import Pin,ADC
from lib import tm1637
import time
from lib.siot2 import iot
def sub_cb(topic, msg):#回调函数
print(topic,msg)
def do_connect():#连接wifi语句
do_connect()
time.sleep(0.5)
IOT_UserName = "siot"
IOT_PassWord = "dfrobot"
SERVER = "192.168.0.103" # SIoT服务器地址,此处为行空板
IOT_subTopic = 'siot/watering' #浇水指令主题
IOT_pubTopic = "siot/humidity" #土壤湿度主题
CLIENT_ID = ""#设置客户端ID
siot = iot(CLIENT_ID, SERVER,user=IOT_UserName, password=IOT_PassWord)
siot.connect()
siot.set_callback(sub_cb)
siot.getsubscribe(IOT_subTopic) #订阅主题
siot.getsubscribe(IOT_pubTopic)
print('siot connected')
time.sleep(0.5)
tm =tm1637.TM1637(clk=Pin(23),dio=Pin(22)) #初始化四位数码管
p_soil=ADC(Pin(5)) #接土壤传感器
While True:
val = p_soil.read()
tm.number(val) # 四位数码管上显示湿度值
siot.check_msg() #检测消息
time.sleep(1)
- 启动浇水程序
我们使用控制继电器来实现小水泵进行浇水,浇水的方式有根据湿度自动浇水,或人工控制浇水。自动浇水则根据获取到的土壤湿度值进行判断即可,注意这个值是需要根据不同植物进行设定的,有的植物喜湿,那么判断的条件中湿度值就设得小一点,有些喜干,那么湿度值设置得高一点。
使用下面的语句为指定15引脚为继电器的in控制口。
p_relay=Pin(15,Pin.OUT) #接继电器
然后尝试给该口一个值,发现小水泵开始抽水
p_relay.value(0)
因此可以先给一个停止工作的语句
p_relay.value(1)
因此,我们只要在需要浇水的时候将其值设为0,停止浇水设置为1即可。
比如下面的语句根据土壤湿度值进行浇水:
if val > 2500:
print('检测到土壤很干燥,准备开始浇水')
for i in range(3,-1,-1): # 倒数3秒开始浇水
print(i)
time.sleep(1)
p_relay.value(0)
while p_soil.read() > 2500:
print('正在浇水,当前湿度:',p_soil.read())
time.sleep(0.5)
p_relay.value(1)
print('浇水完成')
手动浇水是根据行空板上按下开始浇水/停止浇水按钮实现的,其实是接收到SIoT上发来的消息,根据消息内容来实现是否浇水。那么我们修改sub_cb回调函数为:
def sub_cb(topic, msg):#pc
if (msg == b"on"): #开始浇水
print('开始浇水')
p_relay.value(0)
time.sleep(5)
print('停止浇水')
p_relay.value(1)
if (msg == b"off"): # 停止浇水
print('停止浇水')
p_relay.value(1)
- 行空板设置及编程
行空板实现两个功能,一是作为SIoT服务器,二是控制面板。首先我们需要将行空板连接到WIFI,并启动SIoT服务,并在行空板的SIoT服务器上创建两个消息主题:
- 湿度
- 指令
这次使用行空板上的Jupyter来编写程序。打开行空板上的jupyter页面(通常地址为行空板IP+端口8888),然后单击右上角的“新建->文件夹”,创建”watering”文件夹,进入该文件夹,再单击右上角的“新建->Python3(ipykernel)”进入jupyther编程环境。
编写如下的程序:
反思拓展
虽然初步完成了本项目,但在完成过程中还是有一些问题待以后解决,首先是获取土壤湿度值还是有问题,二是长时间运行如果不小心碰到连接的线和引脚,会使程序停止运行。还有就是在浇水过程中,对接收停止浇水指令不是很灵敏。
此外还要对于具体种植的植物,浇多少水,保持土壤湿度是多少,都需要进行研究。