読者です 読者をやめる 読者になる 読者になる

マサルの備忘録

ハイオク仕様のトルクフルな備忘録

Arduinoとスロークッカーで低温調理器を作る話:サーミスタと戯れる

スポンサーリンク

急遽プロジェクト化決定。

f:id:domomasarudesu:20160118231426j:plain

このプロジェクトの記事はこちら。
masaru.hateblo.jp

何はともあれ温度を測れないと

というわけで、サーミスタを買ってきました。
f:id:domomasarudesu:20160118231620j:plain
akizukidenshi.com

データシートの通り、
温度が高くなると抵抗値が下がっていって、
抵抗値から温度が求まるという代物。

動作確認しますかね

テキトーな抵抗と
サーミスタを直列で繋いで、
Arduinoから5Vを流して、
analogRead()で分圧を測って
抵抗値を求めます。

f:id:domomasarudesu:20160118232435j:plain

今回は余ってた
Arduino nano互換の怪しい大陸産を使います。
DCCDUINOって書いてあるけど、
どう読むかわかりません。

ブレッドボードに刺すよー

なんとなくこんな感じです。

f:id:domomasarudesu:20160119214152p:plain

GNDから、1kΩ・サーミスタを繋いで、
1kΩの抵抗にかかる分圧を測定します。
必要なときだけD2から5Vを流す
省電力設計(笑)

コード書くよー

この辺りは定数。
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を
別途設定してサーミスタの抵抗値を求めています。

いざ、動確

f:id:domomasarudesu:20160119215931j:plain

娘のベビーバスで使っていた
温度計とぬるま湯で、
実際の温度と計算値を比較します。
「その温度計の精度って」
みたいな事言わないで下さい。

f:id:domomasarudesu:20160119220822p:plain

Serial.println()で出力したけど、
なんとなく温度計の値と合ってたので、
良しとします。