熱敏電阻是一種根據(jù)您的溫度改變電阻的電阻。一般由聚合物或陶瓷組成,它們的操作范圍相對(duì)較短(-90℃?130℃),但也具有良好的精度和價(jià)格。
通過(guò)一階近似,我們可以得出熱阻和電阻變化之間的線性關(guān)系:
ΔR=kΔT
解釋:
ΔR=電阻變化;
ΔT=熱變化;
k =一階近似系數(shù)(T或R)。
實(shí)際上,上述的近似只能在一個(gè)小的操作范圍內(nèi)工作。因此,我們使用一個(gè)更精確的近似,稱為“Steinhart-Hart方程”。這個(gè)三階近似描述如下:
1 / T = a + b ln(R)+ c(ln(R))3
解釋:
R =電阻(歐姆)
ΔT=以開(kāi)爾文為單位的溫度;
a,b和c = Steinhart-Hart參數(shù)(通常在NTC數(shù)據(jù)表中找到)。
對(duì)于下面的經(jīng)驗(yàn),我們將使用這個(gè)方程的簡(jiǎn)化版本,僅使用一個(gè)參數(shù)(B)將伽利略ADC接收到的mV信號(hào)轉(zhuǎn)換為攝氏度(°C)。
所需組件:
→NTC熱敏電阻(10K);
→5V迷你冷卻器
→TIP120 NPN晶體管(或等效);
→一個(gè)1N4007二極管;
→一個(gè)10k歐姆電阻;
→一個(gè)3.3k歐姆電阻;
→Protoboard;
→跳線。
第一步:
在Protoboard上,組裝下面的電路:
哪里:
→紅線和黑線分別針對(duì)VCC 5V和GND;
→橙色導(dǎo)線通過(guò)熱敏電阻的內(nèi)部電阻將電壓連接到ADC(A0)。
→綠線連接將打開(kāi)伽利略電機(jī)的信號(hào)(PWM或不)。
概要
第二步:
將以下代碼上傳到Galileo,使用Arduino IDE或從Linux終端直接編譯:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26. |
const int pinTemp = A0; // Temperature sensor pin
float temperatura;
int B=3975; // A common B Value between NTC thermistors.
float resistencia;
void setup() {
Serial.begin(9600);
}
void loop () {
int val = analogRead(pinTemp); // Acquiring the received values on A0
resistencia=(float)(1023-val)*10000/val; // Acquiring resistance value
temperatura=1/(log(resistencia/10000)/B+1/298.15)-273.15; /* Calculating the Celsius temperature through a simplified version of Steinhart-Hart equation */
Serial.println(temperatura);
delay(1000); //Delay 1s between readings
}
|
第三步:
現(xiàn)在,隨著朝向熱敏電阻冷卻器,我們將一個(gè)溫度控制的切換冷卻器開(kāi)/關(guān)時(shí)通過(guò)傳感器讀出的溫度比預(yù)先設(shè)定的值(在為例,30℃)高。為了便于理解這種體驗(yàn),您可以將NTC傳感器接近熱源(如白熾燈,或者用手指觸摸傳感器)以獲得更快的結(jié)果。使這個(gè)“開(kāi)/關(guān)”控制的代碼如下:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31. |
const int pinTemp = A0; // Temperature sensor pin
const int pinCooler = 3; //Cooler Pin
float temperatura;
int B=3975; // A common B Value between NTC thermistors.
float resistencia;
void setup() {
Serial.begin(9600);
pinMode(pinCooler,OUTPUT);
}
void loop () {
int val = analogRead(pinTemp); // Acquiring the received values on A0
resistencia=(float)(1023-val)*10000/val; // Acquiring resistance value
temperatura=1/(log(resistencia/10000)/B+1/298.15)-273.15; /* Calculating the Celsius temperature through a simplified version of Steinhart-Hart equation */
if (temperatura > 30.00) //This if describes the On/Off control (or Switched)
{
digitalWrite(pinCooler,HIGH);
}else
{
digitalWrite(pinCooler,LOW);
}
Serial.println(temperatura);
delay(1000); //Delay 1s between readings
}
|
注意:這種類型的控制在工業(yè)制度中效率不高。在這些情況下,控制通常具有比例,積分和微分參數(shù)。雖然,為了教學(xué)的目的,這個(gè)簡(jiǎn)單的控制為我們提供了很好的服務(wù)。