回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页
best-icon

#新物联网挑战二#水培蔬菜智能温室系统 简单

头像 dlzxlsx 2023.06.20 401 4

 一、引言

随着现代农业技术的发展和环保理念的普及,水培蔬菜的生产方式正逐渐受到人们的青睐。水培农业不仅能够有效地节省水资源,还可以减少土壤传播的疾病,同时通过精确控制营养物质,可以大幅提升蔬菜的品质。而智能温室系统则为水培农业的发展提供了强大的技术支撑。本研究旨在探索如何构建一个高效的水培蔬菜智能温室系统。

 

二、水培蔬菜介绍

水培也叫“水耕”,是无土栽培的主要类型之一。水培是通过特定设施营造相对封闭,能储存营养液的环境,并使根部生长所需的水、肥、气、热等条件保持相对稳定,全部或部分根系“浸泡”在营养液中的栽培方法。

 

水培蔬菜健康生长的条件是要确保根系生长良好,而根系生长良好取决于根际环境的温度、氧气、酸碱度、离子浓度及不同离子之间的比例合适,营养液中不含有毒、有害物质,没有病源微生物、害虫等。

 

水培营养液能更精确、更合理、更有效地为蔬菜生长发育提供养分,隔绝土壤和灌溉水的污染,生产出高质量的无公害蔬菜。另外,培蔬菜的耗水量极低,每颗蔬菜从种子到成菜仅需要500ml水,比常规种植节水90%以上;传统土壤栽培中施用肥料的平均利用率约为30%~50%,而水培营养物质的利用率约有90%~95%,而且废弃的营养液经过处理可以循环利用,整个培育过程接近零排放,对环境造成的负荷极低。

 

为了营造一个良好的蔬菜生长环境,我们采用智能控制的温室与配制养分充足的营养液来实现。

 

 

三、水培蔬菜智能温室的实现

本文将探讨构建一种应用自动化原理来监控和调节水培系统。虽然我建造的水培系统相对较小,但它是模块化设计,可以扩展到不同的种植空间,下文主要是展示应用自动化技术的过程。

 

(一)水培蔬菜智能温室系统设计

1.简易温室:我在福建,现在是夏季,室内气温高于25度,水培温室设在居室内靠窗处,由三个水培箱、一个全光谱LED、一个自动控制系统组成。

 

2.智能控制系统:系统集成了温度、湿度、光照、二氧化碳等多种传感器,通过智能算法实时调整温室的环境参数,以达到最优生长条件。

 

在这里,我使用行空板作为水培控制系统的核心。这款售价399元的电脑只有一副扑克牌的大小,但它包括 CPU、RAM、视频/音频输出、USB、WiFi、硬盘、LCD彩屏、蓝牙、板载多种常用传感器和丰富的拓展接口,自带Linux操作系统和Python环境,是一个完整计算机。行空板载的光线传感器、声音传感器等多种常用传感器和丰富的拓展接口可用于连接测量环境的开关和传感器,水泵和继电器等输出,十分适合本项目。在本项目中,我利用行空板、氧气传感器、SHT31-F空气温湿度传感器、SCI采集模块、土壤湿度传感器、DS18B20水温传感器、水TDS传感器、空气质量传感器、执行器模块、潜水泵、继电器、50W全光谱LED植物补光灯、mind+图形化编程软件、数据可视化界面、SIOT物联网平台、水培箱、水培营养液、水培篮等工具制作这个智能水培蔬菜温室测和控制系统。

bf33752108ca0302e372dbd152a8dda.jpg

(水培控制系统作品图)

 

3.水培系统:常用的温室水培系统主要分为两种。一种是DWC(Deep water culture)另外一种就是NFT (Nutrient Film Technique)。 NFT技术是让植物的根系生长在一个塑料薄膜槽或一个固定通道中,营养溶液通过该通道不断循环,从而给植物提供必要的营养和水分。DWC(Deep water culture) 是通过将植物根部悬浮在营养丰富的含氧水溶液中的一种植物生长的水培方法。我构建的这种水培系统是DWC。DWC的优点是维护成本低,植物生长时间快,系统简单。但也存在一些缺点:pH值、液位、营养浓度、液温波动大,液体中氧气含量低。在该系统中,我使用自动监测与控制技术还克服DWC上述缺点。

c69421dbe725ad40b5d9746004cfaee.jpg

(潜水泵在喷水,箱内安装TDS、水温、液位传感器)

 

(二)监控要点

在系统实现中,我们遵循精确控制与智能调节的原则,对蔬菜生长有重要影响的环境参数都将通过传感器进行实时监测,并通过算法精确控制,以确保蔬菜的生长状态;同时,系统根据蔬菜的生长需求,自动调节光照、温度、湿度、营养液等参数。在本系统中,我要监测与调节的环境如下。

 

营养液的指标:pH值(暂时缺少传感器)、TDS值、温度、液位。

空气与光照条件:温度、湿度、含氧量、二氧化碳含量、光线强度。

控制继电器用于调节灯光。

控制四个蠕动泵以分配特定体积的溶液:酸、碱、营养液 A 和营养液B(此功能暂时缺)。

