Arduino感應器連載之溫度測量篇

來源:互聯網
上載者:User

標籤:

Arduino感應器連載之溫度測量篇來源:http://www.hzhike.com/School/2016/201607/20160711100131.html 

溫度是我們經常接觸到的物理量,能夠被我們所直觀的感受得到,例如天氣涼了需要增添衣物,吃的食物太燙需要吹一吹,同時也需要對溫度精確的測量,例如人類的正常體溫是37.5℃,一個大氣壓下純水沸騰時的溫度是100℃,都需要我們去做實驗來找出其中的科學。下面我們將詳細講解幾種常用的溫度感應器,並利用Arduino來實現溫度的測量,包括熱敏電阻、LM35、DS18B20、DHT11和熱電偶。

1.熱敏電阻1.1 熱敏電阻簡介

熱敏電阻是電阻值隨溫度變化的半導體感應器,其典型特點是阻值對溫度非常敏感,在不同的溫度下會表現出不同的電阻值,從而根據表現的電阻值可逆推導得到其所處的環境溫度值。具有靈敏度高、體積小、熱容量小、響應速度快、價格低廉等優點。按照溫度係數不同,可分為正溫度係數熱敏電阻(PTC)、負溫度係數熱敏電阻(NTC)和臨界負溫度係數熱敏電阻(CTR)。PTC隨著溫度升高,表現出的電阻值越大; NTC隨著溫度升高,表現出的電阻值越低;CTR具有負電阻突變特性,在某一溫度下,電阻值隨溫度的增加急劇減小,具有很大的負溫度係數。由於具有不同的特性,熱敏電阻的用途也是不同的。PTC一般用作加熱元件和過熱保護;NTC一般用於溫度測量和溫度補償;CTR一般用於溫控警示等應用。NTC的測溫範圍為-60~+300℃,標稱阻值一般在1Ω至100MΩ之間,採用精密電阻和熱敏電阻組合可擴大測量溫度線性範圍。圖1為NTC實物圖,圖中所示的為NTC 10D-9和NTC 5D-7。NTC表示為負溫度係數的熱敏電阻,10D-9和5D-7代表其型號,10D-9代表了常溫(25攝氏度)阻值10歐姆,直徑9毫米,5D-7代表了常溫(25攝氏度)阻值5歐姆,直徑7毫米。除了圖1所示的形狀之外,熱敏電阻製成的探頭有珠狀、棒杆狀、片狀和薄膜等,封裝外殼有玻璃、鎳和不鏽鋼管等套管結構,2所示。

圖1 NTC實物圖

圖2 NTC的各種形式

1.2 NTC的使用方法

NTC的測量溫度和其表現出的電阻值存在一個非線性已知的關係,那麼測量出NTC的電阻值也可以計算得到其測量的溫度值。NTC的電阻值與溫度值的關係如下所示:

Rt = R x e^[B x (1/T1-1/T2)]

式中, Rt 是熱敏電阻在T1溫度下的阻值;R是熱敏電阻在T2常溫下的標稱阻值;B值是熱敏電阻的重要參數;T1和T2指的是K度即開爾文溫度,K度=273.15(絕對溫度) 攝氏度。

逆向計算得到熱敏電阻的溫度值與電阻值的關係如下所示:

T1=1/(ln(Rt/R) /B 1/T2 )

電阻值的測量一般都是利用串聯已知阻值的電阻並施加已知大小的電壓,通過測量已知阻值的電阻上的分壓值,來計算出得到被測電阻的阻值,3所示。設施加的激勵電壓為Eb,熱敏電阻的阻值為Rt,串聯電阻阻值為Rs,則串聯電阻上的分壓值為:

Eout = Eb x Rs/(Rt Rs)

除了串聯測量法之外,還有惠斯登電橋測量法,4所示。設電橋的激勵電壓為Eb,熱敏電阻的阻值為Rt,電橋電阻阻值為R1、R2和R3,則電橋輸出電壓為:

out = Eb x R3/(Rt R3) – Eb x R2/(R1 R2) = Eb x [R3/(Rt R3) – R2/(R1 R2)]

圖3 串聯測量法

圖4 電橋測量法

1.3 使用執行個體

(1)硬體串連

此處使用串聯測量法來測量來實現熱敏電阻測量實驗,其硬體串連圖5所示,熱敏電阻為NTC 10D-9,串聯電阻的阻值為100Ω。

圖5 NTC測溫硬體串連圖

(2)程式設計

