水温計(4系統同時計測)

環境
binary comment

4系統の水の水温を測定する作業があり1台の水温計で順番に測っていましたが、安定した指示値が得られるまで微妙な待ち時間があるので、同時に測定できる温度計を作ってみました。常時センサを水に浸けておくことで、いつでも4系統の水温を測ることができます。

もっと簡単な方法もありましたが、全体構成は以下の様になりました。

表示部

4系統の水温を表示するので、それなりの情報量になります。16文字×2行または、20文字×4行のキャラクタLCDを使えば制御も回路も簡単ですが、見易いかなと思い7セグメントLED(以下、7セグLED)を表示部に使ってみました(ほとんど、個人の趣味かも・・・)。配線の数を減らすため、4桁のものを使っています。配線数は、7セグメント+ドット+4桁で12本になります。4桁7セグは、Amazonで購入しました。

Amazon.co.jp
CL3641BHデータシートより

この7セグLED(CL3641BH)はアノードコモンだったので、7セグLEDドライバにSN74LS47を使いました。これで、3本の制御配線が節約できます。1個のArduinoで温度センサも7セグLEDも制御したかったのですが、I/Fが足りないので表示部はPICに任せることにしました。
PICには手元にあった16F688を使っています。Ardunioからシリアル経由でデータをもらったら、7セグLEDにそのデータを表示する様にしています。小数点は7セグLEDドライバで制御できないので、3桁目のLEDに強制的に表示する様にしています。このため、Ardunioから送られるデータは、10倍した測定値を送っています(25.6℃ → 256)。もっと良い配線方法があると思いますが、部品の配置・配線図をご紹介します。回路図は、面倒なので作っていません。

画像に alt 属性が指定されていません。ファイル名: 表示部品配置図.png画像に alt 属性が指定されていません。ファイル名: 表示部品配置図2.png
緑の配線は基板表面の被覆配線です

試してはいませんが、2本のデータ信号で表示できる4桁7セグLEDもあるようです。これを使えば、断然楽ですが・・・。

Amazon.co.jp
Amazon.co.jp

PICのプログラムは公開していませんが、”お問い合わせ“からご連絡頂ければご返信します。

温度センサ・制御部

温度センサは、1-WireバスのDS18B20を使いました。

Amazon.co.jp

主な仕様は以下のとおりです。

  • 電源電圧:3.0V~5.5V
  • 測定温度範囲:-55℃~+125℃
  • 精度:±0.5℃(-10℃~+85℃)
  • ドリフト:±0.2℃

1-Wire式のインターフェイスなので、データラインとVcc間を4.7kΩで繋ぎプルアップします。

DS18B20は固有のアドレスを持っているので、上記の様に並列に接続することで複数のセンサを扱うことができます。部品の配置、配線は以下のとおりです。

Ardunioには、Pro Mini 328 5V版を採用しています。また、先の表示部とはシリアル接続としていますが、Pro Mini 328にはシリアル用のポートが1つしかないため、ライブラリ”SoftwareSerial”を使います。

またDS18B20との接続のために、ライブラリ”OneWire”と”DallasTemperature”とを使いました。ライブラリマネージャーから、それぞれインストールしてください。Ardunioのプログラムは、こんな感じです。

19行~22行で、センサのアドレスを設定しています。お手持ちのDS18B20のアドレスを指定してください。アドレスを調べるときは18行目、39行~45行目の注釈を外して、調べたいセンサを1つ毎に接続してください。シリアルモニタに、センサアドレスが表示されると思います。

#include <OneWire.h>
#include <DallasTemperature.h>
#include <SoftwareSerial.h>

#define TEMPERATURE_PRECISION 12
#define Sensor1_RX_Pin  13
#define Sensor1_TX_Pin  12
#define Sensor2_RX_Pin  6
#define Sensor2_TX_Pin  7
#define Sensor3_RX_Pin  4
#define Sensor3_TX_Pin  5
#define Sensor4_RX_Pin  2
#define Sensor4_TX_Pin  3
#define DS18B20_Pin 14

