关于MciroPython的智慧农业检测控制系统 – 作者:_橙子 ゝ

智慧农业就是将物联网技术运用到传统农业中去,运用传感器和软件通过移动平台或者电脑平台对农业生产进行控制,使传统农业更具有“智慧”。除了精准感知、控制与决策管理外,从广泛意义上讲,智慧农业还包括农业电子商务、食品溯源防伪、农业休闲旅游、农业信息服务等方面的内容。智慧农业是农业生产的高级阶段,是集新兴的互联网、移动互联网、云计算和物联网技术为一体,依托部署在农业生产现场的各种传感节点(环境温湿度、土壤水分、二氧化碳、图像等)和无线通信网络实现农业生产环境的智能感知、智能预警、智能决策、智能分析、专家在线指导,为农业生产提供精准化种植、可视化管理、智能化决策。

我们以大棚监测控制系统为目标,使用TPYBoard  v102开发板、光照传感器、温湿度传感器、土壤湿度传感器、电机等,实现一个智能大棚监测控制系统的基础模型。

系统主要的技术特点:

监控功能系统:根据各类传感器来获取植物生长的环境信息,如监测土壤水分、空气温度、空气湿度、光照强度等参数(大家可根据自己的需求,增加其他参数,如二氧化塘、土壤温度等)。

自动控制系统:TPYBoard v102开发板作为主控板,负责各个环境信息的收集与汇总,并根据以上各类信息的反馈对农业大棚内进行自动灌溉、自动降温、自动卷遮光罩等自动控制。

一、实验器材

展示效果图