程式設計的主要思路:Arduino Uno控制器通過類比輸入連接埠測量串聯電阻上的電壓值,然後通過電流相等的原理計算出熱敏電阻的阻值,最後利用公式計算出溫度值。

#include //包含數學庫void setup(){ Serial.begin(9600); //傳輸速率設定為9600}void loop(){ double Digital_Value=analogRead(0); //讀取串聯電阻上的電壓值(數字量) double Voltage_Value=(Digital_Value/1023)*5.00;//換算成類比量的電壓值 double Rt_Value=(3.3-Voltage_Value)/Voltage_Value*100; //計算出熱敏電阻的阻值 //計算所感知的溫度並發送Serial.println( 1/(log(Rt_Value/10)/3000 1/( 25 273.15)) - 273.15,2); delay(1000); //一秒重新整理一次}
2 LM35

LM35 是美國NS(國家半導體)所生產的的類比溫度感應器,其輸出的電壓與攝氏溫度成線性比例關係,在0℃時輸出0V,溫度每升高1℃,輸出電壓增加10mV。測溫範圍l ?55 ~ 150?C,精度為0.75℃,室溫的精度可達0.25℃。常用的TO-92封裝的引腳排列6所示,在2℃~150℃的測溫範圍內的典型應用電路7所示。

圖6 TO-92封裝的引腳排列

圖7 2℃~150℃的典型電路圖

2.3 使用執行個體

(1)硬體串連

將LM35類比式溫度感應器的 Vs和GND分別串連至Arduino Uno控制器的 5V和GND,以給LM35提供工作電源,LM35的Vout引腳接至ArduinoUno控制器類比輸入連接埠A0,8所示。

圖8 LM35測溫硬體串連圖

2)程式設計

程式設計的主要思路:Arduino Uno控制器通過類比輸入連接埠測量LM35輸出的電壓值,然後通過10mV/℃的比例係數計算出溫度數值。同時,在100℃的時候,LM35輸出電壓值為1000mV,在Arduino Uno控制器的內部參考電壓範圍內,所以採用1.1V內部參考電壓。