OneWire oneWire(DS18B20_Pin);
DallasTemperature sensors(&oneWire);
//DeviceAddress temp; //センサアドレスを調べるときは注釈を外してください
DeviceAddress temp1 = {0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};// お持ちのセンサアドレス
DeviceAddress temp2 = {0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};// お持ちのセンサアドレス
DeviceAddress temp3 = {0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};// お持ちのセンサアドレス
DeviceAddress temp4 = {0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};// お持ちのセンサアドレス

SoftwareSerial Sensor1_Serial(Sensor1_RX_Pin, Sensor1_TX_Pin); // RX, TX
SoftwareSerial Sensor2_Serial(Sensor2_RX_Pin, Sensor2_TX_Pin); // RX, TX
SoftwareSerial Sensor3_Serial(Sensor3_RX_Pin, Sensor3_TX_Pin); // RX, TX
SoftwareSerial Sensor4_Serial(Sensor4_RX_Pin, Sensor4_TX_Pin); // RX, TX

void setup(void)
{
  Serial.begin(9600);
  Sensor1_Serial.begin(9600);
  Sensor2_Serial.begin(9600);
  Sensor3_Serial.begin(9600);
  Sensor4_Serial.begin(9600);
  sensors.begin();
  sensors.setResolution(TEMPERATURE_PRECISION);
  //---センサアドレスを調べるときは、注釈を外してください---
  //sensors.getAddress(temp,0);
  //for(int i=0;i<8;i++){
  //  Serial.print(" 0x");
  //  Serial.print(temp[i],HEX);
  //}
  //Serial.println();
  //delay(1000);
  //---ここまで---
}

void loop(void) {
  char  data1[10];
  char  data2[10];
  char  data3[10];
  char  data4[10];
  int i;
  int Temp_Data1;
  int Temp_Data2;
  int Temp_Data3;
  int Temp_Data4;

  for ( i = 0 ; i < 10 ; i++ ) {
    data1[i] = 0;
    data2[i] = 0;
    data3[i] = 0;
    data4[i] = 0;
  }

  while (1) {
    sensors.requestTemperatures();
    Temp_Data1 = (int)(sensors.getTempC(temp1) * 10);
    Temp_Data2 = (int)(sensors.getTempC(temp2) * 10);
    Temp_Data3 = (int)(sensors.getTempC(temp3) * 10);
    Temp_Data4 = (int)(sensors.getTempC(temp4) * 10);
    sprintf(data1, "%04d", Temp_Data1);
    sprintf(data2, "%04d", Temp_Data2);
    sprintf(data3, "%04d", Temp_Data3);
    sprintf(data4, "%04d", Temp_Data4);

    Serial.println(data1);
    Sensor1_Serial.listen();
    Sensor1_Serial.println(data1);

    Serial.println(data2);
    Sensor2_Serial.listen();
    Sensor2_Serial.println(data2);

    Serial.println(data3);
    Sensor3_Serial.listen();
    Sensor3_Serial.println(data3);

    Serial.println(data4);
    Sensor4_Serial.listen();
    Sensor4_Serial.println(data4);
    delay(1000);
  }
}

出来上がった各部は、タカチのアルミ薄型ケース(YM-150)に収めました。部品点数が多かったため、表示部は2階建て、制御部はコネクタ部を切り離して無理やり収めています。DS18B20との接続は、2.5mmφのステレオジャックをつかいました(右側に並んでるもの)。

binary comment

ダイナミック点灯方式なので一部のLEDが消えているように見えますが、実際にはちゃんと表示されています。

binary comment
binary comment

センサの精度ですが、4本のセンサを比較すると仕様にある±0.5℃以内に収まっていました。

雑駁な説明で申し訳ありません。わからないところがあれば、”お問い合わせ“からご連絡ください。可能な範囲でお答えします。また、本記事を引用して実行した結果について、保証するものではありません。生じた損害、損失などは一切補償できませんので、自己責任でお願い致します。

コメント

PAGE TOP