メーター製作② 高精度水温・油温計
目的 |
チューニング・カスタム |
作業 |
DIY |
難易度 |
中級 |
作業時間 |
1時間以内 |
1
オートゲージのサーミスタ(水温・油温センサ)を使用して、ある程度の精度を持った水温・油温計を作りました。
対数やちょっとしたプログラムが必要なので、難易度はそれなり。
まず作るにあたって、公表値も出ている訳ではないので実測します。
120℃、150℃は同じような事を考えた人がいたようでネットに落ちていた値をしようしました。
採取した抵抗値もネットとほぼ同様。
測定した水温計の誤差もあるので大体の値となりますが。
0度(氷たっぷり水)と100度(沸騰させながら)はある程度の精度が期待できるので、少し細かい値をとっています。
2
サンプル数は少ないですが、抵抗側の片対数グラフをとるとほぼ直線で近似できたので近似式はグラフから得られる物を使用することとします。
これは同じサーミスタを使用するのであれば使いまわせる値(ただし個体差はあると思いますが)ですので、どうぞご利用ください(笑)
y = -3.66974185203547E+01ln(x) + 2.99178043083927E+02
ただ大抵の場合、C言語上では“ln(自然対数)”はlog、”log(常用対数)"はlog10を使用すると思うので、プログラムに起こす際はご注意を。
3
今回はArduino上で温度計測をするわけですが、回路は単純な分圧抵抗を使用します。
Vccに電源電圧、R1はR2との関係によるVoutのレンジと消費電力で決めるわけですが、とりあえず1.2kΩとしました。
R2にはサーミスタの抵抗値となります。
普段はVout=Vcc*R2/(R1+R2)
として使うわけですが、今回はR2の値を知りたいので、
R2=(R1*(Vout/Vcc))/(1-(Vout/Vcc))
となります。
Arduinoでアナログ電圧を読む場合analogRead()を使用するわけですが、特に特性を指定しない場合は電源電圧Vcc基準電圧とするので1023からの比率でVoutを知ることができます。
つまり電源電圧がきれいな5Vでない4.5Vとかだったとしても補正の必要がないということですな。すばらしい。
なのでanalogRead()をint型のAとして上の式に当てはめると、
R2=(1200*(A/1023))/(1-(A/1023));
という式でサーミスタの現在の抵抗値を読むことができます。
しかしArduinoのコンパイラがアホのようで、計算途中に指定している型から外れる値があると強制的にアウトプットが0となってしまうようなので、
R2=(R1*(A/10.23))/(100-(A/10.23));
としてあげる必要がありました。
4
抵抗の計算とグラフから得られた式で温度を求めると理論上はこのような形となります。
左が元の温度、右がサーミスタから求めた温度。
実測値から作っているのでそんじょそこらの温度計よりは正確なのでないでしょうか(笑)
もちろん、上の2式を合わせたソースコードは1行にまとめることができます。誤差を考えると1行の方がおすすめ。
Temp=299.178043083927-(36.7*log((R1*(A/10.23))/(100-(A/10.23))));
前述の通り、一般的にはln(自然対数)ですが、プログラムではlog()となります。
5
実際につけてみた様子。
表示は以前のタコメータと同様、割ったり引いたりで3桁にしています(タコメータの記事を参照ください)。
誤差なのか実際にそうなのかはわかりませんが、氷水は1度と表示されています。
元のメーター(オートゲージ)が飾りレベルということを考えると格段の進歩か?(笑)
6
お湯は96℃。器が陶器で冷たい上室温が低いので、写真を撮っている間にも下がってしまいました。
注いだ直後は一瞬100℃を示していたので問題ないでしょう。
ただしサーミスタのレスポンスはどうしようもない。
お湯→氷水に突っ込んでも0℃付近になるのに10~20秒くらいかかりました。
改善するには銅製の水温用サーミスタを使え、という話ですが。
Arduino(3500円)と1.2kΩの抵抗、オートゲージのやっすいサーミスタがあれば出来てしまうので、暇な方はお試しあれ。
[PR]Yahoo!ショッピング
入札多数の人気商品!
[PR]Yahoo!オークション
関連コンテンツ
関連整備ピックアップ
関連リンク