int Digital_Value=0;float temp_Value=0;void setup(){ Serial.begin(9600); //傳輸速率設定為9600 //由於測溫範圍為0~100℃,輸出電壓為0~1V,採用內部1.1V參考電壓analogReference(INTERNAL);}void loop(){ Digital_Value=analogRead(A0); //讀取電壓值(數字量) temp_Value=(float)Digital_Value/1023*110.00;//換算成攝氏溫度 Serial.print(‘Temperature for LM35 is: ‘); Serial.println(temp_Value,2); //發送溫度資料 delay(1000) //一秒重新整理一次}

(3)實驗示範

實際的實驗硬體串連圖9所示,串口接收到的溫度資料10所示。

圖9 實驗硬體串連圖

圖10 串口接收的溫度資料

3 DS18B203.1 DS18B20簡介

DS18B20是美國DALLAS半導體公司的數字化單匯流排智能溫度感應器,與傳統的熱敏電阻相比,它能夠直接讀出被測溫度,並且可根據實際要求通過簡單的編程實現9~12位的數字值讀數方式。從DS18B20讀出資訊或寫入資訊僅需要一根線(單匯流排)讀寫,匯流排本身也可以向所掛接的裝置供電,而無需額外電源。

DS18B20的效能特點如下:

(1) 單線介面方式實現雙向通訊;

(2) 供電電壓範圍: 3.0V~ 5.5V,可用資料線供電;

(3) 測溫範圍:-55~ 125℃,固有測溫解析度為0.5℃;

(4) 通過編程可實現9~12位的數字讀數方式;

(5) 支援多點的組網功能,多個DS18B20可以並聯在唯一的單匯流排上,實現多點測溫。

DS18B20的外形及管腳排列11所示,DS18B20引腳定義:(1)DQ為數字訊號輸入/輸出端;(2)GND為電源地;(3)VDD為外接供電電源輸入端(在寄生電源接線方式時接地)。

圖11 DS18B20封裝圖

3.2 DS18B20編程與庫的使用

Arduino要實現對DS18B20的操作,需要OneWire和Dallas Temperature Control兩個庫檔案,分別為:http://playground.arduino.cc/Learning/OneWire和https://github.com/milesburton/Arduino-Temperature-Control-Library。Dallas Temperature Control函數庫是基於OneWire函數庫進行開發的,更便於使用,下面講解一下主要函數的功能和用法。

(1) void begin(void):初始化,無輸入參數,無返回參數。

(2) getDeviceCount(void):擷取單匯流排上所連接器件的總數,無輸入參數,返回參數為器件數目。

(3) validAddress(uint8_t*):驗證指定地址的器件是否存在,輸入參數為器件地址,返回參數為布爾型。

(4) getAddress(uint8_t*, const uint8_t):驗證的器件的地址與索引值是否匹配,輸入參數為器件地址和索引值,返回參數為布爾型。

(5) getResolution(uint8_t*):擷取指定器件的精度,輸入參數為器件地址,返回參數為精度位元。

(6) setResolution(uint8_t*,uint8_t):設定器件的精度,輸入參數為器件地址和精度位元,無返回參數。精度位元有9,10,11和12可供選擇。

(7) requestTemperatures(void):向單匯流排上所有器件發送溫度轉換的請求,無輸入參數,無返回參數。

(8) requestTemperaturesByAddress(uint8_t*):向單匯流排上指定地址的器件發送溫度轉換的請求,輸入參數為器件地址,無返回參數。

(9) requestTemperaturesByIndex(uint8_t) :向單匯流排上指定索引值的器件發送溫度轉換的請求,輸入參數為器件索引值,無返回參數。

(10) getTempC(uint8_t*):通過器件地址擷取攝氏溫度,輸入參數為器件地址,返回參數為攝氏溫度。

(11) getTempF(uint8_t*):通過器件地址擷取華氏溫度,輸入參數為器件地址,返回參數為華氏溫度。

(12) getTempCByIndex(uint8_t):通過索引值來擷取攝氏溫度,輸入參數為器件索引值,返回參數為攝氏溫度。

(13) getTempFByIndex(uint8_t):通過器件索引值來擷取華氏溫度,輸入參數為器件索引值,返回參數為華氏溫度。

3.3 使用執行個體

由於單匯流排上可以串連多個DS18B20,而不多佔用Arduino控制器的IO口,從而很容易地就可以實現多點測溫,下面分別兩個使用執行個體來說明DS18B20與Arduino的用法。

3.3.1 一路溫度測量

(1)硬體串連

將DS18B20溫度感應器的VCC和GND分別串連至Arduino Uno控制器的 5V和GND,以給DS18B20提供電源,DS18B20的DQ引腳接至ArduinoUno控制器數字引腳D2,且並聯4.7kΩ的上拉電阻,12所示。

圖12 一路溫度測量硬體串連圖

(2)程式設計程式設計的主要思路:Arduino Uno控制器通過DallasTemperature函數庫實現單匯流排的啟動、發送測量溫度的請求、讀取0號感應器溫度,最後通過串口發送出去。

#include #include #define ONE_WIRE_BUS 2 //定義單匯流排串連的連接埠OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);void setup(void){ Serial.begin(9600); Serial.println(‘Dallas Temperature IC Control Library Demo‘); sensors.begin(); //啟動單匯流排}void loop(void){ Serial.print(‘Requesting temperatures...‘); sensors.requestTemperatures(); //發送溫度測量請求命令 Serial.println(‘DONE‘); Serial.print(‘Temperature for the device 1 (index 0) is: ‘); Serial.print(sensors.getTempCByIndex(0)); //擷取0號感應器溫度資料並發送 Serial.println(‘℃‘); delay(1000); //一秒重新整理一次}
3.3.2 多路溫度測量

(1)硬體串連

將兩個DS18B20溫度感應器的VCC和GND分別串連至Arduino Uno控制器的 5V和GND,以給兩個DS18B20提供電源,兩個DS18B20的DQ引腳接至ArduinoUno控制器數字引腳D2,且並聯4.7kΩ的上拉電阻,13所示。

圖13 多路溫度測量硬體串連圖

(2)程式設計

程式設計的主要思路:Arduino Uno控制器通過DallasTemperature函數庫實現單匯流排的啟動、發送測量溫度的請求、讀取0號感應器溫度並串口發送出去,讀取1號感應器溫度並串口發送出去。

#include #include #define ONE_WIRE_BUS 2 //定義單匯流排串連連接埠OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);void setup(void){ Serial.begin(9600) Serial.println(‘Dallas Temperature IC Control Library Demo‘); sensors.begin(); //啟動單匯流排}void loop(void){ Serial.print(‘Requesting temperatures...‘); sensors.requestTemperatures(); //發送溫度測量請求命令 Serial.println(‘DONE‘); Serial.print(‘Temperature for the device 1 (index 0) is: ‘); Serial.println(sensors.getTempCByIndex(0)); //擷取0號感應器溫度資料並發送Serial.print(‘Temperature for the device 2 (index 0) is: ‘); Serial.println(sensors.getTempCByIndex(1)); //擷取1號感應器溫度資料並發送}
3.3.2 實驗示範

實際的單路實驗硬體串連圖14所示,單路和兩路實驗中串口接收到的溫度資料分別15和16所示。

圖14 單路實驗硬體串連圖

圖15 單路串口接收的溫度資料

圖16 兩路串口接收的溫度資料

4 DHT114.1 DHT11簡介

DHT11是一款含有已校準係數的數字訊號輸出的溫濕度複合感應器,採用專用的數字模組採集技術和溫濕度感測技術,具有極高的可靠性與卓越的長期穩定性,內部包含一個電阻式感濕元件和一個NTC測溫元件。DHT11感應器都經過實驗室校準,校準係數以程式的形式儲存在OTP記憶體中,感應器內部在活動訊號的處理過程中要調用這些校準係數,採用單線制串列介面,使系統整合變得簡易快捷。超小的體積、極低的功耗,訊號傳輸距離可達20米以上。DHT11數字溫濕度感應器實物圖如17所示。

圖17 DHT11溫濕度感應器

DHT11的引腳說明如表1所示,供電電壓為3.3~5V,測量範圍為濕度20~90%RH, 溫度0~50℃,測量精度為濕度±5%RH,溫度±2℃,測量解析度為濕度1%RH,溫度1℃。

4.2 DH11編程與庫的使用

DHT11的Arduino庫檔案:https://github.com/markruys/arduino-DHT。DHT11庫檔案有如下幾個函數:dht.setup(int Pin)、dht.getHumidity()、dht.getTemperature()。

dht.setup(int Pin):設定DHT11匯流排的串連管腳號,輸入參數為所串連的管腳號,無返回參數。

dht.getHumidity():擷取DHT11的濕度值,無輸入參數,傳回值為濕度值,double類型。

dht.getTemperature():擷取DHT11的溫度值,無輸入參數,傳回值為溫度值,double類型。

4.3 使用執行個體

下面以DHT11模組實現溫濕度的測量,並且通過串口輸出。(1)硬體串連將DHT11溫濕度感應器的VCC、GND分別串連至Arduino Uno控制器的 5V、GND,以給DHT11提供電源,DHT11模組的DOUT引腳接至ArduinoUno控制器數字引腳D2,且並聯5kΩ的上拉電阻,DHT11模組的NC引腳也串連至GND,18所示。

圖18 DHT11溫濕度測量硬體串連圖

(2)程式設計程式設計的主要思路:Arduino Uno控制器通過DHT11函數庫擷取濕度和溫度資料,並通過串口發送出去。

#include ‘DHT.h‘DHT dht;void setup(){ Serial.begin(9600); dht.setup(2); // data pin 2 delay(1000);}void loop(){ float temperature = dht.getTemperature(); float humidity = dht.getHumidity(); Serial.print(‘temperature is ‘); Serial.print(temperature, 1); Serial.println(‘ C‘); Serial.print(‘humidity is ‘); Serial.print(humidity, 1); Serial.println(‘%‘); delay(3000);}

(3)實驗示範實際的實驗硬體串連圖19所示,實驗中串口接收到的溫濕度資料20所示。

圖19 實驗硬體串連圖

圖20 串口接收的溫濕度資料

5 熱電偶5.1 熱電偶和MAX6675簡介

將兩種不同材料的導體或半導體A和B焊接起來,構成一個閉合迴路,當導體A和B的兩個連接點1和2之間存在溫差時,兩者之間便產生電動勢,因而在迴路中形成一個迴路電流。這種現象稱為熱電效應,而這種電動勢稱為熱電勢。熱電效應原理圖21所示。

圖21 熱電效應原理圖

熱電偶就是利用熱電原理進行溫度測量的,其中,直接用作測量介質溫度的一端叫做工作端(也稱為測量端),另一端叫做冷端(也稱為補償端)。實際上是一種能量轉換器,它將熱能轉換為電能,用所產生的熱電勢測量溫度。常用的K型熱電偶實物22所示,可以直接測量各種生產中從0℃到1300℃範圍的液體蒸汽和氣體介質以及固體的表面溫度。具有線性度好,熱電動勢較大,靈敏度高,穩定性和均勻性較好,抗氧化效能強,價格便宜等優點。

圖22 K型熱電偶實物圖

根據熱電偶測溫原理,K型熱電偶的輸出熱電勢不僅與測量端的溫度有關,而且與冷端的溫度有關,需要溫度補償電路(23為補償),同時熱電偶的電壓與溫度之間具有非線性,MAX6675模組可以對K型熱電偶進行訊號放大、冷端補償和非線性校正。MAX6675帶有簡單的3位串列SPI介面;可將溫度訊號轉換成12位元字量,溫度解析度達0.25℃;內含熱電偶斷線檢測電路。冷端補償的溫度範圍-20℃~80℃,可以測量0℃~1023.75℃的溫度,基本符合工業上溫度測量的需要。

5.2 MAX6675編程與庫的使用

MAX6675的Arduino庫檔案:https://github.com/aguegu/ardulibs/tree/master/max6675。MAX6675庫檔案有如下幾個函數:getCelsius()、getFahrenheit()、getKelvin()和setOffset(int offset)。?

getCelsius():擷取攝氏溫度,無輸入參數,傳回值為攝氏溫度,float類型。 ? getFahrenheit():擷取華氏溫度,無輸入參數,傳回值為華氏溫度,float類型。 ? getKelvin():擷取開爾文溫度,無輸入參數,傳回值為開爾文溫度,float類型。 setOffset(int offset):設定溫度位移,輸入參數為位移值,int類型,最小單位為0.25℃,無傳回值。

5.3 使用執行個體

下面以K型熱電偶與MAX6675模組實現高溫的測量,並且通過串口輸出。

(1)硬體串連

將MAX6675模組的VCC和GND分別串連至Arduino Uno控制器的 5V和GND,以給MAX6675提供電源,MAX6675模組的訊號引腳SO、CS和CSK串連至數字引腳5、6、7,K型熱電偶的正負極分別串連至MAX6675模組的T 和T-,24所示。

圖24 熱電偶測溫硬體串連圖

(2)程式設計

程式設計的主要思路:Arduino Uno控制器通過MAX6675函數庫擷取熱電偶所測量的溫度值,完成了熱電偶輸出電壓的訊號放大、冷端補償和非線性化處理,最終通過串口輸出。

#include ‘Max6675.h‘Max6675 ts(5, 6, 7); //依次定義SO、CS、CSK所串連的引腳號void setup(){ts.setOffset(0); //設定溫度位移量Serial.begin(9600);}void loop(){ Serial.print(‘temperature is ‘); Serial.println(ts.getCelsius(), 2); //擷取攝氏溫度,並通過串口發送 delay(1000); //一秒重新整理一次}

(3)實驗示範

實際的實驗硬體串連圖25所示,實驗中串口接收到的溫度資料26所示。

圖25 實驗硬體串連圖

圖26 串口接收的溫度資料

6.總結

本文介紹了溫度測量的幾種常用感應器,從測溫原理、器件特性、在Arduino中的編程與使用等方面做了詳細的介紹。總結本文,有以下幾點:

1、NTC熱敏電阻價格低廉,但是想要得到很高的測量精度,需要做很多最佳化工作,難度較大。

2、LM35直接輸出類比電壓,使用較為方便,精度較高,適合用於熱電偶冷端補償中的環境溫度測量。

3、DS18B20是單匯流排數字溫度感應器,性價比較高,測量精度較高,同時可以單個匯流排掛多個感應器。

4、DHT11是溫濕度感應器,單匯流排,不佔用過多的I/O口,而且可以同時輸出濕度資料,適合約時需要溫濕度資料的場合應用。

5、熱電偶和MAX6675配合使用,適合高溫測量,省去了熱電偶的冷端補償、線性化和模數轉換等工作,使用較方面,精度較高,對其資料進行二次擬合標定,可以得到更高的測量精度。

最後對比一下熱電偶 MAX6675模組和DS18B20的響應速度,27所示是基於Arduino與LabVIEW的實驗平台採集到熱電偶在放進熱水中的資料變化情況,可以看出,最高溫度約為60℃,熱電偶的響應曲線較為平直,上升速度較快。28所示為基於Arduino與LabVIEW的實驗平台採集到DS18B20對於冷熱變化的響應曲線圖,可以看出最高溫度超過80℃,DS18B20響應曲線較為平緩,隨著溫差的縮小,溫度響應速度越發放緩。

圖27 熱電偶溫度變化響應曲線圖

圖28 DS18B20溫度變化響應曲線圖

Arduino感應器連載之溫度測量篇

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.