通过分配酸/碱溶液自动将水调节到目标pH范围(此功能暂时缺)。

通过分配营养液自动调节水到目标电导率范围(此功能暂时缺)。

根据目标湿度、温度和二氧化碳自动调节排气扇和加湿器的工作(此功能暂时缺)。

如果选定的测量值超出可接受的范围(如温度过高、水位过低等),则发出警报(此功能暂时缺)。

使用USB摄像头查看温室实时情况。

 

使用仪表、图形和其他小组件配置仪表板,以便在可视化页面上查看蔬菜温室的情况。

 

我把空气质量传感器、氧气传感器、水位传感器接到SCI采集器上,把采集到的数据传感行空板上。3c3aefdef144233c6096747b7b52cc2.jpg

行空板接控制LED的继电器、TDS传感器、温湿度传感器、水泵开关、USB摄像头、水温传感器。7c3d15e2b782f3f1fa550dc37172b3c.jpg

(电子设备全家照)

可视化面板.PNG

(可视化界面)

 程序截图1.PNG程序截图2.PNG程序截图3.PNG对补光与水泵的远程控制.PNG

这是主线程的代码,行空板把获取的数据在自带的触摸屏上显示出来的同时,还通过SIOT传给数据可视化面板,供客户端查看与控制。

 

由于本系统还有根据环境情况对蔬菜进行人工补光与营养液循环流动,因此,我在程序中增加了两个线程,分别用于处理人工照明控制与营养液循环控制。

两个线程.PNG

四、预期结果

通过实施智能温室系统,预期可以实现以下几点:

 

提高蔬菜生长效率:通过精确控制环境参数,可以提高蔬菜的生长效率。

降低资源消耗:水培技术与智能温室结合,能有效降低水资源和肥料的消耗,减少对环境的影响。

 

确保蔬菜品质:通过精确控制营养液成分和环境参数,可以更好地保证蔬菜的品质。

 

实现持续稳定生产:智能温室系统可以实现全年无休的稳定生产,大大提高了生产效率。

 

五、结论

由DFRobot行空板等电子模块与mind+制作的物联网控制水培蔬菜智能温室系统充分利用了物联网技术,将水培与智能控制相结合,旨在创造一个高效、环保、可持续的农业生产环境。我们期待这种系统能在现代农业生产中发挥更大的作用。

 

六、致谢

 

感谢DFRobot“造物记物联网创新应用专项挑战赛”主办方提供硬件与技术支持,也感谢参加本次比赛的同仁在微信群中为我提供的帮助。

代码
#  -*- coding: UTF-8 -*-

# MindPlus
# Python
import base64
from io import BytesIO
from PIL import Image
from pinpong.libs.dfrobot_sht31 import SHT31
from pinpong.libs.dfrobot_tds import TDS
from pinpong.extension.unihiker import *
from pinpong.board import Board,Pin
from pinpong.board import DS18B20
from dfrobot_rp2040_sci import *
from pinpong.board import Board
from pinpong.board import Pin
from unihiker import GUI
import siot
import time
import cv2

# 事件回调函数
def u_thread2_function():
    while True:
        if (light.read() < 200):
            p_p23_out=Pin(Pin.P23, Pin.OUT)
            p_p23_out.write_digital(1)
            siot.publish_save(topic="siot/补光开关", data="on")
            time.sleep((60 * (60 * 0.5)))
            p_p23_out=Pin(Pin.P23, Pin.OUT)
            p_p23_out.write_digital(0)
            siot.publish_save(topic="siot/补光开关", data="off")
            time.sleep(600)
def u_thread1_function():
    while True:
        p_p22_out=Pin(Pin.P22, Pin.OUT)
        p_p22_out.write_digital(1)
        siot.publish_save(topic="siot/水泵开关", data="off")
        time.sleep((60 * (60 * 2)))
        p_p22_out=Pin(Pin.P22, Pin.OUT)
        p_p22_out.write_digital(0)
        siot.publish_save(topic="siot/水泵开关", data="on")
        time.sleep((60 * (60 * 0.5)))
def on_message_callback(client, userdata, msg):
    if (msg.topic.find("siot/水泵开关")!=-1):
        if (msg.payload.decode().find("on")!=-1):
            p_p22_out=Pin(Pin.P22, Pin.OUT)
            p_p22_out.write_digital(1)
        elif (msg.payload.decode().find("off")!=-1):
            p_p22_out=Pin(Pin.P22, Pin.OUT)
            p_p22_out.write_digital(0)
    elif (msg.topic.find("siot/补光开关")!=-1):
        if (msg.payload.decode().find("on")!=-1):
            p_p23_out=Pin(Pin.P23, Pin.OUT)
            p_p23_out.write_digital(1)
        elif (msg.payload.decode().find("off")!=-1):
            p_p23_out=Pin(Pin.P23, Pin.OUT)
            p_p23_out.write_digital(0)


