ELEGOO Arduino用UNO R3スターターキット レベルアップ チュートリアル付
前回の続き
引き続きチュートリアルに沿って電子工作入門していく
NTC Thermometer
使用する機器
- (1) x Elegoo Uno R3
- (1) x LCD1602 Module
- (1) x 10k ohm resistor
- (1) x Thermistor
- (1) x Potentiometer
- (1) x 830 tie-points Breadboard
- (18) x M-M wires (Male to Male jumper wires)
Thermometer
サーミスタはサーマル抵抗で、温度によって抵抗が変化する抵抗。
サーミスタは温度によって抵抗値が大きく変化するように作られており、1 度あたり 100 オーム以上変化させることができる
サーミスタには NTC(負の温度係数)と PTC(正の温度係数)の 2 種類がある
一般に、温度測定には NTC センサーが使用され、PTC はリセッタブルヒューズとしてよく使用される
温度が上昇すると抵抗が増加し、電流が流れると発熱し、電流を「チョークバック」して回路を保護しスマートフォン等の発熱対策にも用いられる
NTCサーミスタとは? - 村田製作所
NTCサーミスタの抵抗値は、以下のような式で表すことができるため、広く温度センサとして使用されています。
RT=R0expB (1/T-1/T0)
ここで、RTは周囲温度T (K) の時の抵抗値、R0は周囲温度T0 (K) の時の抵抗値、BはB定数と言われる定数。
NTCサーミスタとは?ポジティブとネガティブ~サーミスタの用途と使い分け ~ - jp.rs-online.com
NTCサーミスタは広い温度範囲で抵抗値が一様かつ滑らかに変化する、したがって、温度を値として検出して、制御する用途に適している
PTCサーミスタは、特定の温度を超えると、急激に抵抗値が大きくなるデジタル的な変化をします。この性質を利用して、過熱時に回路を遮断したり、機器を過電流から保護したりするのに用いる
実際のB定数は温度で若干変わるので、カタログには25℃と85℃(50℃/100℃等もあり)で実測した値が記載され
選定の際は、RoとB定数が基本になります。それぞれに許容誤差が規定されており、±1%クラスの精度を持つものもあります。メーカーでは、製品毎の温度と抵抗値を表にしたものをホームページ等で公表しています。
今回セットに入っているのは MF52D-103f-3950 NTC Thermistor というもの
MF52 Series Temperarure Sensor - http://www.focusens.com/
B値 3950 ±1% で値は 25℃と50℃で計測されたものらしい
103 は 25℃のときの抵抗値とのこと
各温度時の抵抗値については計算サイトがあるので参考までに
NTCサーミスタの温度特性(B定数による計算) - keisan.casio.jp
逆に抵抗から温度を求める場合は逆算すればいいわけですね
1/T = 1/B × ln(Rth/R0) + 1/T0
構成
前回の構成ほぼそのままに
サーミスタと 10kΩ の抵抗器を追加する
あとはいつもどおりサンプルプログラムをデプロイすると
‘Temp XX.XX C’というメッセージが表示され、温度が表示されている
#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);
}
コードを見てみるとLCDのの部分については前回と同じくでint tempReading = analogRead(tempPin)
で analog 入力値を取得していて
それを double tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
で温度に変換している
※その下にある replace
内にある式のほうが理解はしやすい
変換した温度はケルビン(K)なので、摂氏(c)に変換している 同様に摂氏(c)を華氏(f)も計算しているが、その後の表示コードの部分でコメントアウトしている
各温度単位の変換については下記参照
温度の単位の換算 - Wikipedia
loop内にコードを記載しているのは前回同様動的に変動する表示だからだが、
面白いのはlcd.print("Temp C ")
で 数値の部分と文字の部分をこういう風に表現できるんだという点
かなり奇妙なコメントは、ディスプレイの 16 の列を思い出させるのに役立ちます。
その長さの文字列を実際の読み取りが行われるスペースで印刷することができます。
ブランクを記入するには、読み取り位置のカーソル位置を設定し、それを印刷します。
どういうこと!?空白文字は文字じゃなくそのまま セル?的に未入力扱いってことなのかな!?
またサーミスタからどのようなアナログ入力があるのか気になったので
コードに書きを追記して見てみる
void loop()
{
~省略~
lcd.setCursor(0, 1);
lcd.print(tempReading);
delay(500);
}
すると 21℃ のときに 474 という値が出力されつづけていて 温度が上がると値も大きくなる
これはサーミスタがなにか数値を発しているのではなく、アナログピンに指すことで Arduino がで電圧を読み取っている
読み取った値は 0 から 1024 の整数値に変換されているため
実際の電圧は
474 / 1024 x 5[V] = 2.32[V]
今回の構成で表すと
V = R1[抵抗]/(Rth[サーミスタの抵抗]+R1[抵抗])×5[V]
知りたいのはサーミスタの抵抗なので
Rth[サーミスタの抵抗]=(V/5[V]-1)×R1[抵抗]
となり コードの最初の tempK
の式の一部がサーミスタの電圧を求めてんのかなーって見えてくる
(あれ?温度が上がると電圧も上がると抵抗も上がりそうだけど、NCT なら下がるはずだよな・・・?)
このコードを自分で書ける、書き換えられる自信がないが
サーミスタを触ればあっという間に体温近くまで温度上昇を確認できるし
冬なのでストーブとかの近くに持っていけば同様に温度の上昇を確認できる
しかし環境温度を図るのにはあんまり向いてないのかな?感知距離はわりとサーミスタに触れている空気や部分のみのよう
ただ前に登場した温湿度センサーよりは小型だし、機器の発熱制御や感知に使われるってのはわかりやすい
一人暮らしくらいの狭い空間なら室内温度計としても問題はなさそう
触り始めると、何かの値を取得するといっても色々選択肢がある事が分かってきて
何に何が最適か、やっぱり使ってみないとわかんないよなと実感
あと急に数学の世界が出てきてもうわかんない
とりあえず今回はここまで
多分次回に続く