Arduino Uno R3 で温度を測ってみる

完全に子どもの自由研究の先行実験。
Arduinoで音が流せたついでに、センサー類を使ってみようという話。

センサーも色々あるけれど。ひとまず材料箱に転がっていた これ からスタート。

LM35DZ

秋月電子通商とかで格安で売られている温度センサー LM35DZ を使用してみます。
2019年8月現在で、1個当たり110円(税込)とスナック感覚で使える便利デバイスです。

詳細なデータシートは TI社のサイトに LM35 Precision Centigrade Temperature Sensors という形でPDFで転がっています。

デカップリングやら、いろいろと書いてありますので、それに従って…

と言いたいところですが、遊びですから、難しいことは考えずに「直結」でことを進めます。動くなら別にそれで構わないし。

Amazonとかでも買えますが、このセンサー。正直言って200円出したらぼったくりレベルのデバイスです。また、偽物も横行しているらしいので…ほかのものを買う際についでにまともなところから買う事をお勧めします。

まず、秋月電子通商に行ったときについでに買ってきた、コレ。

これを使って作業します。本来なら、基板にはんだ付けしてとか色々考えるところなんでしょうけど、面倒なので、

材料箱からこんなのを探し出します。Arduino関連をいじっている人なら手元に多分ストックがあるモノ。これを用意して

安直に適当にその辺に転がっていた耐熱ケーブルをはんだ付け。その上で余っている熱収縮チューブをかぶせて…

コネクタにLM35DZをこんな感じで差し込んで完了。ちなみにピンアサインはデータシートによると…

こんな感じです。見た目は TO-92 なので、ほぼトランジスタですね。

“+Vs” を Arduino UNO の “5V” に。”GND” を Arduino UNO の “GND” に。そして、”Vout” を “A0” に接続します。

3ピン繋ぐだけでイケルなんて便利な世の中ですね。

スケッチしてみる

とりあえず、繋いだので、今度はスケッチの方法を考えます。

LM35DZ の仕様

このセンサー。温度によってセンサーが出力する電圧が変わる仕様です。 LM35DZは、0℃ ~ 100℃ の範囲で0.5℃の制度で直読可能。 直読の方法は電圧で、1℃ あたり 10mV 増える仕様。 となれば、単純にアナログ入力端子から電圧を読めばいい感じという事か。

Arduino UNO R3 のアナログ入力端子の分解能

Arduiono UNO R3 のアナログ入力端子は 10ビットのADコンバータ経由で読み取ります。 となると、基準となる電圧 5V を 10ビットで割ってあげる。

210 = 1,024

ということで、

5.0 / 1,024 = 4.88 mV

LM35DZ は 10mV で 1℃ の計算、だとすると、Arduino UNO を活用する以上は0.5℃単位でしか読めないという事ですね。

実際にスケッチしてみる

単純に、繋いだアナログ入力端子を読み込んで、シリアルコンソールに垂れ流すだけの簡単なものを書いてみましょう。

float SensorIn = 0;
float Temperature = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  SensorIn = analogRead(0);
  Temperature = ((SensorIn * 5) / 1024) * 100;
  Serial.println( Temperature );
  delay(1000);
}

おぉ、本当に簡単に温度が取れますね。

これだけ簡単に温度が取れるのは、本当に便利な世の中になりましたね。

3.3Vの環境で計測してみる

今までは電圧供給を5Vで構成してみました。

+Vsを3.3Vにしてみたらどうでしょうか。

EPS-WROOM-01とかの石を使おうと思うと、どうしても電源供給として3.3Vを使いたくなってくるわけなので、そのあたりもついでに実験。

float SensorIn = 0;
float Temperature = 0;

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

void loop() {
  // put your main code here, to run repeatedly:
  Serial.print( "Measuring... " );
  digitalWrite(LED_BUILTIN, LOW);
  SensorIn = analogRead(0);
  delay(1000);
  digitalWrite(LED_BUILTIN, HIGH);
  Temperature = ((SensorIn * 3.3) / 1024) * 100;
  Serial.print( Temperature );
  Serial.println( " degrees Celsius." );
  delay(1000);
}

5Vだろうが、3.3Vだろうが、やっていることはほとんど一緒。違うのは温度を計算している部分。SensorIN に 5.0Vをかけていた部分、ここを3.3Vにすれば完了。

※ スケッチでは、なんとなくで計測中LEDをチカチカさせて、測っている感出してみました。無線LAN等を使用してデータを垂れ流すつくりにした場合、実際に動いているかどうかを確認するのに、このLチカは結構便利。

ついでにいろいろな温度の基準で計測してみる

日本人なんで、”℃”で十分ですけれど。アメリカ人が見ても(ってあり得ないが)困らんように変換の手順も確認しておきましょう。ついでに絶対温度も計算しておくか。

変換式としては

degrees[Fahrenheit] = degrees[Celsius] * (9/5) + 32

degrees[Kelvin] = degrees[Celsius] + 273.15

となります。単純にこの変換式を入れれば出力できます。

float SensorIn = 0;
float TempDeg = 0;
float TempFah = 0;
float TempKel = 0;

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

void loop() {
  // put your main code here, to run repeatedly:
  Serial.print( "Measuring... " );
  digitalWrite(LED_BUILTIN, LOW);
  SensorIn = analogRead(0);
  delay(1000);
  digitalWrite(LED_BUILTIN, HIGH);
  TempDeg = ((SensorIn * 3.3) / 1024) * 100;
  TempFah = TempDeg * (9/5) + 32;
  TempKel = TempDeg +273.15;
  Serial.print( TempDeg );
  Serial.print( " degrees[Celsius], " );
  Serial.print( TempFah );
  Serial.print( " degrees[Fahrenheit], " );
  Serial.print( TempKel );
  Serial.println( " degrees[Kelvin]." );
  delay(1000);
}

これで3種類の温度が出力されました。

にしても、絶対温度はわかるんだけど、いまだに華氏を使い続けるアメリカ人。絶対的に世界の中心を自負している人たちってすごいよね。日本人なんてあっさりと独自尺度を捨てて世界標準なるものに乗り換えて何とも思っていないのに対して、この独立な感じ。

コメント