找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6599|回复: 2
收起左侧

MicroPython智慧农业大棚监测控制系统程序设计

[复制链接]
ID:596378 发表于 2019-8-12 20:42 | 显示全部楼层 |阅读模式
分享给大家
1.jpg
             智慧农业就是将物联网技术运用到传统农业中去,运用传感器和软件通过移动平台或者电脑平台对农业生产进行控制,使传统农业更具有“智慧”。除了精准感知、控制与决策管理外,从广泛意义上讲,智慧农业还包括农业电子商务、食品溯源防伪、农业休闲旅游、农业信息服务等方面的内容。
              智慧农业是农业生产的高级阶段,是集新兴的互联网、移动互联网、云计算和物联网技术为一体,依托部署在农业生产现场的各种传感节点(环境温湿度、土壤水分、二氧化碳、图像等)和无线通信网络实现农业生产环境的智能感知、智能预警、智能决策、智能分析、专家在线指导,为农业生产提供精准化种植、可视化管理、智能化决策。
              本次实验以大棚监测控制系统为目标,使用TPYBoardv102开发板、各种传感器、电机等,实现一个智能大棚监测控制系统的基础模型。
系统主要的技术特点
  • 监控功能系统:根据各类传感器来获取植物生长环境信息,如监测土壤水分、空气温度、空气湿度、光照强等参数(大家可根据自己的需求,增加其他参数,如二氧化塘、土壤温度等
  • 自动控制系统:TPYBoardv102开发板作为主控模块,负责各个环境信息收集与汇总,并根据以上各类信息的反馈对农业大棚内进行自动灌溉、自动降温、自动卷遮光罩等自动控制。
所需器件
名称
数量
TPYBoard v102开发板
1个
miniUSB数据线
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。



各类器件没有固定,看起来有点乱。接下来,用热熔胶把器件整齐的固定在洞洞板上。

本次我用步进电机来模块遮光罩的卷起和放开。为了能明显的看到步进电机的转动效果,我在步进电机上粘了一个塑料小风扇。
还有一处地方,就是降压模块的OUT输出电源要接到开发板上,用于给其供电。整体效果如下图:
程序调试
              接线完毕后,就要将最重要的程序放到开发板上。首先,通过USB数据线将开发板接入电脑,电脑上会出现一个类似U盘的可移动设备,名称为【TPYBFLASH】,把程序拷贝到里面即可。
              注意:操作开发板磁盘时,板载红色LED亮,说明开发板正在保存操作,需等待红灯熄灭进行其他操作。

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

源程序如下:
  1. Dht11.py:
  2. import pyb
  3. from pyb import UART
  4. from pyb import Pin,delay,udelay
  5. import time
  6. class DHT11:
  7.     def __init__(self,pin_name):
  8.         time.sleep(1)
  9.         self.N1 = Pin(pin_name, Pin.OUT_PP)
  10.         self.PinName=pin_name
  11.         pyb.delay(10)
  12.     def read_data(self):
  13.         self.__init__(self.PinName)
  14.         data=[]
  15.         j=0
  16.         N1=self.N1
  17.         N1.low()
  18.         delay(20)
  19.         N1.high()
  20.         N1 = Pin(self.PinName, Pin.IN)
  21.         udelay(30)
  22.         if N1.value() != 0:
  23.             return [0,0]
  24.         while N1.value()==0:
  25.             continue
  26.         while N1.value()==1:
  27.             continue
  28.         while j<40:
  29.             k=0
  30.             while N1.value()==0:
  31.                 continue
  32.             while N1.value()==1:
  33.                 k+=1
  34.                 if k>100:break
  35.             if k<3:
  36.                 data.append(0)
  37.             else:
  38.                 data.append(1)
  39.             j=j+1
  40.         print('Sensor is working')
  41.         j=0
  42.         humidity_bit=data[0:8]
  43.         humidity_point_bit=data[8:16]
  44.         temperature_bit=data[16:24]
  45.         temperature_point_bit=data[24:32]
  46.         check_bit=data[32:40]
  47.         humidity=0
  48.         humidity_point=0
  49.         temperature=0
  50.         temperature_point=0
  51.         check=0
  52.         for i in range(8):
  53.             humidity+=humidity_bit[i]*2**(7-i)
  54.             humidity_point+=humidity_point_bit[i]*2**(7-i)
  55.             temperature+=temperature_bit[i]*2**(7-i)
  56.             temperature_point+=temperature_point_bit[i]*2**(7-i)
  57.             check+=check_bit[i]*2**(7-i)
  58.         tmp=humidity+humidity_point+temperature+temperature_point
  59.         if check==tmp:
  60.             print('temperature is',temperature,'-wet is',humidity,'%')
  61.         else:
  62.             print('Error:',humidity,humidity_point,temperature,temperature_point,check)
  63.         return [str(temperature),str(humidity)]


  64. # main.py
  65. import pyb
  66. from pyb import Pin

  67. Pin_All=[Pin(p,Pin.OUT_PP) for p in ['X1','X2','X3','X4']]
  68. STEPER_ROUND=512 #转动一圈(360度)的周期
  69. ANGLE_PER_ROUND=STEPER_ROUND/360 #转动1度的周期

  70. class SteperMotor():

  71.     def __init__(self,pin = None,speed=2):
  72.         if pin != None:
  73.             self.Pins = pin
  74.         else:
  75.             self.Pins = Pin_All
  76.         self.Speed =  speed
  77.     #私有方法
  78.     def __SteperWriteData(self,data):
  79.         count=0
  80.         for i in data:
  81.             self.Pins[count].value(i)
  82.             count+=1
  83.     def __SteperFrontTurn(self):
  84.         speed = self.Speed
  85.         
  86.         self.__SteperWriteData([1,1,0,0])
  87.         pyb.delay(speed)

  88.         self.__SteperWriteData([0,1,1,0])
  89.         pyb.delay(speed)

  90.         self.__SteperWriteData([0,0,1,1])
  91.         pyb.delay(speed)

  92.         self.__SteperWriteData([1,0,0,1])   
  93.         pyb.delay(speed)
  94.         
  95.     def __SteperBackTurn(self):
  96.         speed = self.Speed
  97.         
  98.         self.__SteperWriteData([1,1,0,0])
  99.         pyb.delay(speed)
  100.         
  101.         self.__SteperWriteData([1,0,0,1])   
  102.         pyb.delay(speed)

  103.         self.__SteperWriteData([0,0,1,1])
  104.         pyb.delay(speed)

  105.         self.__SteperWriteData([0,1,1,0])
  106.         pyb.delay(speed)


  107.     def __SteperStop(self):
  108.         self.__SteperWriteData([0,0,0,0])
  109.         
  110.     def steperRun(self,angle):
  111.         val=ANGLE_PER_ROUND*abs(angle)
  112.         if(angle>0):
  113.             for i in range(0,val):
  114.                 self.__SteperFrontTurn()
  115.         else:
  116.             for i in range(0,val):
  117.                 self.__SteperBackTurn()
  118.         angle = 0
  119.         self.__SteperStop()

  120. 温湿度main:
  121. from pyb import Pin
  122. from pyb import ADC
  123. from stepermotor import SteperMotor
  124. from dht11 import DHT11

  125. #0:亮 1:暗
  126. light = Pin('X22',Pin.IN)
  127. #0:湿 1:干
  128. hum = Pin('Y11',Pin.IN)
  129. dht = DHT11('Y12')
  130. #继电器低电平触发
  131. water = Pin('X12',Pin.OUT_PP)
  132. fan = Pin('X11',Pin.OUT_PP)
  133. water.value(1)
  134. fan.value(1)
  135. #步进电机
  136. Pin_All=[Pin(p,Pin.OUT_PP) for p in ['X21','X20','X19','X18']]
  137. #转速(ms) 数值越大转速越慢 最小值2ms
  138. sm = SteperMotor(pin = Pin_All,speed=2)
  139. hood = False #记录遮光罩的状态,默认是关闭
  140. def readTaHData():
  141.     DATA = dht.read_data()#读取温湿度的值
  142.     print(DATA[0],'℃')
  143.     print(DATA[1],'%')
  144.     #温度大于25度,打开风扇,进行通风
  145.     if int(DATA[0]) > 21:
  146.         fan.value(0)
  147.     else:
  148.         fan.value(1)
  149. if __name__ == '__main__':
  150.     while True:
  151.         readTaHData()
  152.         h_d = hum.value()
  153.         print('hum:',h_d)
  154.         if h_d:
  155.             #土壤较干,打开抽水泵进行浇水
  156.             water.value(0)
  157.         else:
  158.             #土壤较湿,关闭抽水泵停止浇水
  159.             water.value(1)
  160.         l_d = light.value()
  161.         print('light:',l_d)
  162.         if l_d:
  163.             #光线较暗,启动步进电机,关闭大棚的遮光罩
  164.             if hood:
  165.                 sm.steperRun(-360)
  166.                 sm.steperRun(-360)
  167.                 hood = False
  168.         else:
  169.             #光线较亮,启动步进电机,打开大棚的遮光罩
  170.             if not hood:
  171.                 sm.steperRun(360)
  172.                 sm.steperRun(360)
  173.                 hood = True
复制代码
全部资料51hei下载地址:
大棚.zip (8.66 MB, 下载次数: 67)

评分

参与人数 2黑币 +80 收起 理由
1526810086 + 30 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:754188 发表于 2020-5-17 18:10 | 显示全部楼层
不错!小型控制器,也算是智慧农业起步
回复

使用道具 举报

ID:402344 发表于 2020-5-30 15:51 | 显示全部楼层
国家就是需要你这样的人才666
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表