LabVIEW控制Arduino采集多路DS18B20溫度數(shù)值(進(jìn)階篇—3)
1
項(xiàng)目概述
DS18B20是美國(guó)DALLAS半導(dǎo)體公司的數(shù)字化單總線智能溫度傳感器,與傳統(tǒng)的熱敏電阻相比,它能夠直接讀出被測(cè)溫度,并且可根據(jù)實(shí)際要求通過簡(jiǎn)單的編程實(shí)現(xiàn)9~12位的數(shù)字值讀數(shù)方式。從DS18B20讀出信息或?qū)懭胄畔H需要一根線(單總線)讀寫,總線本身也可以向所掛接的設(shè)備供電,而無需額外電源。
本篇博文將實(shí)現(xiàn)LabVIEW控制Arduino采集多路DS18B20溫度數(shù)值,關(guān)于LabVIEW控制Arduino在基礎(chǔ)篇已經(jīng)講解過很多種類溫度傳感器的采集方法。具體可參見以下鏈接:
LabVIEW控制Arduino采集LM35溫度傳感器數(shù)值(基礎(chǔ)篇—12)
LabVIEW控制Arduino采集熱敏電阻溫度數(shù)值(基礎(chǔ)篇—13)
2
項(xiàng)目架構(gòu)
本項(xiàng)目將介紹使用2個(gè)DS18B20傳感器、Arduino Uno和LabVIEW組成多路溫度數(shù)字測(cè)量系統(tǒng),多路溫度數(shù)字測(cè)量系統(tǒng)框圖如下圖所示:
其中,2個(gè)DS18B20溫度傳感器并聯(lián)接至單總線,Arduino Uno作為下位機(jī),負(fù)責(zé)DS18B20的讀寫以及數(shù)據(jù)傳輸;LabVIEW編寫的顯示軟件作為上位機(jī),上下位機(jī)利用USB-TTL接口實(shí)現(xiàn)通信。
3
硬件環(huán)境
將DS18B20溫度傳感器的Vcc和GND分別連接至Arduino Uno控制器的+5V和GND,以給DS18B20提供電源,DS18B20的DQ引腳接至Arduino Uno控制器數(shù)字引腳D2,且連接4.7KΩ的上拉電阻,因?yàn)镈S18B20的DQ引腳正常工作需要添加上拉電阻。多路溫度數(shù)字測(cè)量系統(tǒng)硬件連接圖如下圖所示:
4
Arduino功能設(shè)計(jì)
在基于Arduino與LabVIEW的上下位機(jī)溫度監(jiān)測(cè)系統(tǒng)中,Arduino Uno控制板需要完成以下功能:接收和判斷命令與采集和傳輸溫度數(shù)據(jù),Arduino Uno控制板通過串口接收上位機(jī)發(fā)來的命令,分析得到有效命令,讀寫DS18B20傳感器以獲取溫度,并將溫度數(shù)據(jù)上傳至LabVIEW軟件。
Arduino Uno控制器負(fù)責(zé)讀取LabVIEW上位機(jī)發(fā)來的溫度采集命令,并讀取對(duì)應(yīng)的DS18B20傳感器從而獲取溫度數(shù)據(jù),通過串口發(fā)送回上位機(jī)LabVIEW軟件。Arduino Uno控制器的程序代碼如下所示:
#include <OneWire.h>#include <DallasTemperature.h>#define ONE_WIRE_BUS 2 //DS18B20接至Arduino數(shù)字口2 #define T1_COMMAND 0x80 //采集命令字#define T2_COMMAND 0x81 //采集命令字 OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire); byte comdata[3]={0}; //定義數(shù)組數(shù)據(jù),存放串口命令數(shù)據(jù)void receive_data(void); //接收串口數(shù)據(jù)void test_do_data(void); //測(cè)試串口數(shù)據(jù)是否正確并執(zhí)行命令 void setup(){ Serial.begin(9600); // Start up the library sensors.begin();} void loop(){ while (Serial.available() > 0) //不斷檢測(cè)串口是否有數(shù)據(jù) { receive_data(); //接受串口數(shù)據(jù) test_do_data(); //測(cè)試數(shù)據(jù)是否正確并執(zhí)行命令 }} void receive_data(void) { int i ; for(i=0;i<3;i++) { comdata[i] =Serial.read(); //延時(shí)一會(huì),讓串口緩存準(zhǔn)備好下一個(gè)字節(jié),不延時(shí)可能會(huì)導(dǎo)致數(shù)據(jù)丟失 delay(2); }} void test_do_data(void) //測(cè)試并執(zhí)行命令{ if(comdata[0] == 0x55) //0x55和0xAA均為判斷是否為有效命令 { if(comdata[1] == 0xAA) { switch (comdata[2]) { case T1_COMMAND: sensors.requestTemperatures(); //ratures Serial.print(sensors.getTempCByIndex(0)); break; case T2_COMMAND: sensors.requestTemperatures(); // Set temperatures Serial.print(sensors.getTempCByIndex(1)); break; } } }}
5
LabVIEW功能設(shè)計(jì)
LabVIEW上位機(jī)部分需要完成以下功能:向下位機(jī)Arduino控制器發(fā)送溫度采集命令,Arduino控制器通過串口接收上位機(jī)命令,完成溫度數(shù)據(jù)的采集之后將數(shù)據(jù)回傳,LabVIEW軟件將回傳的溫度數(shù)據(jù)顯示在前面板上。
5.1、前面板設(shè)計(jì)
LabVIEW前面板分為溫度顯示和傳感器選擇端,傳感器選擇端用于決定當(dāng)前監(jiān)測(cè)的傳感器,波形數(shù)據(jù)用于顯示溫度數(shù)據(jù)的變化趨勢(shì),多路溫度數(shù)字測(cè)量系統(tǒng)的LabVIEW上位機(jī)前面板如下圖所示:
5.2、程序框圖設(shè)計(jì)
LabVIEW上位機(jī)主程序的結(jié)構(gòu)為順序結(jié)構(gòu)+While循環(huán)。首先,在順序結(jié)構(gòu)中的第幀中,通過設(shè)置的串口號(hào)來初始化串口通信,并將波形圖清空。然后,程序進(jìn)入While循環(huán)和平鋪式順序結(jié)構(gòu),向Arduino Uno控制器發(fā)送傳感器1或傳感器2溫度測(cè)量的命令碼,等待100ms,接收到返回的溫度之后,顯示在前面板上并顯示出溫度波形。最后關(guān)閉串口通信。
通過前面板上單選按鈕來選擇所需測(cè)量的傳感器,然后向Arduino Uno控制器發(fā)送對(duì)應(yīng)的溫度采集命令碼,傳感器1命令碼為0x55AA80,傳感器2命令碼為0x55AA81,并通過延時(shí)800毫秒,以達(dá)到每秒采樣1次的功能。傳感器1和傳感器2對(duì)應(yīng)的程序框圖如下圖所示:
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。