ELEGOO UNO キットのLesson15温度センサーで温度センサーの詳細が気になったので計算しました
コードの一部
int tempReading = analogRead(tempPin);
// This is OK
double tempK = log(10000.0 * (1024.0 / tempReading - 1));
tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK ); // Temp Kelvin
float tempC = tempK - 273.15; // Convert Kelvin to Celcius
float tempF = (tempC * 9.0)/ 5.0 + 32.0; // Convert Celcius to Fahrenheit
/* replaced
float tempVolts = tempReading * 5.0 / 1024.0;
float tempC = (tempVolts - 0.5) * 10.0;
float tempF = tempC * 9.0 / 5.0 + 32.0;
*/
/* replaced 以下のコメントアウトされたコードを見ると、tempReading*5/1024をするとアナログ入力に掛かっている電圧がわかるようです。
コードのでは tempReading * 5.0 / 1024.0 となってますが、
arduinoリファレンスのanalogRead()のページを見ると
0-5Vの入力電圧を0-1023の整数値に変換する
とあるのでtempReading*5.0/1023.0ではないかと思います。
アナログ入力(A0)の電圧とA0,GND(0V)間の抵抗値、入力電圧(5V)、A0から温度を計算する数式が分かったので温度センサーの抵抗値と温度の関係がわかるはずです。
いろいろ計算していると
入力電圧/アナログ入力の電圧*抵抗(10kΩ)-抵抗(10kΩ)
で温度センサーの抵抗値がわかりました。
この計算式があっているか確かめました。
電圧=抵抗*電流
電流=電圧/抵抗
入力電圧:v 抵抗1:a 抵抗2(温度センサー):b 抵抗1にかかっている電圧:c
v/(a+b)*a 入力電圧/(抵抗1+抵抗2)で抵抗に流れる電流を計算して抵抗値が分かっている抵抗1を掛けて抵抗1にかかっている電圧を計算する
v/(a+b)*a=c
v*a=c*(a+b)
v*a=c*a+c*b
v*a-c*a=c*b
(v*a-c*a)/c=b
v*a/c-c*a/c=b
v*a/c-a=b
v/c*a-a=b
多分あってるはずです。
わかった温度センサーの温度と抵抗値の関係を表にしてみます。
log関数は表計算ソフトではLN関数になるようです。
コード通りの特性なら、この温度センサーは温度が下がると抵抗値が増えるようです。
コメントアウトされているところに電圧から温度を計算する簡単な式があるのでそちらとも比較してみました。
コメントアウトされている方の計算式はデタラメですね。
そしてこの温度センサーはコードの計算式が正しければ-30℃〜100℃ぐらいの範囲外では誤差がひどくなるようです。(センサーが壊れなければですが)
-20℃〜80℃ぐらいが使用範囲なのかな?という事が分かりました。
引用元
arduinoリファレンス analogRead()のページ
https://www.arduino.cc/reference/jp/language/functions/analog-io/analogread/
Elegooのサイト Elegoo UNO R3 Super Starter Kitのチュートリアル