Arduino サーミスタを使った温度測定で 【ゼロ除算問題】
2023年3月21日:A/Dコンバータでサーミスタの抵抗値を読む サーミスタをつなぐ場所は?
この続き。 ゼロ除算問題が見えてきました。
あれこれ検索。
★電源側にサーミスタ
・VasteeLab:Arduinoで火災報知機をつくってみた
int val = analogRead(PinTemp); // get analog value
resistance=(float)(1023-val)*10000/val; // get resistance
val値が0ならゼロ除算。
★サーミスタをGND側に持ってきた例
・今日から始める電子工作 【初めてのArduino】6.サーミスタ|ハンズオンで学ぶ初心者向け入門コース
サーミスタはGND側。
しかし、Vref値を1023としているため、抵抗値算出の時、
A/D値がフルスケールの1023ならゼロ除算エラー発生。
正しくは「/ (1024 - readValue)」。
//アナログ値を読む
float readValue = analogRead(analogPin);
//Rtを計算する
float Rt = Rd * readValue / (1023 - readValue);
※1023が出るのはサーミスタが外れた時。
0が短絡なんで、回路の異常報知案件。
・みのや電子工作所:なんちゃって自作体温計の製作
電圧計算に1023を使っているので、A/Dの
フルスケール値を読み出したときはV0が5.0Vと
なり、抵抗値算出の/(5.0-V0)でゼロ除算エラー。
val*5.0/1024.0にしておくのが正しい計算で、
これで、ゼロ除算エラーを回避できる。
val = analogRead(AN0); //アナログ値読込み
V0 = val*5.0/1023.0; //アナログ値から電圧換算
THR = 10000.0*V0/(5.0-V0); //電圧値からサーミスタ抵抗値換算
・adafruit.com:Using a Thermistor
な、なんなんだ、この式は!
A/D値が0でも1023でもアウト。
float reading;
reading = analogRead(THERMISTORPIN);
reading = (1023 / reading) - 1; // (1023/ADC - 1)
reading = SERIESRESISTOR / reading; // 10K / (1023/ADC - 1)
◆正しく計算 (コメントしたところも)
・アイデアノート:Arduinoとサーミスタで温度測定
・jh4vaj:Arduinoでサーミスタを使って温度計を作るのに、電圧を求める必要はない
・プチモンテ:サーミスタ(NTC)の使い方 [Arduino]
・arduino.stackexchange.com:How to include Vref in thermistor temperature calculation?
あれこれ議論。
◆基準電圧で誤差が出るかも
・ラジオペンチ:Arduiono を使ってサーミスタで温度を測る
(電圧算出に1/1023を使っているのも気になる)
◆イイこと書いてある
・Qiita @c_in_g:analogReadの値の変換を誤解していた話(1023、1024問題)
引用させて頂きます。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
長々と書いたが、ぶっちゃけ、255/1023と256/1024の
違いなんて微々たる差(1%にも満たない)で考慮する必要ない
だろと思う。 こういうことは言ってはいけない
:
初心者はこんなクソ細かいことを気にするより色々作ってみた
ほうがいい。 こういうことも言ってはいけない
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
★エラいことかも
『1023 vs 1024 問題』が【ゼロ除算問題】にまで膨らんじゃ
いました。
1023 vs 1024は「ちょっとした誤差やん」で見逃せた
んですが、ゼロ除算は笑って済ませられないかもしれ
ません。
『ミサイル巡洋艦・ヨークタウン ゼロ除算』を検索すると、
「ゼロ除算エラーでシステムがダウン。航行不能に」なんて
記事が見つかります。
最近のコメント