【Arduino】サーミスタで温度測定

Arduinoでやりたかった事の1つ、温度センサーを使った温度測定。

 

更に詳しくツッコむと、

ファンコンに付いている温度センサー(サーミスタ)で測定した温度をLCDに表示することで、

下に置いてあるPCを覗き込むことなく温度を知ることができるようになる

という装置を作ってみたい。

 

 

バリバリ使いこなしている人からすると、全然難しいことじゃないんだけどw

 

 

まず手始めに、手元にある(ファンコンに付いてきた)温度センサーを使って

温度をPCの画面に表示しよう。

 

回路的には簡単で

5V out —- サーミスタ(R) –★– 分圧のための抵抗(R1) —- GND

★の部分をArduinoの input へ。

 

分圧に使う抵抗はサーミスタの抵抗値に合わせるのが良さそうだ。

 

 

・・・・・・・・・・・?( ゚д゚ )

 

 

サーミスタの仕様がわからない。

 

 

ファンコンのサーミスタは極薄のフィルムに包まれているヤツで

NTCサーミスタだろうと思うんだけど、それ以上のことがわからない。

型番っぽいものが印字されているけど、ググっても出てこない。

 

サーミスタ(104***)

調べ方が悪かったようで「104」がポイントだった。

 

どうやら最初の「S」がシンボルマークのSEMITEC社の製品のようだ。

データシートを見ると「104」は100kΩの製品であることがわかった。

 

で、NTCサーミスタは

式

という式から計算できる。

R0はサーミスタの25度(=T0 =273.15+25)での抵抗値

BはB定数といってサーミスタのデータシートにR0と共に書かれている値

 

・・・・・eとか出てきたぞ。

指数関数やら自然対数やら懐かしい・・・。

高校の時にやったような気がするが、当然完璧に忘れている。

目的を達成するだけなら 同じことをやっている人のスケッチをコピーすれば1発なんだけど

 

なんかそれは負けを認めるような気がする

 

 

解く。紙にガリガリ書いて必死に解くw

 

 

で、こうなる。

式

抵抗値Rはサーミスタの後(★印の所)に掛かっている電圧から計算する。

 

Vall(回路全体の電圧):Vt(サーミスタに掛かっている電圧)=R+R1:R1

なので

式

  • R1:分圧のための抵抗(100kΩ)
  • V:5V
  • Vt:ArduinoのInputから読み取り

でRが求まり、

termo = (1 / ((log(R / R1)) / B + 1 / T0)) - 273.15;

コイツにぶち込めば値が出る。

※温度はK(ケルビン)で求まるので273.15を引いている。

 

あとは1秒ごとにコンソールに出力するようにすればOK。

Serial.println( termo );
delay( 1000 );

 

 

こいつ動くぞ!!(何

 

 

 

だいたい合ってるっぽい

どれぐらい正確かは微妙なところだけど、だいたい合ってるっぽい。

 

計算するのに凄ぇ時間かかったけど、ひとまず目的の第一歩は達成(・∀・)

久しぶりに高校レベルの数学&物理の勉強したわ。

こんな形で役立つとは思わなかったw

 

 


 

この記事を読んだ方はこちらも読まれています



カテゴリー: Arduino タグ: , , , , ,  [パーマリンク]

【Arduino】サーミスタで温度測定 への2件のフィードバック

  1. コムラユウキ のコメント:

    このセンサーを使用したときのスケッチを教えていただけないでしょうか?至急お願いしたいです.よろしくおねがいします.
    また104ではなく103を使用した場合でもつかえますか?

    • YO$HI のコメント:

      初めまして。YO$HIです。
       
      酷いスケッチ(笑)なので公表するのは微妙ですが、こんな感じです。
       
      #include

      const int PIN_ANALOG_INPUT = 0;
      const float FAHRENHEIT = 273.15;
      float B = 4390;
      float T0 = FAHRENHEIT + 25.0; // 25度
      float Rt = 0.0;
      float R1 = 100.0;
      float Vall = 5.0;
      float Vt = 0;
      float Termo = 0;
      int analog_in = 0;

      int LED_13 = 13;

      void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);

      pinMode(LED_13, OUTPUT);

      }

      void loop() {
      analog_in = analogRead(PIN_ANALOG_INPUT);
      Vt = analog_in * 5.0 / 1024.0;
      Rt = R1 * Vall/Vt – R1; //プルアップ
      Termo = (1 / ((log(Rt / R1)) / B + 1 / T0)) – 273.15;
      Serial.println( Termo );

      // 30度を超えたらLEDを光らせてみる
      if (Termo > 32.0) {
      digitalWrite(LED_13, HIGH);
      } else {
      digitalWrite(LED_13, LOW);
      }

      delay( 1000 );
      }
       
      103は確か抵抗値10kΩだったと思いますので、分圧のための抵抗も変えてやれば使えると思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です