83361浏览
查看: 83361|回复: 0

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

[复制链接]
本帖最后由 仔爸 于 2024-4-14 14:48 编辑

看到家里的花花草草又”死的死,伤的伤“,说明养花就像照顾小猫小狗,要有充分的爱心和无微不至的关怀啊。那对于懒惰人士,急需一种工具能帮忙照顾可爱的小花小草,这不,基于ESP32 C6和物联网的自动浇花系统就来了。
一、项目概况
项目基于如下图所示的软硬件环境,首先通过连接到ESP32 C6上的土壤湿度传感器获取土壤湿度,显示在四位数码管上,根据土壤的湿度由程序决定是否开启水泵进行浇水,并将湿度数据发送到SIoT。行空板上会获取并显示SIoT上的湿度数据,通过按钮也可以实现是否浇水。
物联网浇花系统 ——基于ESP32 C6 + SIoT + 行空板图2
二、所需硬件
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口。
物联网浇花系统 ——基于ESP32 C6 + SIoT + 行空板图4
(二)软件编程
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
物联网浇花系统 ——基于ESP32 C6 + SIoT + 行空板图1
在刚才的程序中添加连接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服务器上创建两个消息主题:
物联网浇花系统 ——基于ESP32 C6 + SIoT + 行空板图3
          湿度                                指令
这次使用行空板上的Jupyter来编写程序。
物联网浇花系统 ——基于ESP32 C6 + SIoT + 行空板图6
打开行空板上的jupyter页面(通常地址为行空板IP+端口8888),然后单击右上角的“新建->文件夹”,创建”watering”文件夹,进入该文件夹,再单击右上角的“新建->Python3(ipykernel)”进入jupyther编程环境。
物联网浇花系统 ——基于ESP32 C6 + SIoT + 行空板图5
编写如下的程序:
物联网浇花系统 ——基于ESP32 C6 + SIoT + 行空板图7
四、反思拓展
虽然初步完成了本项目,但在完成过程中还是有一些问题待以后解决,首先是获取土壤湿度值还是有问题,二是长时间运行如果不小心碰到连接的线和引脚,会使程序停止运行。还有就是在浇水过程中,对接收停止浇水指令不是很灵敏。
此外还要对于具体种植的植物,浇多少水,保持土壤湿度是多少,都需要进行研究。



esp32-c6浇水系统.rar

8.97 KB, 下载次数: 2791

esp32-c6浇水系统

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail