83361| 0
|
[ESP8266/ESP32] 物联网浇花系统 ——基于ESP32 C6 + SIoT + 行空板 |
本帖最后由 仔爸 于 2024-4-14 14:48 编辑 看到家里的花花草草又”死的死,伤的伤“,说明养花就像照顾小猫小狗,要有充分的爱心和无微不至的关怀啊。那对于懒惰人士,急需一种工具能帮忙照顾可爱的小花小草,这不,基于ESP32 C6和物联网的自动浇花系统就来了。 一、项目概况 项目基于如下图所示的软硬件环境,首先通过连接到ESP32 C6上的土壤湿度传感器获取土壤湿度,显示在四位数码管上,根据土壤的湿度由程序决定是否开启水泵进行浇水,并将湿度数据发送到SIoT。行空板上会获取并显示SIoT上的湿度数据,通过按钮也可以实现是否浇水。 二、所需硬件 l Firebeetle ESP32 C6 l 土壤湿度传感器 l 继电器 l 小水泵+塑料管 l TM1637四位数码管 l 行空板 l 若干杜邦线、数据线、鳄鱼夹等 三、项目实现 (一)硬件连接 根据下图进行硬件的连接。请注意连接的端口,在编程时不要搞错。 土壤湿度传感器的模拟口连接ESP32-C6的5号引脚。 继电器的in连接ESP32-C6的15号引脚。 四位数码管的CLK和DIO分别连接23和22引脚。 继电器与小水泵的连接可以使用外置电源,也可以连接ESP32 C6上的VCC和GND口。 (二)软件编程 1.土壤湿度检测程序 土壤湿度检测是本项目的重点,仔爸尝试了多个土壤湿度检测传感器,不知为什么,在本块主控板的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() 最好加个等待的时间。因此这部分完整的程序是: frommachine import Pin,ADC importtime p_soil=ADC(Pin(5)) # 接土壤传感器 WhileTrue: val = p_soil.read() time.sleep(1) 2.将获取到的数据显示在四位数码管 我上一篇《基于Beetle ESP32 C6开发板和物联网的环境检测》中已经使用过四位数码管了,而显示单个数字则使用TM1367.number(数字)的语句,因此,我们只要启用相应端口上的四位数码管,并显示获取到的土壤湿度数字即可。以下程序中,加粗部分是用于四位数码管显示湿度的。 frommachine import Pin,ADC from lib import tm1637 importtime tm = tm1637.TM1637(clk=Pin(23),dio=Pin(22)) #初始化四位数码管 p_soil=ADC(Pin(5)) # 接土壤传感器 WhileTrue: val = p_soil.read() tm.number(val) # 四位数码管上显示湿度值 time.sleep(1) 3.将湿度值发送到SIoT 同样,《基于Beetle ESP32 C6开发板和物联网的环境检测》一文中介绍了如何将温湿度发送到SIoT,不过,本项目取了要发送数据,还将接收数据,主要用于行空板接收湿度数据并显示(该程序见后面行空板上编写的程序),以及ESP32 C6接收行空板互动产生的数据。注意,使用SIOT均需连接WIFI。因此程序流程应该是:连接WIFI->连接SIoT->订阅主题->发送/接收消息。这次我又从上网找到一个与上一篇文章不一样的siot.py库文件,我将其重命名为siot.py,放在ESP32 C6的lib文件夹内。SIoT的github地址:https://github.com/vvlink/SIoT/tree/master 在刚才的程序中添加连接WIFI和SIoT的语句,注意加粗语句 frommachine import Pin,ADC from libimport tm1637 importtime 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)) # 接土壤传感器 WhileTrue: val = p_soil.read() tm.number(val) # 四位数码管上显示湿度值 siot.check_msg() # 检测消息 time.sleep(1) 4.启动浇水程序 我们使用控制继电器来实现小水泵进行浇水,浇水的方式有根据湿度自动浇水,或人工控制浇水。自动浇水则根据获取到的土壤湿度值进行判断即可,注意这个值是需要根据不同植物进行设定的,有的植物喜湿,那么判断的条件中湿度值就设得小一点,有些喜干,那么湿度值设置得高一点。 使用下面的语句为指定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) 5.行空板设置及编程 行空板实现两个功能,一是作为SIoT服务器,二是控制面板。首先我们需要将行空板连接到WIFI,并启动SIoT服务,并在行空板的SIoT服务器上创建两个消息主题: 湿度 指令 这次使用行空板上的Jupyter来编写程序。 打开行空板上的jupyter页面(通常地址为行空板IP+端口8888),然后单击右上角的“新建->文件夹”,创建”watering”文件夹,进入该文件夹,再单击右上角的“新建->Python3(ipykernel)”进入jupyther编程环境。 编写如下的程序: 四、反思拓展 虽然初步完成了本项目,但在完成过程中还是有一些问题待以后解决,首先是获取土壤湿度值还是有问题,二是长时间运行如果不小心碰到连接的线和引脚,会使程序停止运行。还有就是在浇水过程中,对接收停止浇水指令不是很灵敏。 此外还要对于具体种植的植物,浇多少水,保持土壤湿度是多少,都需要进行研究。 |
8.97 KB, 下载次数: 2791
esp32-c6浇水系统
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed