28859浏览
查看: 28859|回复: 0

[项目] LabVIEW Arduino RS-485智能农业监测系统(项目篇—4)

[复制链接]
本帖最后由 不脱发的程序猿 于 2022-7-6 00:07 编辑

1、项目概述
智能农业是目前农业发展的新方向,它根据农作物的生长习性及时调整土壤状况和环境参数,以最少的投入获得最高的收益,改变了传统农业中必须依靠环境种植的弊端及粗放的生产经营管理模式,改善了农产品的质量与品质,调整了农业的产业结构,确保了农产品的总产量,高效地利用了各种各样的农业资源,可取得可观的经济效益和社会效益。
在农业生产过程中,温度、湿度、光照强度、CO2浓度、水分,以及其他养分等多种自然因素共同影响农作物生长。传统农业的管理方式远远没有达到精细化管理的标准,只能算是粗放式管理,在这种管理方式下,通过人的感知能力来管理上述环境参数,无法达到准确性要求。而智能农业,是通信、计算机和农学等若干学科和领域共同发展并相互结合所形成的产物,它将信息采集、传输、处理和控制集成在一起,使人们更容易获得农作物生长各个阶段的各类信息,也让人们更容易掌控这些信息,通过人工智能与农业生产的结合真正实现人与自然的交互。
智能农业的核心问题可以概括为以下四部分,即农业信息的获取、对所获取信息的管理、经信息分析做出的决策、由决策而决定的具体实施方针。在这四部分中,对农业信息的获取是智能农业的起点,也是非常关键的一点,做不到准确实时地获取农业信息,就无法建造真正的智能农业。而实现智能农业,建立一个实用、可靠、可长期监测的农业环境监测系统是非常必要的。
随着通信、计算机、传感网等技术的迅猛发展,将物联网应用到农业监测系统中已经是目前的发展趋势,它将采集到的温度、湿度、光照强度、土壤水分、土壤温度、植物生长状况等农业信息进行加工、传输和利用,为农业生产在各个时期的精准管理和预警提供信息支持,追求以最少的资源消耗获得最大的优质产出,使农业增长由主要依赖自然条件和自然资源向主要依赖信息资源转变,使不可控的产业得以有效控制。
2、项目架构
本篇博文将要介绍一种基于Arduino与LabVIEW的智能农业监测系统,可以实现农作物生长环境参数的实时采集以及上位机监测软件的数据分析和远程监测。数据采集终端设备采用Arduino作为控制核心,上位机软件采用LabVIEW,两者通过RS-485总线实现通信,只需要在田垄之间进行RS-485布线,即可实现组网通信。
项目资源下载请参见:LabVIEW Arduino RS-485智能农业监测系统【实战项目】
3、传感器选型
3.1、温湿度传感器
SHT11是瑞士Sensirion公司推出的一款数字温湿度传感器芯片,将传感元件和信号处理电路集成在一块微型电路板上,输出完全标定的数字信号,采用CMOSens专利技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器芯片内部包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成的测温元件,并在同一芯片上与14位的A/D转换器以及串行接口电路实现无缝连接。因此,具有品质卓越、响应迅速、抗干扰能力强、性价比高等优点,广泛应用于暖通空调、汽车、消费电子、自动控制等领域。
每个传感器芯片都在极为精确的湿度腔室中进行标定,校准系数以程序形式储存在OTP内存中,用于内部的信号校准。两线制的串行接口与内部的电压调整,使外围系统集成变得快速而简单。微小的体积、极低的功耗,使SHT11成为各类应用的首选。
3.2、光强度传感器
BH1750FVI是一种两线式串行总线接口的数字型光强度传感器,可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度,利用它的高分辨率可以探测较大范围的光强度变化。BH1750FVI光照传感器模块如下图所示:
3.3、水分传感器
专业的农用水分传感器价格较贵,此处选择价格较为低廉的电阻式水分传感器,如下图所示:
4、硬件环境
将SHT11温湿度传感器的VCC、GND、SCK、DATA分别接至Arduino Uno控制板上的+5V、GND、模拟端口A2和A3。
将BH1750FVI光照传感器的VCC、GND、SCL、SDA和ADD分别接至Arduino Uno控制板上的+5V、GND、SCL、SDA和GND,此处在硬件连接图上没有表示出来。
将水分传感器的VCC、GND、Vout分别接至Arduino Uno控制板上的+5V、GND和模拟端口A0,此处在硬件连接图上表示出来。
将MAX485模块的VCC、GND、RO、DI分别接至Arduino Uno控制板上的+5V、GND、RX和TX,将RE和DE端接至数字端口D2,用于控制收发信号。
Arduino Uno与MAX485和SHT11的硬件连接,如下图所示:
5、Arduino功能设计
在基于RS-485总线的智能农业监测系统中,每个节点配置一个Arduino Uno控制器通过MAX485模块挂在RS-485总线上。Arduino Uno控制器需要完成以下功能:接收和判断命令、采集和传输温湿度、光照和水分数据。Arduino Uno控制器利用MAX485模块通过串口从RS-485总线上接收上位机发来的命令,分析得到有效命令,再根据命令码实现温湿度、光照和水分数据的采集,并上传给LabVIEW软件。
智能农业监测系统Arduino控制器程序代码如下所示:
  1. #include <Wire.h>
  2. #include <SHT1x.h>
  3. #define temp_Command          0x10   //采集命令字
  4. #define humidity_Command      0x20   //A1采集命令字
  5. #define water_Command         0x30   //D1采集命令字
  6. #define illumination_Command  0x40   //D0采集命令字
  7. // GY-30
  8. // BH1750FVI
  9. // in ADDR 'L' mode 7bit addr
  10. #define ADDR 0b0100011
  11. // addr 'H' mode
  12. // #define ADDR 0b1011100
  13. // Specify data and clock connections and instantiate SHT1x object
  14. #define dataPin  A3
  15. #define clockPin A2
  16. SHT1x sht1x(dataPin, clockPin);
  17. byte comdata[3]={0};      //定义数组数据,存放串口接收数据
  18. float temp_c;
  19. float humidity;
  20. int dustPin=0;
  21. int dustVal=0;
  22. int Water_Val=0;
  23. int Illumination_Val = 0;
  24. void receive_data(void);      //接受串口数据
  25. void test_do_data(void);      //测试串口数据是否正确,并更新数据
  26. void setup()
  27. {
  28.   Serial.begin(9600);      
  29.   Wire.begin();
  30.   Wire.beginTransmission(ADDR);
  31.   Wire.write(0b00000001);
  32.   Wire.endTransmission();
  33. }
  34. void loop()
  35. {
  36.   while (Serial.available() > 0)   //不断检测串口是否有数据
  37.    {
  38.         receive_data();            //接受串口数据
  39.         test_do_data();            //测试数据是否正确并更新标志位
  40.    }
  41. }
  42. void receive_data(void)      
  43. {
  44.    int i ;
  45.    for(i=0;i<3;i++)
  46.    {
  47.       comdata[i] =Serial.read();
  48.       //延时一会,让串口缓存准备好下一个字节,不延时可能会导致数据丢失,
  49.        delay(2);
  50.    }
  51. }
  52. void test_do_data(void)
  53. {
  54.   if(comdata[0] == 0x55)            //0x55和0xAA均为判断是否为有效命令
  55.    {
  56.      if(comdata[1] == 0xFF)
  57.      {
  58.         switch(comdata[2])
  59.           {   
  60.             case temp_Command:   
  61.                 temp_c = sht1x.readTemperatureC();
  62.                 Serial.print(temp_c, 2);  
  63.                  break;
  64.             case humidity_Command:   
  65.                  humidity = sht1x.readHumidity();
  66.                  Serial.print(humidity,2);
  67.                  break;
  68.             case water_Command:   
  69.                  Water_Val=analogRead(A0);
  70.                  Serial.print(Water_Val);                    
  71.                  break;
  72.             case illumination_Command:                  
  73.                    // reset
  74.                   Wire.beginTransmission(ADDR);
  75.                   Wire.write(0b00000111);
  76.                   Wire.endTransmission();
  77.                   delay(100);
  78.                   Wire.beginTransmission(ADDR);
  79.                   Wire.write(0b00100000);
  80.                   Wire.endTransmission();
  81.               // typical read delay 120ms
  82.                   delay(120);
  83.                   Wire.requestFrom(ADDR, 2); // 2byte every time
  84.                   for (Illumination_Val=0; Wire.available()>=1; ) {
  85.                   char c = Wire.read();
  86.                   //Serial.println(c, HEX);
  87.                   Illumination_Val = (Illumination_Val << 8) + (c & 0xFF);
  88.                   }
  89.                   Illumination_Val = Illumination_Val / 1.2;
  90.                   Serial.println(Illumination_Val);                          
  91.                  break;               
  92.           }
  93.        }
  94.    }
  95. }
