Arduino Mega 2560 LESSON:23 LCD1602 LCDモジュールとThermometer
概要
ThermometerとLCD1602 LCDモジュールを接続するレッスンです。
完成図は以下のとおりです。
PCB図は以下のようなものです。
3Dプレビュー図は以下のようなものです。
コードは以下のようなものです。
//www.elegoo.com
//2016.12.9
#include <LiquidCrystal.h>
int tempPin = 0;
// BS E D4 D5 D6 D7
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
void setup()
{
lcd.begin(16, 2);
}
void loop()
{
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;
*/
// Display Temperature in C
lcd.setCursor(0, 0);
lcd.print("Temp C ");
// Display Temperature in F
//lcd.print("Temp F ");
lcd.setCursor(6, 0);
// Display Temperature in C
lcd.print(tempC);
// Display Temperature in F
//lcd.print(tempF);
delay(500);
}
NTCサーミスタの抵抗値は近似的に次の式で表せます。
\[ R=R_0 e^{B\left(\frac1T-\frac1{T_0}\right)} \]
記号 意味 R 現在の抵抗値 R_0 基準温度での抵抗値 T 現在の絶対温度(K) T_0 基準絶対温度(K) B サーミスタ固有のB定数 e 自然対数の底(約2.71828)
まず、両辺を \(R_0\) で割ります。
\[ \frac{R}{R_0}=e^{B\left(\frac1T-\frac1{T_0}\right)} \]
両辺の自然対数を取ると、
\[ \ln\left(\frac{R}{R_0}\right)=B\left(\frac1T-\frac1{T_0}\right) \]
指数関数が消えました。
さらに温度 \(T\) について整理すると、
\[\boxed{ T=\frac{1}{\frac1{T_0}+\frac1B\ln\left(\frac{R}{R_0}\right) }} \]
これで、抵抗値から温度を計算できるようになりました。
より柔軟に温度特性を近似できるSteinhart–Hart式です。
\[ \frac1T=A+B\ln(R)+C[\ln(R)]^3 \]
この式でも、抵抗値の自然対数が重要な役割を果たします。
サーミスタのB定数式をもう一度見てみましょう。
\[ R=R_0 e^{B\left(\frac1T-\frac1{T_0}\right)} \]
ここで両辺の自然対数を取ります。
\[ \ln R=\ln\left(R_0 e^{B\left(\frac1T-\frac1{T_0}\right)}\right) \]
ここで、対数の重要な性質、
\[ \boxed{\ln(ab)=\ln a+\ln b} \]
を使うと、
\[ \ln R=\ln R_0+\ln\left(e^{B\left(\frac1T-\frac1{T_0}\right)}\right) \]
となります。さらに、
\[ \ln(e^x)=x \]
という性質を使うことで、
\[ \boxed{\ln R=\ln R_0+B\left(\frac1T-\frac1{T_0}\right)} \]
となります。
① 抵抗値 \(R\) を求める
\[ R=10000\left(\frac{1024}{\mathrm{tempReading}}-1\right) \]
② 抵抗値の自然対数 \(L\) を求める
\[ L=\ln R \]
③ 絶対温度 \(T\) を求める
\[ T=\frac1{A+BL+CL^3} \]
今回のプログラムにある、
\[
\begin{aligned}
A&=0.001129148\\
B&=0.000234125\\
C&=0.0000000876741
\end{aligned}
\]
という値は、サーミスタの抵抗値と温度の関係を表すための近似係数です。
tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK );
\[ T=\frac1{A+(B+CL^2)\times L} \]
1. 元の式から出発する
\[
R=R_0 e^{B_\beta\left(\frac1T-\frac1{T_0}\right)}
\]
ここで、記号を整理します。
- \(R\):現在の抵抗値
- \(R_0\):基準温度での抵抗値(例えば25℃で10kΩ)
- \(T\):現在の絶対温度(K)
- \(T_0\):基準の絶対温度(25℃なら298.15K)
- \(B_\beta\):サーミスタの温度特性を表すB定数(単位K)
最後の \(B_\beta\) は、Steinhart–Hart式の係数 \(B\) と区別するために、添字を付けました。
2. 両辺の自然対数を取る
\[
\ln R=\ln\left(R_0e^{B_\beta(\frac1T-\frac1{T_0})}\right)
\]
対数の性質、
\[
\ln(ab)=\ln a+\ln b
\]
を使うと、
\[
\ln R=\ln R_0+\ln\left(e^{B_\beta(\frac1T-\frac1{T_0})}\right)
\]
自然対数と指数関数は逆の関係なので、
\[
\boxed{\ln R=\ln R_0+B_\beta\left(\frac1T-\frac1{T_0}\right)}
\]
となります。
ここで、複雑だった指数関数が消えました。
3. 温度の逆数 \(1/T\) を取り出す
括弧を展開します。
\[
\ln R=\ln R_0+\frac{B_\beta}{T}-\frac{B_\beta}{T_0}
\]
両辺を整理すると、
\[
\frac{B_\beta}{T}=\ln R-\ln R_0+\frac{B_\beta}{T_0}
\]
両辺を \(B_\beta\) で割ります。
\[
\boxed{\frac1T=\left(\frac1{T_0}-\frac{\ln R_0}{B_\beta}\right)+\frac1{B_\beta}\ln R}
\]
これで、Steinhart–Hart式によく似た形になりました。
4. A、B、Cと比較してみる
Steinhart–Hart式は、
\[
\frac1T=A+B_{\mathrm{SH}}\ln R+C(\ln R)^3
\]
です。
並べて比較すると、対応関係が見えてきます。
B定数モデルを変形した式
\[
\frac1T=\underbrace{\left(\frac1{T_0}-\frac{\ln R_0}{B_\beta}\right)}_{A}
+\underbrace{\frac1{B_\beta}}_{B_{\mathrm{SH}}}\ln R
\]
Steinhart–Hart式
\[
\frac1T=A+B_{\mathrm{SH}}\ln R+C(\ln R)^3
\]
つまり、単純なB定数モデルなら、
\[
\boxed{A=\frac1{T_0}-\frac{\ln R_0}{B_\beta}}
\]
\[
\boxed{B_{\mathrm{SH}}=\frac1{B_\beta}}
\]
\[
\boxed{C=0}
\]
となります。
ただし、これはB定数モデルをSteinhart–Hart式の形に書き直した場合の対応です。実際のSteinhart–Hart式の係数が、必ずこの関係から求められているという意味ではありません。
5. では、Cはどこから現れたのか?
ここが重要です。
実際のサーミスタは、広い温度範囲で見ると、B定数モデルの予測から少しずつずれることがあります。
そこで、
\[
\frac1T=A+B_{\mathrm{SH}}\ln R
\]
という直線的な関係だけでなく、 \[ C(\ln R)^3 \]
という補正項を加えます。
この \(C\) は、元の指数関数を対数変形した結果として出てきたものではありません。
実測した温度と抵抗値の関係に、より正確に一致させるために追加された項です。
そして、\(C\) を含む3つの係数 \(A,B_{\mathrm{SH}},C\) は、実測データに合わせて一緒に決定します。