Arduinoとスロークッカーで低温調理器を作る話:サーミスタと戯れる
急遽プロジェクト化決定。
このプロジェクトの記事はこちら。
masaru.hateblo.jp
何はともあれ温度を測れないと
というわけで、サーミスタを買ってきました。
akizukidenshi.com
データシートの通り、
温度が高くなると抵抗値が下がっていって、
抵抗値から温度が求まるという代物。
動作確認しますかね
テキトーな抵抗と
サーミスタを直列で繋いで、
Arduinoから5Vを流して、
analogRead()で分圧を測って
抵抗値を求めます。
今回は余ってた
Arduino nano互換の怪しい大陸産を使います。
DCCDUINOって書いてあるけど、
どう読むかわかりません。
コード書くよー
この辺りは定数。
B、T0、R0はデータシートより。
R1は1kΩの抵抗なんだが、
実際、0.98kΩしかなかったので補正。
MAXについては後述。
float MAX = 1005; float B = 3435; float T0 = 298.15; float R0 = 10.0; float R1 = 0.98;
A0をanalogRead()します。
float temperature = getTemperature(analogRead(0));
以下は、温度を測るメソッド。
まずはサーミスタの抵抗を求めて、
その抵抗値から温度を求めています。
float getTemperature(int analogInput) { float r = calcResistance(analogInput); float t = calcTemperature(r); return t; } float calcResistance(int input) { return R1 * (MAX - input) / input; } float calcTemperature(float resistance) { float k = 1 / (log(resistance / R0) / B + (1 / T0)); return k - 273.15; }
温度を求めるメソッドの詳細は、
ほかのサイトを見て下さい(笑)
calcResistance()のMAXですが、
本来であればanalogRead()は
0以上1024未満のintで返されて、
0は0V、1023が5Vを表すものの、
実際のR0、R1の抵抗値から計算すると
どうやら1005くらいが最大値っぽく、
4.9VくらいしかD2から出力されていないっぽい。
なので、それを補正するためにMAXを
別途設定してサーミスタの抵抗値を求めています。
いざ、動確
娘のベビーバスで使っていた
温度計とぬるま湯で、
実際の温度と計算値を比較します。
「その温度計の精度って」
みたいな事言わないで下さい。
Serial.println()で出力したけど、
なんとなく温度計の値と合ってたので、
良しとします。