Board().begin()
u_gui=GUI()
siot.init(client_id="938137717436466",server="10.1.2.3",port=1883,user="siot",password="dfrobot")
siot.connect()
siot.loop()
siot.set_callback(on_message_callback)
p_sht31 = SHT31(0x45)
tds1 = TDS(Pin((Pin.P21)))
ds1 = DS18B20(Pin((Pin.P24)))
x = 20
y = 0
size = 18
SCI1 = DFRobot_RP2040_SCI_IIC(addr=0x21)
while SCI1.begin() != 0:
    print("Initialization Sensor Universal Adapter Board failed.")
    time.sleep(1)
print("Initialization Sensor Universal Adapter Board done.")
t0=u_gui.draw_text(text="行空板",x=x,y=0,font_size=25, color="#FF0000")
t1=u_gui.draw_text(text="行空板",x=x,y=60,font_size=size, color="#0000FF")
t2=u_gui.draw_text(text="行空板",x=x,y=90,font_size=size, color="#0000FF")
t3=u_gui.draw_text(text="行空板",x=x,y=120,font_size=size, color="#0000FF")
t4=u_gui.draw_text(text="行空板",x=x,y=150,font_size=size, color="#0000FF")
t5=u_gui.draw_text(text="行空板",x=x,y=180,font_size=size, color="#0000FF")
t6=u_gui.draw_text(text="行空板",x=x,y=210,font_size=size, color="#0000FF")
t7=u_gui.draw_text(text="行空板",x=x,y=240,font_size=size, color="#0000FF")
t8=u_gui.draw_text(text="行空板",x=x,y=270,font_size=size, color="#0000FF")

def frame2base64(frame):
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    img = Image.fromarray(frame) #将每一帧转为Image
    output_buffer = BytesIO() #创建一个BytesIO
    img.save(output_buffer, format='JPEG') #写入output_buffer
    byte_data = output_buffer.getvalue() #在内存中读取
    base64_data = base64.b64encode(byte_data) #转为BASE64
    return base64_data #转码成功 返回base64编码

def base642base64(frame):
    data=str('data:image/png;base64,')
    base64data = str(frame2base64(frame))
    framedata = base64data[2:(len(base64data)-1)]
    base642base64_data = data + str(framedata)
    return base642base64_data
vd = cv2.VideoCapture()
vd.open(0)
while not (vd.isOpened()):
    print("摄像头初始化..")
print("摄像头初始化成功")
siot.getsubscribe(topic="siot/补光开关")
siot.getsubscribe(topic="siot/水泵开关")
mytime = 0
thread1=u_gui.start_thread(u_thread1_function)
thread2=u_gui.start_thread(u_thread2_function)

while True:
    YingYangYeFeiLi = tds1.get_value()
    QiWen = p_sht31.temp_c()
    ShiDu = p_sht31.humidity()
    GuangZhao = light.read()
    YangQi = SCI1.get_value0("O2")
    ShuiWen = ds1.temp_c()
    CO2 = SCI1.get_value0("ECO2")
    ShuiWei = SCI1.get_value0("Moisture")
    t0.config(text="智能水培系统")
    t1.config(text=(str("肥力:") + str(YingYangYeFeiLi)))
    t2.config(text=(str("气温:") + str(QiWen)))
    t3.config(text=(str("湿度:") + str(ShiDu)))
    t4.config(text=(str("光照:") + str(GuangZhao)))
    t5.config(text=(str("氧气:") + str(YangQi)))
    t6.config(text=(str("水温:") + str(ShuiWen)))
    t7.config(text=(str("CO2:  ") + str(CO2)))
    t8.config(text=(str("水位:") + str(ShuiWei)))
    siot.publish_save(topic="siot/温室温度", data=QiWen)
    siot.publish_save(topic="siot/氧气指数", data=YangQi)
    siot.publish_save(topic="siot/温室光照", data=GuangZhao)
    siot.publish_save(topic="siot/营养液水位", data=ShuiWei)
    siot.publish_save(topic="siot/温室湿度", data=ShiDu)
    siot.publish_save(topic="siot/营养液肥力", data=YingYangYeFeiLi)
    siot.publish_save(topic="siot/营养液水温", data=ShuiWen)
    ret, grab = vd.read()
    siot.publish(topic="siot/温室画面", data=base642base64(grab))

材料清单

  • Gravity: SCI采集模块 X1 链接
  • 氧气传感器 X1 链接
  • 18B20 防水温度传感器套件 X1 链接
  • HT31-F数字温湿度传感器 X1 链接
  • 行空板 Python编程学习主控板 X1 链接
  • Gravity: 电容式土壤湿度传感器 X1 链接
  • Gravity: 模拟TDS传感器 X1 链接
  • Gravity: ENS160 空气质量传感器 X1 链接
  • Gravity: 数字继电器模块(Arduino兼容) X2 链接
  • 带水管潜水泵(6~18V) X1 链接

评论

user-avatar
  • 花生编程

    花生编程2023.08.12

    赞赞赞

    0
    • 花生编程

      花生编程2023.08.12

      厉害

      0
      • 三春牛-创客

        三春牛-创客2023.08.08

        666

        0
        • 三春牛-创客

          三春牛-创客2023.08.08

          666

          0