2021年11月18日星期四

[Arduino] analogRead應用-使用熱敏電阻量測溫度 -斯坦哈特-哈特公式

前提概要

前次使用 使用熱敏電阻量測溫度 - 查表法... 測量熱敏電阻溫度,這次使用同樣的熱敏電阻及電路,使用 Steinhart–Hart equation (斯坦哈特-哈特公式) 計算熱敏電阻所得到的溫度。
Steinhart–Hart 是兩個人 ,John S. Steinhart 及 Stanley R. Hart。他們利用 NTC 測量海洋溫度時所提出的公式。等式為

1/T = A+Bln R+ C(ln R)^3

T 是溫度 ,單位是 kelvin
R 是電阻值
A,B,C 常數

要利用這個推導公式最少需要 3 組已知的電阻值,這在後面會提到。
詳細內容可參考 wiki (https://en.wikipedia.org/wiki/Steinhart-Hart_equation)

另位,會使用一個溫度單位 kelvin 。它是一種溫度的國際單位,表示符號為 K 。有些量測溫度功能的晶片也會使用這個國際單位。
詳細內容可參考 wiki (https://en.wikipedia.org/wiki/Kelvin)

同樣我們要拿出廠家提供的表格,找3個電阻值

RT0 : 常溫 25 度時的電阻值。
RT1 : 0 度時的電阻值。
RT2 : 105度時的電阻值。

所以,這次量測範圍是 0 ~ 105 度間。

Arduino NTC
Arduino NTC

同樣我們需要相對應的 K 值

T0 = 298.15 : 常溫 25度時的 Kelvin 值
T1 = 273.15 : 0度時的 Kelvin 值
T2 = 378.15 : 105度時的 Kelvin 值

這個可以利用 線上計算器 (https://www.rapidtables.com/convert/temperature/celsius-to-kelvin.html)


電路圖

一樣和使用查表法的電路相同

Arduino NTC

程式碼


#define THSourceVoltage 5.0
#define THRES       7500
#define RT0         10000  // 常溫 25度時的 NTC 電阻值
#define RT1         35563  // 0度時的 NTC 電阻值
#define RT2         596    // 105度時的 NTC 電阻值
#define T0          298.15 // 常溫 25度時的 Kelvin 值
#define T1          273.15 // 0度時的 Kelvin 值
#define T2          378.15 // 105度時的 Kelvin 值


const int analogPin = A0;
int value;
float VoltageOut;
float ROut;
float beta;
float Rx;
float KelvinValue;
                                   
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);


  beta = (log(RT1/RT2))/((1/T1)-(1/T2));
  Rx = RT0 * exp(-beta/T0);
}


void loop() {
  // put your main code here, to run repeatedly:
  value = analogRead(analogPin);


  Serial.print("NTC Temp: ");
  
  VoltageOut = (THSourceVoltage * value)/1023;
  ROut = THRES * VoltageOut/ (THSourceVoltage - VoltageOut); //目前 NTC 電阻值
  KelvinValue=(beta/log(ROut/Rx));
  
  Serial.println(KelvinValue - 273.15); //Kelvin 轉 溫度C
  Serial.println("");  
  delay(1000);
}

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

Arduino NTC

結果和查表法一樣是 35 度,這個方式更接近物理特性。後面再用軟體過濾器,數值就會更穩定及精確。

原始碼連結

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

相關參考

使用熱敏電阻量測溫度-查表法
https://www.makdev.net/2021/11/arduino-analogread-lookup-table.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:

發佈留言