分享给大家
智慧农业就是将物联网技术运用到传统农业中去,运用传感器和软件通过移动平台或者电脑平台对农业生产进行控制,使传统农业更具有“智慧”。除了精准感知、控制与决策管理外,从广泛意义上讲,智慧农业还包括农业电子商务、食品溯源防伪、农业休闲旅游、农业信息服务等方面的内容。 智慧农业是农业生产的高级阶段,是集新兴的互联网、移动互联网、云计算和物联网技术为一体,依托部署在农业生产现场的各种传感节点(环境温湿度、土壤水分、二氧化碳、图像等)和无线通信网络实现农业生产环境的智能感知、智能预警、智能决策、智能分析、专家在线指导,为农业生产提供精准化种植、可视化管理、智能化决策。 本次实验以大棚监测控制系统为目标,使用TPYBoardv102开发板、各种传感器、电机等,实现一个智能大棚监测控制系统的基础模型。 系统主要的技术特点: - 监控功能系统:根据各类传感器来获取植物生长的环境信息,如监测土壤水分、空气温度、空气湿度、光照强度等参数(大家可根据自己的需求,增加其他参数,如二氧化塘、土壤温度等)。
- 自动控制系统:TPYBoardv102开发板作为主控模块,负责各个环境信息的收集与汇总,并根据以上各类信息的反馈对农业大棚内进行自动灌溉、自动降温、自动卷遮光罩等自动控制。
所需器件
实物图:(部分主要器件)
程序设计(1)获取温湿度数据,当温度高于阈值时,触发继电器,打开排风扇,反之关闭; (2)获取土壤湿度数据,当湿度低于土壤湿度检测模块的阈值时,土壤湿度检测模块的OUT引脚会输出高电平,这时触发继电器,启动水泵进行灌溉; (3)获取光照强度数据,当光照强度高于阈值时,触发步进电机,卷起遮光罩,反之盖上。 实物连接 先连接电源部分。电源部分主要涉及到降压模块和按键开关。先用万用表,找出按键开关中哪两个引脚是按下导通,弹起不导通的。这里,我们假设为引脚A和引脚B。
各类器件没有固定,看起来有点乱。接下来,用热熔胶把器件整齐的固定在洞洞板上。
本次我用步进电机来模块遮光罩的卷起和放开。为了能明显的看到步进电机的转动效果,我在步进电机上粘了一个塑料小风扇。 还有一处地方,就是降压模块的OUT输出电源要接到开发板上,用于给其供电。整体效果如下图: 程序调试 接线完毕后,就要将最重要的程序放到开发板上。首先,通过USB数据线将开发板接入电脑,电脑上会出现一个类似U盘的可移动设备,名称为【TPYBFLASH】,把程序拷贝到里面即可。 注意:操作开发板磁盘时,板载的红色LED会亮,说明开发板正在保存操作,需等待红灯熄灭再进行其他操作。
演示效果 程序调试完,拔掉USB数据线。放入18650电池,按下按键开关即可。不同的环境下,土壤湿度和光照模块需要调节灵敏度(转换模块上的蓝色按钮)。
源程序如下:
- 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
- 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()
- 温湿度main:
- 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
复制代码 全部资料51hei下载地址:
大棚.zip
(8.66 MB, 下载次数: 74)
|