器件名称 数量
TPYBoard v102开发板 1个
USB数据线 1条
DHT11温湿度模块 1个
土壤湿度检测模块 1个
光敏模块 1个
继电器 2个
降压模块(AMS117-5V 1个
按键开关 1个
18650电池 2节
18650电池 1个
步进电机+驱动板 1套
迷你抽水泵(5V 1个
USB小风扇5V 1个
USB座,杜邦线、排针、排母 若干
洞洞板(9*15cm 2个
PVC软水管 1个

实物图

二、程序设计原理

(1)获取温湿度数据,当温度高于阈值时,触发继电器,打开排风扇,反之关闭;

(2)获取土壤湿度数据,当湿度低于土壤湿度检测模块的阈值时,土壤湿度检测模块的OUT引脚会输出高电平,这时触发继电器,启动水泵进行灌溉;(3)获取光照强度数据,当光照强度高于阈值时,触发步进电机,卷起遮光罩,反之盖上。

三、硬件接线连接

先连接电源部分。电源部分主要涉及到降压模块和按键开关。先用万用表,找出按键开关中哪两个引脚是按下导通,弹起不导通的。这里,我们假设为引脚A和引脚B。

18650电池盒 按键开关
红线 引脚A
18650电池盒 降压模块(AMS1117-5V)
黑线 VIN(GND)
按键开关 降压模块(AMS1117-5V)
引脚B VIN(+)
TPYBoardv102 降压模块(AMS1117-5V)
VIN VOUT(+)
GND VOUT(GND)

接下来,我们做开发板与各个传感器、继电器等之间的连线。

TPYBoard v102 DHT11温湿度模块
GND GND
Y12 DATA
VIN VCC
TPYBoard v102 土壤湿度检测模块
Y11 DO
GND GND
3V3 VCC
TPYBoard v102 光敏模块
X22 DO
GND GND
3V3 VCC
TPYBoard v102 继电器(排风扇
3V3 VCC
GND GND
X11 IN
VIN COM
USB风扇 继电器(排风扇
正极 NO
USB风扇 TPYBoardv102
负极 GND
TPYBoard v102 继电器(水泵)
3V3 VCC
GND GND
X12 IN
VIN COM
水泵 继电器(水泵)
正极 NO
水泵 TPYBoardv102
负极 GND
TPYBoard v102 步进电机驱动板
X21 IN1
X20 IN2
X19 IN3
X18 IN4
VIN 5V(+)
GND 5V(-)

 我们用步进电机来控制遮光罩的卷起和放开。为了能明显的看到步进电机的转动效果,我们一个小风扇在上面。

降压模块的OUT输出电源要接到开发板上,用于给其供电。整体效果如下图:

四、源程序

接线完毕后,就要将最重要的程序放到开发板上。首先,通过USB数据线将开发板接入电脑,电脑上会出现一个类似U盘的可移动设备,名称为【TPYBFLASH】,把main.py、dht11.py、stepermotor.py拷贝到里面即可。

注意:操作开发板磁盘时,板载的红色LED会亮,说明开发板正在保存操作,需等待红灯熄灭再进行其他操作。

dht11.py源程序 

import pyb

from pyb import UART

from pyb import Pin,delay,udelay

import time

class DHT11:

    def __init__(self,pin_name):

        time.sleep(1)

        self.N1 = Pin(pin_name, Pin.OUT_PP)

        self.PinName=pin_name

        pyb.delay(10)

    def read_data(self):

        self.__init__(self.PinName)

        data=[]

        j=0

        N1=self.N1

        N1.low()

        delay(20)

        N1.high()

        N1 = Pin(self.PinName, Pin.IN)

        udelay(30)

        if N1.value() != 0:

            return [0,0]

        while N1.value()==0:

            continue

        while N1.value()==1:

            continue

        while j<40:

            k=0

            while N1.value()==0:

                continue

            while N1.value()==1:

                k+=1

                if k>100:break

            if k<3:

                data.append(0)

            else:

                data.append(1)

            j=j+1

        print('Sensor is working')

        j=0

        humidity_bit=data[0:8]

        humidity_point_bit=data[8:16]

        temperature_bit=data[16:24]

        temperature_point_bit=data[24:32]

        check_bit=data[32:40]

        humidity=0

        humidity_point=0

        temperature=0

        temperature_point=0

        check=0

        for i in range(8):

            humidity+=humidity_bit[i]*2**(7-i)

            humidity_point+=humidity_point_bit[i]*2**(7-i)

            temperature+=temperature_bit[i]*2**(7-i)

            temperature_point+=temperature_point_bit[i]*2**(7-i)

            check+=check_bit[i]*2**(7-i)

        tmp=humidity+humidity_point+temperature+temperature_point

        if check==tmp:

            print('temperature is',temperature,'-wet is',humidity,'%')

        else:

            print('Error:',humidity,humidity_point,temperature,temperature_point,check)

        return [str(temperature),str(humidity)]

main.py源程序

from pyb import Pin

from pyb import ADC

from stepermotor import SteperMotor

from dht11 import DHT11

#0:亮 1:暗

light = Pin('X22',Pin.IN)

#0:湿 1:干

hum = Pin('Y11',Pin.IN)

dht = DHT11('Y12')

#继电器低电平触发

water = Pin('X12',Pin.OUT_PP)

fan = Pin('X11',Pin.OUT_PP)

water.value(1)

fan.value(1)

#步进电机

Pin_All=[Pin(p,Pin.OUT_PP) for p in ['X21','X20','X19','X18']]

#转速(ms) 数值越大转速越慢 最小值2ms

sm = SteperMotor(pin = Pin_All,speed=2)

hood = False #记录遮光罩的状态,默认是关闭

def readTaHData():

    DATA = dht.read_data()#读取温湿度的值

    print(DATA[0],'℃')

    print(DATA[1],'%')

    #温度大于25度,打开风扇,进行通风

    if int(DATA[0]) > 21:

        fan.value(0)

    else:

        fan.value(1)

if __name__ == '__main__':

    while True:

        readTaHData()

        h_d = hum.value()

        print('hum:',h_d)

        if h_d:

            #土壤较干,打开抽水泵进行浇水

            water.value(0)

        else:

            #土壤较湿,关闭抽水泵停止浇水

            water.value(1)

        l_d = light.value()

        print('light:',l_d)

        if l_d:

            #光线较暗,启动步进电机,关闭大棚的遮光罩

            if hood:

                sm.steperRun(-360)

                sm.steperRun(-360)

                hood = False

        else:

            #光线较亮,启动步进电机,打开大棚的遮光罩

            if not hood:

                sm.steperRun(360)

                sm.steperRun(360)

                hood = True

stepermotor.py源程序

# main.py -- put your code here!

import pyb

from pyb import Pin

Pin_All=[Pin(p,Pin.OUT_PP) for p in ['X1','X2','X3','X4']]

STEPER_ROUND=512 #转动一圈(360度)的周期

ANGLE_PER_ROUND=STEPER_ROUND/360 #转动1度的周期

class SteperMotor():

    def __init__(self,pin = None,speed=2):

        if pin != None:

            self.Pins = pin

        else:

            self.Pins = Pin_All

        self.Speed =  speed

    #私有方法

    def __SteperWriteData(self,data):

        count=0

        for i in data:

            self.Pins[count].value(i)

            count+=1

    def __SteperFrontTurn(self):

        speed = self.Speed

        self.__SteperWriteData([1,1,0,0])

        pyb.delay(speed)

        self.__SteperWriteData([0,1,1,0])

        pyb.delay(speed)

        self.__SteperWriteData([0,0,1,1])

        pyb.delay(speed)

        self.__SteperWriteData([1,0,0,1])   

        pyb.delay(speed)

    def __SteperBackTurn(self):

        speed = self.Speed

        self.__SteperWriteData([1,1,0,0])

        pyb.delay(speed)

        self.__SteperWriteData([1,0,0,1])   

        pyb.delay(speed)

        self.__SteperWriteData([0,0,1,1])

        pyb.delay(speed)

        self.__SteperWriteData([0,1,1,0])

        pyb.delay(speed)

    def __SteperStop(self):

        self.__SteperWriteData([0,0,0,0])

    def steperRun(self,angle):

        val=ANGLE_PER_ROUND*abs(angle)

        if(angle>0):

            for i in range(0,val):

                self.__SteperFrontTurn()

        else:

            for i in range(0,val):

                self.__SteperBackTurn()

        angle = 0

        self.__SteperStop()

五、演示效果

程序调试完,拔掉USB数据线。放入18650电池,按下按键开关即可。不同的环境下,土壤湿度和光照模块需要调节灵敏度(转换模块上的蓝色按钮)。

*本文作者:_橙子 ゝ,转载请注明来自FreeBuf.COM

来源:freebuf.com 2020-04-23 09:00:12 by: _橙子 ゝ

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论