2021年11月18日星期四

[Arduino] analogRead應用-使用熱敏電阻量測溫度-查表法

Arduino NTC

什麼是熱敏電阻?

熱敏電阻是個傳感器,特性是電阻值會隨著溫度變化而改變。這個元件其實很古老了,早期在電源類的產品中常用的元件之一,最主要的運用是用來偵測元件運作溫度。現在大部分設計為了要求精密度更高,新設計通常會使用晶片的形式來偵測溫度。

熱敏電阻大致分為兩種,

電阻值隨溫度上升而增加,為正溫度係數 (Positive Temperature Coefficient,簡稱 PTC)
電阻值隨溫度上升而減少,為負溫度係數 (Negative Temperature Coefficient,簡稱 NTC)

PTC 型的熱敏電阻,通常應用在電路保護的 可復式保險絲。例如:PolySwitch,如果發生電路過流現象會依據設計範圍內,使得溫度上升而阻抗變高,最後形成斷路現象。

這次應用的是 NTC的熱敏電阻用來檢測溫度。使用時必須固定在要檢測的會發熱的元件目標物上。

實體元件

Arduino NTC

規格 : 25度常溫 10KOhm ,誤差:正負 1% ,通常需要廠家提供參數值。

紅色框是溫度,藍色框是該溫度時的電阻值。左右兩邊是誤差範圍,我取的是中間值

電路設計

電路由電阻分壓方式組成,產生分壓電壓後再利用公式推算目前溫度所在。

Arduino NTC


程式碼


#define THSourceVoltage 5.0
#define THRES       7500


const int analogPin = A0;
int value;


unsigned int temptable[] = {8019,7679,7356,7048,6754,6475,6209,5956,5714,5484,
                                    5264,5055,4855,4664,4482,4308,4143,3984,3833,3688,
                                    3549,3417,3291,3170,3054,2943,2837,2735,2637,2544,
                                    2455,2369,2286,2207,2132,2059,1989,1922,1858,1796,
                                    1736,1679,1624,1571,1521,1472,1425,1379,1336,1294,
                                    1253,1214,1176,1140,1105,1072,1039,1008,977,948,
                                    920,893,867,841,817,793,770,748,727,706,
                                    686,667,649,631,613,596};


unsigned char temp;
                                    
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}


void loop() {
  // put your main code here, to run repeatedly:
  value = analogRead(analogPin);
  temp = calTemp((THSourceVoltage * value)/1023);
  Serial.print("NTC temp: ");
  Serial.println(temp);
  Serial.println("");  
  delay(1000);
}




float calVoltage(unsigned int value)
{
  return THSourceVoltage * value/(value + THRES);
}


unsigned char calTemp(float value)
{
  unsigned char x,res;
  float xc;
  for(x = 0; x < sizeof(temptable)/sizeof(unsigned int); x++)
  {
    xc = calVoltage(temptable[x]);
    if(xc <= value)
    {
      res = 1;
      break;
    }
  }


  if(res)
    return (30 + x);


  return 0;  
}

temptable 陣列的範圍是 30度 到最高溫度 105 度。透過 calVoltage function 及 for 迴圈比對,就可以順利得知溫度了

我用手指緊捏 NTC 的 顯示結果

Arduino NTC

目前手指溫度 35 度哦。用分壓電路組成的電路大概會有約 2%~3%的誤差範圍 ,這個結果其實也不差。 用在允許有誤差溫度範圍及低成本下,也是可以使用選擇的方式之一。

原始碼連結

https://github.com/cold63/Arduino_Code/tree/main/NTCTemp

相關參考

使用熱敏電阻量測溫度 -斯坦哈特-哈特公式
https://www.makdev.net/2021/11/arduino-analogread-model-func.html

analogRead 基礎
https://www.makdev.net/2020/12/arduino-analogread.html

Voltage Divider Calculator 電阻分壓計算
https://www.makdev.net/p/voltage-divider-calculator.html

0 comments:

發佈留言