2014年7月17日木曜日

アクア用コンピュータシステム構想 その2

温度計測機能について


温度計測機能は、アクア用コンピュータシステムの重要な機能の一つとなるでしょう。
理由は、アクア系で気になる計測値の一つだからです。

通常、ヒーターの制御はサーモスタット制御であったり、あるいはオートヒーターを使用しています。
これも内部には温度計測機能が入っています。(「何度」を知っているかどうかは別として)

あと、水槽用クーラーにも当然温度計測機能があります。あるいはFANを用いた気化熱タイプの冷却の場合、逆サーモスタットっていうことで、温度計測機能があります。

さらに、水温を可視化するためにも、温度計測機能があります。
先日レビューしたこの水温計は、水温計測以外に、最低、最高温度も記録します。



温度計センサー

この温度センサーですが、前回の記事で「アナログタイプ」と「デジタルタイプ」という風にお話しました。

試しに、秋月電子通商さんのところで、使いやすそうな温度センサー2つをピックアップしてみました。

  • DSB18B20+
  • LM35DZ

上がデジタルタイプで、下がアナログタイプです。
とりあえず、センサーの絵を表示してみました。




はい、どっちも同じように見えます。見えるから困りますが、実は違います。

で、簡単な使い方です。一番簡単な使い方は、マイコンから操作するのが楽なんですが、この記事を読んだ後に、マイコン触るの大変そーって思うと、アレなので、手っ取り早くできる Arduino を使って、違いを見てみます。

Arduino って何?

まぁ、百聞は一見に如かず、ってことで、こんなのです。


これは、マイコンボードですが、パソコンとUSBケーブル1本があれば、お試しできます。
詳しくは「Arduino 入門」とかで 検索すると沢山出てきます。必要であれば記事書きます。

温度センサーの使い方の例


で、この Arudino ですが、ここにケーブルを指していくだけでいいです。

手っ取り早いのが、アナログタイプです。このアナログタイプは、真ん中の線に、温度に合わせた電圧がでています。




こんな感じでつなげます。手っ取り早くやりたい人は、10KΩの抵抗をとっても大丈夫でしょう。ただ、安定した温度計測をする場合には、必要でしょう。(センサーの出力が低インピーダンスなので)

で、マイコン側にプログラムを書きます。(注意:センサーを使ったテストをしていません。机上の調査だけです)

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

void loop(){
  int a0;
  a0=analogRead(0);  //温度計測

  Serial.print(" analog 0 =");
  Serial.println(a0,DEC);
  delay(500);//500m秒
}

こんな感じです。これで 0.5秒ごとに温度センサーの電圧を計測してパソコン側に表示してくれます。
表示されるのは 0~1023 の値で  1023 で 5V です。
で、25度の時に 3.2~3.4V なので、654~695 くらいの値がでてくれています。これから温度を逆算すればいいのです。

しかし、このタイプだと、色々な外因で温度がずれます。先ほど 25度の時 3.2~3.4V といったのは、その他の条件で流れる電流の量が変わるからです。

自分でこの調整をしたいかっていうと、あまりしたくありません。


次にデジタルタイプを見てみます。



つなぎ方は、こんな感じです。
で、デジタルの場合、色々と面倒です。デジタルってのは、ONかOFF、1か0しか扱えません。
それで温度を表すので、0と1が12こくらい並んでやってきます。例えば「0000 0001 1001 0001」って具合に。この並びで来たら 25.0625度ってことです。

で、しかも、最初に「計測してね」っていうお願いも出さないといけません。例えば「01000100」を送るみたいに。

これを、先ほどのプログラム風に書くと
void loop(){
  //例えば「01000100」を送る場合
  0を送る
  ちょっと待つ
  1を送る
  ちょっと待つ
  0を送る
  ちょっと待つ

  //温度データが来たので
  データを読む
  ちょっと待つ
  データを読む
  ちょっと待つ
 … 12回繰り返す   

}
みたいに書いていかないといけません。先ほどa0=analogRead(0); //温度計測だけで済んだのが、デジタルだと大変なんです。

じゃ、なんで最初からアナログ使わないの?ってなるけど、苦労に見合うメリットがあるからです。

まず、面倒なことをやめちゃいましょう。

まず、先駆者の方が、上記のデータの送受信ライブラリを公開してくれています
http://www.pjrc.com/teensy/td_libs_OneWire.html

で、これを使うと、こんな感じになります。(注意:センサーを使ったテストをしていません。机上の調査だけです)

#include <OneWire.h>
OneWire  ds(4);
void setup(void) {
  Serial.begin(9600);
  ds.reset();
  ds.skip();
  ds.write(0x4E);
  ds.write(0x00);
  ds.write(0x00);
  ds.write(0x7F);
}
void loop(void) {
  byte i;
  byte data[12];
  float ondo;

  ds.reset();
  ds.skip();
  ds.write(0x44,1);  //温度計測のお願い
 

   delay(1000); //センサーが温度計測するまで 0.75秒かかるので 1秒(1000m秒)待つ
 
  ds.reset();
  ds.skip();
  ds.write(0xBE); // 温度データを読む

  for ( i = 0; i < 9; i++) {// 受信して
    data[i] = ds.read();
  }
  if (OneWire::crc8(data,8) != data[8]) {//通信にノイズが乗ってないかチェックして
      Serial.println("CRC is not valid!");
      return;
  }
  // convert the data to actual temperature

  int raw = (data[1]  <<8) | data[0];
  ondo = (float)raw / 16.0 ;
  Serial.print(" ondo = ");
  Serial.println(ondo);
}
なんか、ややこしくなっていますが、これで最後の ondo に 温度が入っています。

デジタルだと何が嬉しいの?

さて、アクア用コンピュータで温度計は何個欲しいですか?
水槽用、気温用、サンプ用、あるいは、メイン水槽用、サブ水槽用……
はい、センサーが沢山欲しくなります。


先ほどの、アナログの場合、a0を使いましたが、これ A0~A5までしかありません。つまり合計6本しか使用できないのです。しかも、これを使いきると他のセンサーが使えなくなります。

デジタルの場合、センサーを増やす場合…こんな感じになります。


センサーを増やして、1つめと同じ場所に接続するだけでいいのです。
しかも、このセンサー、64ビット(実質48ビット)のIDを持って区別できます。48bitってことは、単純に13桁以上の数字になります。日本人全員がこのセンサーを4つ持ったって、識別できるので大丈夫です(^^;

つまり、何個もの温度データを同時に管理できます。


で、ここまで、Arduino を使って、センサーの区別をしてきましたが、今回はArduino は使いません。
センサーは使いますよ。

防水センサー

さて、アマゾンに売っていた防水センサーは、これです。




もう、ほとんどが配線されているので、Arduino を使うだけなら、ほとんど「線を指すだけ」になります。あ、抵抗1本必要ですので、ちょっと姑息なことをしないといけませんが。

ちなみに、Amazonには、以下のようなセットもあります。

 
ブレッドボードっていう、配線用のボードとその簡易配線ができるので、何も気にせず
ハンダごても持たず、挑戦できます。

便利なのよなかになったもんだ(笑)


余談


そういえば、昔、イベントでスピーカーしました。
その資料があったので、適当にボカシを入れてスクリーンショットとってみました。



50ページくらいありました。Arduino の入門イベントでした。
見たい方おられましたら、コメントください。



0 件のコメント:

コメントを投稿