温度を測って異常を検知 その3 警報

 前回、3か所の温度を測ることができました。最後は目的である、ある温度を超えたら異常だと判断し、警報を鳴らすという出力部分です。目立ったほうがよいので、パトライトを使いました。工場などで、作業用の車が構内に入ったときなど、周りに知らしめるような用途に使われる回転ライトです。

パトライトのおもなスペック

  • 電源電圧 12V
  • 電流 2.9A

駆動にはリレーを使う

 Arduinoでパトライトを直接ON/OFFできません。Arduinoのディジタル・ポートは、5V、約20mAのON/OFFができます。この差をどうやって埋めるかを検討します。12Vは、別の電源を用意します。電流がたくさん流れるので、パワー・トランジスタもしくは電力用MOS FETを利用してドライブする方法があります。デバイスの選定、回路の動作確認が必要です。

 手軽な方法は、リレーを使うことです。今回の用途は、警報を出すときにONになり、問題がなくなるか電源を切るとOFFになるというゆっくりとした動作です。そして1日のうちにあっても1回起こるかどうかの頻度です。リレーは機械的なデバイスなので寿命が短いです(負荷をつないだ状態で50万回以上)。1分間に数回ON/OFFさせるような使い方をすると1年で故障します。

 リレーは、普通の規格であれば、12V 3Aは十分にON/OFFできます。製品の上面には10A 30V/DCと書かれています。

市販のボードを利用する

 リレーを駆動する回路が必要なので、それらが一体となったリレー・ボードを入手します。写真のように、1回路用、2回路用、8回路用などが入手できます。切り替えのできるタイプもありますが、High level triggerを選びます。電圧がHighのときにONになります。動作確認はこちらのページを参照ください。

12V電源を用意

 点灯実験用に12Vのバッテリを用意しました。次の接続で実験しました。リレー・ボードの1次側のVccは実験用電源12Vをつなぎ、信号入力IN端子に5Vを加えるとパトライトが点灯し回転しました。

接続

 リレーの出力は、NOとNCがあります。NOは通常オープンで、ArduinoがHigh信号をIN入力に入れるまではつながっていません。次の写真はリレー・ボードの裏面です。

  リレーの配線です。

 サンプル・スケッチのBlinkでポートを7番に変更し、動作を確認しました。

スケッチ

 前回のスケッチから、デフォルトでは12ビットの温度データを受け取るので、それよりもデータが短い場合の記述を取り除きました。最初に、T1、T2、T3と三つの温度センサの危険と判断するスレッショルドを定義します。それぞれの温度センサには、目印をつけておきます。温度センサの接続は10番、パトライトの駆動は7番ピンを使います。
 温度表示の前には、読み出したROMデータをハッシュ値にした数値を表示しました。T1、T2、T3と関連付けはしていませんが識別には便利です。

 もし閾値を超えたら、アラートの表示と、7番ピンをON(HIGH)にし、パトライトを1秒間回転します。温度はすぐに下がらないので、実際はパトライトは長時間回り続けます。

#include <OneWire.h>
// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library
OneWire ds(10); // on pin 10 (a 4.7K resistor is necessary)
int T1=23;
int T2=24;
int T3=25;

void setup(void) {
Serial.begin(9600);
Serial.println("start");
pinMode(7, OUTPUT); digitalWrite(7, LOW);
}

void loop(void) {
byte i;
byte data[12];
byte addr[8];
float celsius;

if ( !ds.search(addr)) {
Serial.println(" ----- ");
ds.reset_search();
delay(250);
return;
}

if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return;
}

ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
Serial.print((addr[1]+addr[2]+addr[3]+addr[4]+addr[5]) % 5);
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
// default is 12 bit resolution, 750 ms conversion time
int16_t raw = (data[1] << 8) | data[0];
celsius = (float)raw / 16.0;
Serial.print(" Temp= "); Serial.println(celsius,1);
if (celsius >T1) {
digitalWrite(7, HIGH);Serial.println("alert T1");
}
if (celsius >T2) {
digitalWrite(7, HIGH);Serial.println("alert T2");
}
if (celsius >T3) {
digitalWrite(7, HIGH);Serial.println("alert T3");
}
delay(1000);
digitalWrite(7, LOW);
}

コラム なぜpinMode(7, OUTPUT); が必要なのか

 マイコンはいろいろな用途に使えるように機能が満載です。コストを下げるために、マイコンではたくさんのピンを出していません。そのため、同じピンに複数の機能が割り当てられているので、最初にどの機能を使うかという設定をします。それが、7番ピンを出力用途で使うという記述です。

 INPUTと指定すれば入力に使えます。pulseIn()は内部のタイマにつなげられます。

(※1)プログラム・リストは、表示の関係でTabキーが無視されるので、スペースに代えてあります。また、リスト中を2回クリックすると全選択になるので、CTRL-Cでコピーし、テキスト・エディタにCTRL-Vで貼り付けて利用してください。エディタに持っていくと、スペースやリターン・コードなどが化けていることがあるので、一度消して、Arduino IDEのテキスト・エディタで修正してください。

前へ

重さを測る その2 0.01gが測れるロードセル

次へ

7セグLED表示 その1 1文字