仔爸 发表于 2024-4-14 14:35:10

物联网浇花系统 ——基于ESP32 C6 + SIoT + 行空板

本帖最后由 仔爸 于 2024-4-14 14:48 编辑

看到家里的花花草草又”死的死,伤的伤“,说明养花就像照顾小猫小狗,要有充分的爱心和无微不至的关怀啊。那对于懒惰人士,急需一种工具能帮忙照顾可爱的小花小草,这不,基于ESP32 C6和物联网的自动浇花系统就来了。https://www.bilibili.com/video/BV1Ym421j79W/一、项目概况项目基于如下图所示的软硬件环境,首先通过连接到ESP32 C6上的土壤湿度传感器获取土壤湿度,显示在四位数码管上,根据土壤的湿度由程序决定是否开启水泵进行浇水,并将湿度数据发送到SIoT。行空板上会获取并显示SIoT上的湿度数据,通过按钮也可以实现是否浇水。二、所需硬件lFirebeetle ESP32 C6l土壤湿度传感器l继电器l小水泵+塑料管lTM1637四位数码管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,ADCimporttimep_soil=ADC(Pin(5))# 接土壤传感器WhileTrue:   val = p_soil.read()   time.sleep(1)2.将获取到的数据显示在四位数码管我上一篇《基于Beetle ESP32 C6开发板和物联网的环境检测》中已经使用过四位数码管了,而显示单个数字则使用TM1367.number(数字)的语句,因此,我们只要启用相应端口上的四位数码管,并显示获取到的土壤湿度数字即可。以下程序中,加粗部分是用于四位数码管显示湿度的。frommachine import Pin,ADCfrom lib import tm1637importtimetm = 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,ADCfrom libimport tm1637importtimefrom 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编程环境。编写如下的程序:四、反思拓展虽然初步完成了本项目,但在完成过程中还是有一些问题待以后解决,首先是获取土壤湿度值还是有问题,二是长时间运行如果不小心碰到连接的线和引脚,会使程序停止运行。还有就是在浇水过程中,对接收停止浇水指令不是很灵敏。此外还要对于具体种植的植物,浇多少水,保持土壤湿度是多少,都需要进行研究。


页: [1]
查看完整版本: 物联网浇花系统 ——基于ESP32 C6 + SIoT + 行空板