電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 65|回復(fù): 0
收起左側(cè)

LabVIEW Arduino RS-485智能農(nóng)業(yè)監(jiān)測(cè)系統(tǒng)(項(xiàng)目篇—4)

[復(fù)制鏈接]

601

主題

601

帖子

4762

積分

四級(jí)會(huì)員

Rank: 4

積分
4762
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2022-8-16 12:00:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

: G' w' g6 ?8 l0 M) Y7 m; m點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
9 g1 m. |( G# W2 U0 [) l7 K) B1
4 H1 `  h& t. ]0 y. d$ k! m1 N項(xiàng)目概述
" H* L; v6 @8 \/ f+ E) R. D- P/ c+ [8 Q
智能農(nóng)業(yè)是目前農(nóng)業(yè)發(fā)展的新方向,它根據(jù)農(nóng)作物的生長(zhǎng)習(xí)性及時(shí)調(diào)整土壤狀況和環(huán)境參數(shù),以最少的投入獲得最高的收益,改變了傳統(tǒng)農(nóng)業(yè)中必須依靠環(huán)境種植的弊端及粗放的生產(chǎn)經(jīng)營(yíng)管理模式,改善了農(nóng)產(chǎn)品的質(zhì)量與品質(zhì),調(diào)整了農(nóng)業(yè)的產(chǎn)業(yè)結(jié)構(gòu),確保了農(nóng)產(chǎn)品的總產(chǎn)量,高效地利用了各種各樣的農(nóng)業(yè)資源,可取得可觀的經(jīng)濟(jì)效益和社會(huì)效益。7 A7 ?' w* r8 W7 |9 d% R
* P) X; \2 k* ^+ W, H
在農(nóng)業(yè)生產(chǎn)過(guò)程中,溫度、濕度、光照強(qiáng)度、CO2濃度、水分,以及其他養(yǎng)分等多種自然因素共同影響農(nóng)作物生長(zhǎng)。傳統(tǒng)農(nóng)業(yè)的管理方式遠(yuǎn)遠(yuǎn)沒(méi)有達(dá)到精細(xì)化管理的標(biāo)準(zhǔn),只能算是粗放式管理,在這種管理方式下,通過(guò)人的感知能力來(lái)管理上述環(huán)境參數(shù),無(wú)法達(dá)到準(zhǔn)確性要求。而智能農(nóng)業(yè),是通信、計(jì)算機(jī)和農(nóng)學(xué)等若干學(xué)科和領(lǐng)域共同發(fā)展并相互結(jié)合所形成的產(chǎn)物,它將信息采集、傳輸、處理和控制集成在一起,使人們更容易獲得農(nóng)作物生長(zhǎng)各個(gè)階段的各類(lèi)信息,也讓人們更容易掌控這些信息,通過(guò)人工智能與農(nóng)業(yè)生產(chǎn)的結(jié)合真正實(shí)現(xiàn)人與自然的交互。
2 V) E- z. L4 H) F5 d- j) e  O7 j) v
智能農(nóng)業(yè)的核心問(wèn)題可以概括為以下四部分,即農(nóng)業(yè)信息的獲取、對(duì)所獲取信息的管理、經(jīng)信息分析做出的決策、由決策而決定的具體實(shí)施方針。在這四部分中,對(duì)農(nóng)業(yè)信息的獲取是智能農(nóng)業(yè)的起點(diǎn),也是非常關(guān)鍵的一點(diǎn),做不到準(zhǔn)確實(shí)時(shí)地獲取農(nóng)業(yè)信息,就無(wú)法建造真正的智能農(nóng)業(yè)。而實(shí)現(xiàn)智能農(nóng)業(yè),建立一個(gè)實(shí)用、可靠、可長(zhǎng)期監(jiān)測(cè)的農(nóng)業(yè)環(huán)境監(jiān)測(cè)系統(tǒng)是非常必要的。
) Y% v  Q6 G) s. I5 l  x" Y- Q% I' b; w, [: }/ v
隨著通信、計(jì)算機(jī)、傳感網(wǎng)等技術(shù)的迅猛發(fā)展,將物聯(lián)網(wǎng)應(yīng)用到農(nóng)業(yè)監(jiān)測(cè)系統(tǒng)中已經(jīng)是目前的發(fā)展趨勢(shì),它將采集到的溫度、濕度、光照強(qiáng)度、土壤水分、土壤溫度、植物生長(zhǎng)狀況等農(nóng)業(yè)信息進(jìn)行加工、傳輸和利用,為農(nóng)業(yè)生產(chǎn)在各個(gè)時(shí)期的精準(zhǔn)管理和預(yù)警提供信息支持,追求以最少的資源消耗獲得最大的優(yōu)質(zhì)產(chǎn)出,使農(nóng)業(yè)增長(zhǎng)由主要依賴自然條件和自然資源向主要依賴信息資源轉(zhuǎn)變,使不可控的產(chǎn)業(yè)得以有效控制。. i+ x' o" J" N. X6 @8 k/ }  \
2* K2 k6 q/ k+ @' K& N
項(xiàng)目架構(gòu)( y/ T1 p+ K8 R+ J' r2 v6 {' d

/ @" d9 `) N6 ~3 V本篇博文將要介紹一種基于Arduino與LabVIEW的智能農(nóng)業(yè)監(jiān)測(cè)系統(tǒng),可以實(shí)現(xiàn)農(nóng)作物生長(zhǎng)環(huán)境參數(shù)的實(shí)時(shí)采集以及上位機(jī)監(jiān)測(cè)軟件的數(shù)據(jù)分析和遠(yuǎn)程監(jiān)測(cè)。數(shù)據(jù)采集終端設(shè)備采用Arduino作為控制核心,上位機(jī)軟件采用LabVIEW,兩者通過(guò)RS-485總線實(shí)現(xiàn)通信,只需要在田壟之間進(jìn)行RS-485布線,即可實(shí)現(xiàn)組網(wǎng)通信。
* `. C. E# @) |6 U/ G4 Z2 r$ M; \; }4 ?! Y% X' G2 c' B/ c

# J1 p' Y4 i  ?& H6 C6 `8 R/ M9 G) S2 z, y5 j
39 h3 i4 z8 s9 J+ @! i/ [
傳感器選型! }0 j) g1 Y; `2 q, Q9 A! d  s
1 e. |3 I6 u$ J$ n$ R! u
3.1、溫濕度傳感器
/ b* r4 R- Y8 Q; O# A* a7 ]) L1 u: w& H- N3 B6 h
SHT11是瑞士Sensirion公司推出的一款數(shù)字溫濕度傳感器芯片,將傳感元件和信號(hào)處理電路集成在一塊微型電路板上,輸出完全標(biāo)定的數(shù)字信號(hào),采用CMOSens專(zhuān)利技術(shù),確保產(chǎn)品具有極高的可靠性與卓越的長(zhǎng)期穩(wěn)定性。傳感器芯片內(nèi)部包括一個(gè)電容性聚合體測(cè)濕敏感元件、一個(gè)用能隙材料制成的測(cè)溫元件,并在同一芯片上與14位的A/D轉(zhuǎn)換器以及串行接口電路實(shí)現(xiàn)無(wú)縫連接。因此,具有品質(zhì)卓越、響應(yīng)迅速、抗干擾能力強(qiáng)、性價(jià)比高等優(yōu)點(diǎn),廣泛應(yīng)用于暖通空調(diào)、汽車(chē)、消費(fèi)電子、自動(dòng)控制等領(lǐng)域。
& U; d3 e$ Q8 V2 S8 n5 R* S3 I; @4 ]) T
每個(gè)傳感器芯片都在極為精確的濕度腔室中進(jìn)行標(biāo)定,校準(zhǔn)系數(shù)以程序形式儲(chǔ)存在OTP內(nèi)存中,用于內(nèi)部的信號(hào)校準(zhǔn)。兩線制的串行接口與內(nèi)部的電壓調(diào)整,使外圍系統(tǒng)集成變得快速而簡(jiǎn)單。微小的體積、極低的功耗,使SHT11成為各類(lèi)應(yīng)用的首選。
! N" T! x8 h9 \$ w
# P$ ]: l) |7 m3 E6 o; m/ p # A4 C" T0 u" f" Z

$ ^. s% ~# A* R0 F1 u3 ^3.2、光強(qiáng)度傳感器
7 o! r4 ?- e4 t0 E' O
% j; R6 B# N9 [& [2 u' P2 c- ^  JBH1750FVI是一種兩線式串行總線接口的數(shù)字型光強(qiáng)度傳感器,可以根據(jù)收集的光線強(qiáng)度數(shù)據(jù)來(lái)調(diào)整液晶或者鍵盤(pán)背景燈的亮度,利用它的高分辨率可以探測(cè)較大范圍的光強(qiáng)度變化。BH1750FVI光照傳感器模塊如下圖所示:
# ]1 U2 g2 i6 Z8 k7 t
8 r& {0 O2 l6 j2 T  a; _ # O; t, T+ J/ M: e

' U& K, w! v& A, X" I/ k3.3、水分傳感器! T+ H, R( r$ ~

! H/ J1 p4 _5 Z% v專(zhuān)業(yè)的農(nóng)用水分傳感器價(jià)格較貴,此處選擇價(jià)格較為低廉的電阻式水分傳感器,如下圖所示:
1 f% }5 i6 Y. S" i) R2 z: R: [
" B: W& Q! U3 x% i4 \
, k) k7 n9 s% u3 g9 G4 h/ Z, m8 m3 P
4' }5 N2 e9 ]4 b4 f& [+ o
硬件環(huán)境. g7 Z* ]4 C  n, X+ W1 ~6 y

4 E  Q1 S+ b7 `6 i$ d, C" G2 B+ C將SHT11溫濕度傳感器的VCC、GND、SCK、DATA分別接至Arduino Uno控制板上的+5V、GND、模擬端口A2和A3。
5 E- \0 E  u; v; n4 J
. a' i& f# |9 I% ]將BH1750FVI光照傳感器的VCC、GND、SCL、SDA和ADD分別接至Arduino Uno控制板上的+5V、GND、SCL、SDA和GND,此處在硬件連接圖上沒(méi)有表示出來(lái)。
% F3 m' M: w0 F5 P! r* ~
' Z2 A: \0 k4 x9 i8 B. ?9 t將水分傳感器的VCC、GND、Vout分別接至Arduino Uno控制板上的+5V、GND和模擬端口A0,此處在硬件連接圖上表示出來(lái)。
7 l- ?5 z& C& }. Y) _( z) s5 d2 N( m! P% i( T
將MAX485模塊的VCC、GND、RO、DI分別接至Arduino Uno控制板上的+5V、GND、RX和TX,將RE和DE端接至數(shù)字端口D2,用于控制收發(fā)信號(hào)。- z4 @7 ]$ R: O2 Q2 Q
% i: r" D+ p3 Q/ ]4 b3 ^7 i
Arduino Uno與MAX485和SHT11的硬件連接,如下圖所示:) p8 i8 k1 n; o* o! v0 [+ {6 h
+ y& s7 V$ b& S( E) s# v- ?
& M/ l& v( m4 a; q+ f6 n7 {
5
# U7 W; i- ^; u+ VArduino功能設(shè)計(jì)8 \3 z5 V% R) n7 U  w2 R7 Z& Z

, R0 J9 |- i; `在基于RS-485總線的智能農(nóng)業(yè)監(jiān)測(cè)系統(tǒng)中,每個(gè)節(jié)點(diǎn)配置一個(gè)Arduino Uno控制器通過(guò)MAX485模塊掛在RS-485總線上。Arduino Uno控制器需要完成以下功能:接收和判斷命令、采集和傳輸溫濕度、光照和水分?jǐn)?shù)據(jù)。Arduino Uno控制器利用MAX485模塊通過(guò)串口從RS-485總線上接收上位機(jī)發(fā)來(lái)的命令,分析得到有效命令,再根據(jù)命令碼實(shí)現(xiàn)溫濕度、光照和水分?jǐn)?shù)據(jù)的采集,并上傳給LabVIEW軟件。8 A. W4 F8 e1 m' i7 z: \

6 D1 @$ D; w+ E& h智能農(nóng)業(yè)監(jiān)測(cè)系統(tǒng)Arduino控制器程序代碼如下所示:- J5 I6 e! o% K: G

6 _3 @3 v. ~2 i" T% ^7 N' s
  • #include #include  #define temp_Command          0x10   //采集命令字#define humidity_Command      0x20   //A1采集命令字#define water_Command         0x30   //D1采集命令字#define illumination_Command  0x40   //D0采集命令字// GY-30// BH1750FVI// in ADDR 'L' mode 7bit addr#define ADDR 0b0100011// addr 'H' mode// #define ADDR 0b1011100 // Specify data and clock connections and instantiate SHT1x object#define dataPin  A3#define clockPin A2SHT1x sht1x(dataPin, clockPin); byte comdata[3]={0};      //定義數(shù)組數(shù)據(jù),存放串口接收數(shù)據(jù)float temp_c;float humidity;int dustPin=0;int dustVal=0;int Water_Val=0; int Illumination_Val = 0; void receive_data(void);      //接受串口數(shù)據(jù)void test_do_data(void);      //測(cè)試串口數(shù)據(jù)是否正確,并更新數(shù)據(jù) void setup(){  Serial.begin(9600);        Wire.begin();   Wire.beginTransmission(ADDR);  Wire.write(0b00000001);  Wire.endTransmission();}void loop(){  while (Serial.available() > 0)   //不斷檢測(cè)串口是否有數(shù)據(jù)   {        receive_data();            //接受串口數(shù)據(jù)        test_do_data();            //測(cè)試數(shù)據(jù)是否正確并更新標(biāo)志位   }}void receive_data(void)       {   int i ;   for(i=0;i3;i++)   {      comdata =Serial.read();      //延時(shí)一會(huì),讓串口緩存準(zhǔn)備好下一個(gè)字節(jié),不延時(shí)可能會(huì)導(dǎo)致數(shù)據(jù)丟失,       delay(2);   }} void test_do_data(void){  if(comdata[0] == 0x55)            //0x55和0xAA均為判斷是否為有效命令   {     if(comdata[1] == 0xFF)     {        switch(comdata[2])          {               case temp_Command:                   temp_c = sht1x.readTemperatureC();                Serial.print(temp_c, 2);                   break;            case humidity_Command:                    humidity = sht1x.readHumidity();                 Serial.print(humidity,2);                 break;            case water_Command:                    Water_Val=analogRead(A0);                 Serial.print(Water_Val);                                     break;            case illumination_Command:                                     // reset                  Wire.beginTransmission(ADDR);                  Wire.write(0b00000111);                  Wire.endTransmission();                   delay(100);                   Wire.beginTransmission(ADDR);                  Wire.write(0b00100000);                  Wire.endTransmission();               // typical read delay 120ms                  delay(120);                   Wire.requestFrom(ADDR, 2); // 2byte every time                   for (Illumination_Val=0; Wire.available()>=1; ) {                  char c = Wire.read();                  //Serial.println(c, HEX);                  Illumination_Val = (Illumination_Val 8) + (c & 0xFF);                  }                   Illumination_Val = Illumination_Val / 1.2;                  Serial.println(Illumination_Val);                                           break;                         }       }   }}: u& s3 b1 [, L0 b3 s
    60 W& D6 o1 a% u+ ^4 A) g9 Q' l
    LabVIEW功能設(shè)計(jì)3 V# n; |) H: a9 g; d  G- u5 _
    6 |3 M& k0 F2 h1 {/ d
    LabVIEW上位機(jī)部分需要完成如下功能:根據(jù)所選擇的節(jié)點(diǎn)向RS-485總線上發(fā)送不同節(jié)點(diǎn)號(hào)的溫度、濕度、光照、水分的數(shù)據(jù)采集命令,Arduino控制器通過(guò)串口和MAX485模塊從RS-485總線上接收上位機(jī)命令,然后判斷接收的命令中的節(jié)點(diǎn)號(hào)是否與自己的節(jié)點(diǎn)號(hào)匹配,如果匹配則實(shí)現(xiàn)相應(yīng)的數(shù)據(jù)采集之后并將采集的數(shù)據(jù)回傳,LabVIEW軟件將回傳的數(shù)據(jù)顯示在前面板上;如果不匹配則舍棄當(dāng)前接收的上位機(jī)命令,重新等待下次命令的到來(lái)。7 F; V' q" h6 q; k4 L* G

      b4 i! F: A8 O5 |9 A% A3 k4 r+ A" Z2 p6.1、前面板設(shè)計(jì)7 V& o" z% O2 s; R* n5 a2 {6 O

      o) M  Z, Y& `& i5 bLabVIEW前面板分為節(jié)點(diǎn)選擇、工作指示燈和數(shù)據(jù)顯示模塊,節(jié)點(diǎn)選擇用于選擇當(dāng)前監(jiān)測(cè)的節(jié)點(diǎn),將其數(shù)據(jù)顯示在顯示模塊上;工作指示燈用于該節(jié)點(diǎn)是否正常工作;顯示模塊主要用于顯示當(dāng)前的數(shù)據(jù),包括溫度、濕度、光照和水分情況。. ?5 Z6 o. x" ~: j0 s( _5 S" R: J
    基于Arduino與LabVIEW的智能農(nóng)業(yè)監(jiān)控系統(tǒng)的LabVIEW上位機(jī)前面板,如下圖所示:
    4 V( r* j. a) _, X: _
    * F% K9 [3 p2 N3 ]4 E$ Z : G5 C9 D3 P/ L( Y
    9 o" K% b0 |. y/ j) R+ v
    6.2、程序框圖設(shè)計(jì)
    / f$ O2 w7 O; t1 I2 ]
    1 h7 v8 @5 x3 C% a2 w. q9 Q采用條件結(jié)構(gòu)+移位寄存器的狀態(tài)機(jī)來(lái)實(shí)現(xiàn)LabVIEW上位機(jī)主程序,將主程序劃分為5個(gè)狀態(tài):0狀態(tài)為串口初始化,1狀態(tài)為溫度測(cè)量,2狀態(tài)為濕度測(cè)量,3狀態(tài)為光照測(cè)量,4狀態(tài)為水分測(cè)量,且初始狀態(tài)為0狀態(tài)(串口初始化)。
    5 ], ?8 m  l& V) o9 L
    . h# W+ n) {3 e  t為了更好地實(shí)現(xiàn)通信,制定如下的通信協(xié)議:幀頭+節(jié)點(diǎn)代號(hào)+操作碼。0x55為幀頭,節(jié)點(diǎn)代號(hào)有0xA1為節(jié)點(diǎn)0的代號(hào),0xA2為節(jié)點(diǎn)1的代號(hào),0xA3為節(jié)點(diǎn)2的代號(hào),0xA4為節(jié)點(diǎn)3的代號(hào),0xA5為節(jié)點(diǎn)4的代號(hào),操作碼有0x10為溫度采集,0x20為濕度采集,0x30為光照采集,0x40為水分采集。, d! F( V, _% ^! A9 W* S: U
    3 [! U, |' }6 k) V3 I; M$ f
    在0狀態(tài)中,通過(guò)設(shè)置的串口號(hào)來(lái)初始化串口通信,如下圖所示:
    2 N) \# k7 }1 \. B% f- h( F4 W8 ]  N/ `7 l7 p7 p
    5 I- N5 a3 d1 h/ P$ @
    9 u! T1 D  x7 |: J0 \. X6 K
    在1狀態(tài)中,讀取溫度數(shù)據(jù)并顯示,如下圖所示:
    ' P" ^, F# ~& d/ B$ H' \
    . Q: Y0 r6 w  E7 T6 d. C7 v $ {' t. {4 k/ v( G% S3 R% B

    ( b5 l3 [6 L# w) `& H( N在2狀態(tài)中,讀取濕度數(shù)據(jù)并顯示,如下圖所示:
    ( r# t6 P& s: N* V8 c( h% d: T/ J- A9 O' T1 h. X! w. v! U8 Y$ T
    ( E; z0 P. N; w$ z5 ^
    , L  {2 x# x) i% ?2 F9 ?" a+ @
    在3狀態(tài)中,讀取光照數(shù)據(jù)并顯示,如下圖所示:1 K$ u9 K4 {$ K+ \

    4 w& h6 \+ G$ A3 f( O; A 4 Q# j& N# p/ K& l8 ?

    0 v* v$ ^$ l, H% }9 z7 U+ v在4狀態(tài)中,讀取水分?jǐn)?shù)據(jù)并顯示,如下圖所示:
    7 K3 }& j! D/ e
    & K! y2 Y0 j) a! {6 Q% C* j 8 i+ h; C) }0 m- y( K  ]2 l6 m
    0 |7 H, B4 y* `: z" G4 v7 A; H
    最后,關(guān)閉串口通信。
    & {# ?) X  m) A0 P  k
    " @, }+ X2 H" U: k5 \由于RS-485總線具有抗干擾能力強(qiáng)的優(yōu)點(diǎn),適合用于可靠性要求高的場(chǎng)合,本節(jié)介紹的智能農(nóng)業(yè)監(jiān)測(cè)系統(tǒng)采用RS-485總線作為每個(gè)子節(jié)點(diǎn)與總站的通信方式,如果需要檢測(cè)的面積較大,監(jiān)測(cè)密度較為稀疏,RS-485總線方式需要很多的線材,則采用ZigBee無(wú)線通信方式更為實(shí)用。由于農(nóng)業(yè)專(zhuān)業(yè)的傳感器價(jià)格較為昂貴,本部分采用較為低廉的傳感器來(lái)實(shí)現(xiàn)了一個(gè)簡(jiǎn)易的監(jiān)測(cè),如果需要專(zhuān)業(yè)應(yīng)用,則需要購(gòu)買(mǎi)農(nóng)業(yè)專(zhuān)用的傳感器。
    ; m7 q) }# Z8 r1 Z* @8 F5 X
    8 a8 |, \* t; i) `; J! E ' X5 K, Y" W7 s* h+ }9 \$ W
    往期推薦LabVIEW Arduino ZigBee無(wú)線氣象站(項(xiàng)目篇—3)
    ) t4 t/ M3 ]0 M7 ^! k! S# N" LLabVIEW Arduino無(wú)線藍(lán)牙遙控智能車(chē)(項(xiàng)目篇—2)
    . W& C& \; R8 I+ x' O% HLabVIEW Arduino電子稱重系統(tǒng)(項(xiàng)目篇—1)# K& s) u. T' h8 S6 Q

    3 d" E( @( l5 j* h  T- k9 R7 g 3 I# @! ~) e* L: Q6 i! Z$ L

    ' q8 B1 U7 G+ L1 i4 z8 @點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表