复制代码
6、LabVIEW功能设计
LabVIEW上位机部分需要完成如下功能:根据所选择的节点向RS-485总线上发送不同节点号的温度、湿度、光照、水分的数据采集命令,Arduino控制器通过串口和MAX485模块从RS-485总线上接收上位机命令,然后判断接收的命令中的节点号是否与自己的节点号匹配,如果匹配则实现相应的数据采集之后并将采集的数据回传,LabVIEW软件将回传的数据显示在前面板上;如果不匹配则舍弃当前接收的上位机命令,重新等待下次命令的到来。
6.1、前面板设计
LabVIEW前面板分为节点选择、工作指示灯和数据显示模块,节点选择用于选择当前监测的节点,将其数据显示在显示模块上;工作指示灯用于该节点是否正常工作;显示模块主要用于显示当前的数据,包括温度、湿度、光照和水分情况。
基于Arduino与LabVIEW的智能农业监控系统的LabVIEW上位机前面板,如下图所示:
6.2、程序框图设计
采用条件结构+移位寄存器的状态机来实现LabVIEW上位机主程序,将主程序划分为5个状态:0状态为串口初始化,1状态为温度测量,2状态为湿度测量,3状态为光照测量,4状态为水分测量,且初始状态为0状态(串口初始化)。
为了更好地实现通信,制定如下的通信协议:帧头+节点代号+操作码。0x55为帧头,节点代号有0xA1为节点0的代号,0xA2为节点1的代号,0xA3为节点2的代号,0xA4为节点3的代号,0xA5为节点4的代号,操作码有0x10为温度采集,0x20为湿度采集,0x30为光照采集,0x40为水分采集。
在0状态中,通过设置的串口号来初始化串口通信,如下图所示:
在1状态中,读取温度数据并显示,如下图所示:
在2状态中,读取湿度数据并显示,如下图所示:
在3状态中,读取光照数据并显示,如下图所示:
在4状态中,读取水分数据并显示,如下图所示:
最后,关闭串口通信。
由于RS-485总线具有抗干扰能力强的优点,适合用于可靠性要求高的场合,本节介绍的智能农业监测系统采用RS-485总线作为每个子节点与总站的通信方式,如果需要检测的面积较大,监测密度较为稀疏,RS-485总线方式需要很多的线材,则采用ZigBee无线通信方式更为实用。由于农业专业的传感器价格较为昂贵,本部分采用较为低廉的传感器来实现了一个简易的监测,如果需要专业应用,则需要购买农业专用的传感器。
项目资源下载请参见:LabVIEW Arduino RS-485智能农业监测系统【实战项目】

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail