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