連載
» 2013年09月04日 10時00分 公開

厳しい残暑を「熱中症対策センサー」で乗り切ろう!アイデア・ハック!! Arduinoで遊ぼう(3)(2/3 ページ)

[三月兎,MONOist]

統合開発環境「Arduino IDE」でスケッチ(プログラム)を作成

 それでは、Arduinoの統合開発環境「Arduino IDE」で、スケッチ(プログラム)を作成していきましょう(スケッチ1)。


const int SENSOR = A0;            //温度センサー(TMP36)の入力ピン
 
const int LED1 = 2;               //LED1の出力ピン
const int LED2 = 3;               //LED2の出力ピン
const int LED3 = 4;               //LED3の出力ピン
const int LED4 = 5;               //LED4の出力ピン
const int LED5 = 6;               //LED5の出力ピン
 
const float BaselineTemp = 26.0;  //基準温度
const long WarningTime = 3600000; //1時間(60分*60秒*1000msec)
 
void setup(){
  pinMode(SENSOR, INPUT);         //センサーを入力モードに設定
  pinMode(LED1, OUTPUT);          //LED1を出力モードに設定
  pinMode(LED2, OUTPUT);          //LED2を出力モードに設定
  pinMode(LED3, OUTPUT);          //LED3を出力モードに設定
  pinMode(LED4, OUTPUT);          //LED4を出力モードに設定
  pinMode(LED5, OUTPUT);          //LED5を出力モードに設定
}
 
void loop(){
  // 起動してから1時間ごとに全LEDを点滅させる
  // リセットスイッチを押すまで点滅を実行
  if( millis() > WarningTime){
    while(1){
          light_led(LOW, LOW, LOW, LOW, LOW);         // 全LEDを消す
        delay(500);
        light_led(HIGH, HIGH, HIGH, HIGH, HIGH);      // 全LEDをともす
        delay(500);
    }
  } 
 
  //センサー値から室温を取得する
  float temperature = get_sensorval();
 
  // 基準温度(BaselineTemp)より低い場合、全てのLEDを消す
  if(temperature < BaselineTemp){
    light_led(LOW, LOW, LOW, LOW, LOW);
  } // 基準温度〜+2℃ LEDを1つともす
  else if(temperature < BaselineTemp+2){
    light_led(HIGH, LOW, LOW, LOW, LOW);
  } // 基準温度〜+4℃ LEDを2つともす
  else if(temperature < BaselineTemp+4){
    light_led(HIGH, HIGH, LOW, LOW, LOW);
  } // 基準温度〜+6℃ LEDを3つともす
  else if(temperature < BaselineTemp+6){
    light_led(HIGH, HIGH, HIGH, LOW, LOW);
  }  // 基準温度〜+8℃ LEDを4つともす
  else if(temperature < BaselineTemp+8){
    light_led(HIGH, HIGH, HIGH, HIGH, LOW);
  }   // 基準温度〜+8℃以上のとき LEDを5つ(全て)ともす
  else if(temperature >= BaselineTemp+8){
    light_led(HIGH, HIGH, HIGH, HIGH, HIGH);
  } 
  delay(1000);
}
 
//センサーの値を取得し、温度を返す
float get_sensorval(){
  int sensorVal = analogRead(SENSOR);            //センサーの値を読む
  float voltage = (sensorVal / 1024.0) * 5.0;    //センサー値を電圧に変換
  float temperature = (voltage - 0.5) * 100;     //電圧から温度を求める
  return(temperature);
}
 
// LEDの点滅
void light_led(int led1_st, int led2_st, int led3_st, int led4_st, int led5_st){
    digitalWrite(LED1, led1_st);
    digitalWrite(LED2, led2_st);
    digitalWrite(LED3, led3_st);
    digitalWrite(LED4, led4_st);
    digitalWrite(LED5, led5_st);
}
スケッチ1 「熱中症対策センサー」は、26〜34℃までをLEDで表示。1時間ごとに全LEDが点滅する

 1〜7行目は、Arduinoのピンがどの電子部品と接続しているかを定義しています。温度センサーはアナログ値を取得するので、A0に接続。LEDはデジタルピンの2〜6に接続しています。

 室温が26℃以上になったときに、1つ目のLEDを点灯させたいので、基準温度(BaselineTemp)は、26.0にしています(9行目)。1時間ごとに全LEDを点滅させるために、long型で3600000ミリ秒のWarningTimeを設定しておきます(10行目)。

 12〜19行目のsetup()では、センサーを接続したピンを入力に、LEDを接続したピンを出力に指定しています。ここまでは、Arduinoのお約束ですね!

 今回は、ユーザー関数を2つ作りました。1つは、センサー値を読み取って温度に換算して戻すget_sensorval()。もう1つは、5つのLEDの点滅を管理するlight_led()です。

 get_sensorval()は、センサー値を温度に変換しています(58〜64行目)。

 60行目のanalogRead()は、アナログ入力ピン(A0〜A5)に掛かっている電圧を取得する関数です。0〜5Vの電圧を0〜1023の整数値に変換して取得します。センサーの値を1024で割って、5Vを掛けると電圧「voltage」を取得できます。

 今回使用している低電圧温度センサー(TMP36)は、データシートによると基準電圧が0.5Vで、1℃ごとに10mVの電圧が掛かると記述されています(画像7)。そこで、先ほど求めたvoltageから0.5Vを引いて、100を掛けると温度が求められるわけです。

TMP36 画像7 低電圧温度センサー「TMP36」の出力特性(TMP36のデータシートより抜粋)

 66〜73行目のlight_led()は、5つの引数にHIGHかLOWを与え、各LEDの点灯/消灯を制御するだけのシンプルな関数です。

 21〜56行目のloop()内では、最初にmillis()でArduinoが起動してからの経過時間をチェックし、1時間以上経過していたらLEDの点滅を実行しています。while文の条件が1なので永久ループとなり、基板上のリセットボタンが押されるまで点滅を続けます。

 Arduinoを起動して1時間以内なら、33行目以降が実行されます。get_sensorval()で室温をチェックし、室温に応じてLEDの点灯を管理しています。最後にdelay(1000);と入れたので、このアプリケーションは1秒ごとに室温をチェックすることになります。

Copyright © ITmedia, Inc. All Rights Reserved.