厳しい残暑を「熱中症対策センサー」で乗り切ろう!:アイデア・ハック!! Arduinoで遊ぼう(3)(2/3 ページ)
頭の中のアイデアを「Arduino(アルドゥイーノ)」で実現!! 筆者と一緒にモノづくりの喜びや難しさを体験・体感してみよう。第3回のテーマは“厳しい残暑を健康的に乗り切ろう”だ。温度センサーと複数のLEDを組み合わせて、「熱中症対策センサー」を作るぞ!
統合開発環境「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〜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を掛けると温度が求められるわけです。
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.