はじめての電子工作超入門

第9回 Arduinoで作る簡易百葉箱(その3)湿度センサーの習得、そして電池で動かしてみる。

Arduinoによる温度・湿度計

簡易百葉箱を作ってみる回も、今回で3回目。Arduinoの扱いもだいぶ慣れてきました。前回は7セグメントLEDを使って表示部分のノウハウを身につけましたが、今回はまた百葉箱の主要な機能である湿度センサーを実装し、実際に利用する際に使い勝手を良くする為に、Arduinoにつなぐ線の簡略化を行ってみたいと思います。

今回の電子工作レシピ

完成までの時間目安:60分
必要なパーツ

仕様を振り返る

実際に作業に取り組む前に、作ろうとしている簡易百葉箱の仕様を再度確認してみます。

plan

簡易百葉箱に対する要望(仕様書)

  1. インターネットを通じてPC上からいつでも数値を確認したい

→イーサネットモジュールなどを利用してLANで百葉箱をつなぐ

  1. 色々な所に置きやすいようにPCにつなげなくても独立して動くようにしたい
    →Arduinoの給電をUSBではなくACアダプターや電池での給電に変更
  2. さらに百葉箱につなぐ線もできるだけ減らしたい(可能であれば全ての線をなくしたい)

→上記2の方法で電源コードを減らす、LANケーブルを無線LAN化するなどしてケーブルフリーにする等

  1. PCだけでなく直接数値を確認したい、PC上ではグラフとかで推移を確認したい

→ディスプレイをつけて本体に数値を表示する等

  1. サイズをコンパクトにしたい
    →ブレッドボードではなく基板に半田付けしてサイズを小さくする、もっと小さいサイズのArduinoを利用する等

これまでの仕様では上記にあげた機能を簡易百葉箱に実装を行う予定ですね。湿度センサーは上記にあげるまでもなく百葉箱の基本仕様となります。項目2,3については、今回ACアダプターや電池での駆動によってクリアすることができますね。

湿度センサーを使ってみる

CHS-URG湿度センサー

湿度センサーとして定番のTDK CHS-UGR

今回は始めに湿度センサーの使い方を習得してみます。といっても、今回使う湿度センサーはとても扱いやすいものですので、難しい知識は必要ありません。

今回利用する湿度センサーCHS-UGRはDC.1V出力で100(%)RHを表示する仕様となっています。簡単に説明すると、湿度センサーをアナログ入力に設置した場合、0V =Arduino上のアナログ入力値が0の場合は湿度が0%、1.0V = Arduino上のアナログ入力値が205の場合、湿度が100%とということになります。では、その仕様をもとに回路を組んでみます。

仕様書

2014-10-01 16.13.04

湿度センサーは今までのパーツより大きい方です

スクリーンショット 2014-10-01 17.27.43

int sensorPin = A0;
int sensorValue = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
sensorValue = analogRead(sensorPin);
Serial.print("input value:");
Serial.println(toHumidity(sensorValue)/);
delay(1000);
}
//アナログ入力値を湿度に変換
float toHumidity(int analog_val){
float v  = 5;     // 基準電圧値( V )
float tempC = (analog_val / (1024/v)) * 100;
if(tempC &> 100){
tempC = 100;
}
return tempC
}

ブレッドボード上の回路もプログラムもシンプルだということがわかるかと思います。

プログラムに関しても、基本的には温度センサーと同じアナログ入力値を読み取り、湿度センサーの特性を考慮して数値を修正し、データの取得が可能になります。湿度センサーの特性ではアナログ値に0~205(205以上は全て100%にします)の値が入力されてきますので、赤文字で記載した部分に該当する関数を作成します。

スクリーンショット 2014-09-26 2.59.34

実際にArduinoを動かすとシリアルモニタには下記のように表示されると思います。湿度センサーに手を近づけたり息をはくと湿度を感知して数値が変わるのが確認できると思います。

 

温度、湿度を両方表示する

これで温度センサー、湿度センサーの両方の扱いがわかったということで、ブレッドボード上に両方のセンサーを配置して両方の数値が取得できるようにしてみます。

 

スクリーンショット 2014-10-01 17.26.25

int temperaturePin    = A0;   // select the input pin for the potentiometer
int humidityPin       = A1;   // select the input pin for the potentiometer
int temperatureValue  = 0;  // variable to store the value coming from the sensor
int humidityValue     = 1;  // variable to store the value coming from the sensor
void setup() {
Serial.begin(9600);
}
void loop() {
temperatureValue  = analogRead(temperaturePin);
humidityValue     = analogRead(humidityPin);
Serial.print("temperature:");
Serial.print(toTemperature(temperatureValue));
Serial.print("/ humidity:");
Serial.println(toHumidity(humidityValue));
delay(1000);
}
//アナログ入力値を摂氏度℃に変換
float toTemperature(int analog_val){
float v  = 5;     // 基準電圧値( V )
float tempC = ((v * analog_val) / 1024) * 100;
return tempC;
}
//アナログ入力値を湿度に変換
float toHumidity(int analog_val){
float v  = 5;     // 基準電圧値( V )
float tempC = (analog_val / (1024/v)) * 100;
if(tempC &> 100){
tempC = 100;
}
return tempC;
}

アナログピンの0番目に温度センサー、1番目に湿度センサーの値を取得できるようになりました。

さらに前回の7セグLEDを利用して交互に温度、湿度を表示できるようにしてみましょう。

 

スクリーンショット 2014-10-01 17.25.45

//
// 7セグメントLEDに温度湿度を表示するプログラム
//
int     _cnt = 0;      //
int     _number  = 0;  //
int temperaturePin    = A0;   // select the input pin for the potentiometer
int humidityPin       = A1;   // select the input pin for the potentiometer
int temperatureValue  = 0;  // variable to store the value coming from the sensor
int humidityValue     = 1;  // variable to store the value coming from the sensor
boolean _switchFlg = false;  //温度・湿度の表示切り替え用フラグ
boolean _flg = false;
void setup(){
Serial.begin(9600);
//2~8番ピン デジタル出力へセット
for (int i=2; i&<=8; i++){
pinMode(i,OUTPUT);
}
pinMode(13,OUTPUT);
pinMode(11,OUTPUT);
}
//LEDレイアウトを定義
boolean Num_Array[10][7]={
{1,1,1,1,1,1,0}, //0
{0,1,1,0,0,0,0}, //1
{1,1,0,1,1,0,1}, //2
{1,1,1,1,0,0,1}, //3
{0,1,1,0,0,1,1}, //4
{1,0,1,1,0,1,1}, //5
{1,0,1,1,1,1,1}, //6
{1,1,1,0,0,1,0}, //7
{1,1,1,1,1,1,1}, //8
{1,1,1,1,0,1,1}  //9
};
//LED表示関数を定義
void NumPrint(int Number){
for (int w=0; w&<=7; w++){
digitalWrite(w+2,-Num_Array[Number][w]);
}
}
//2桁をそれぞれの桁で分解
int NumParse(int Number,int s){
if(s == 1){
return Number % 10;
}
else if(s == 2){
return Number / 10;
}
return 0;
}
void loop(){
//温度湿度を取得してそのまま変換した値を変数に代入
if(_switchFlg){
_number  = toTemperature(analogRead(temperaturePin))
}
else{
_number     = toHumidity(analogRead(humidityPin))
}
if(_flg){
digitalWrite(11,LOW);
digitalWrite(13,HIGH);
_flg  = false;
NumPrint(NumParse(_number,1));
}
else{
digitalWrite(11,HIGH);
digitalWrite(13,LOW);
_flg  = true;
NumPrint(NumParse(_number,2));
}
if(_cnt &>= 100){
_cnt = 0;
if(_switchFlg){
_switchFlg = false;
}
else{
_switchFlg = true;
}
}
_cnt++;
delay(10);
}
//アナログ入力値を摂氏度℃に変換
float toTemperature(int analog_val){
float v  = 5;     // 基準電圧値( V )
float tempC = ((v * analog_val) / 1024) * 100;
return tempC;
}
//アナログ入力値を湿度に変換
float toHumidity(int analog_val){
float v  = 5;     // 基準電圧値( V )
float tempC = (analog_val / (1024/v)) * 100;
if(tempC &> 100){
tempC = 100;
}
return tempC;
}

このプログラムでは、基本的にこれまでの7セグLEDの表示プログラムにアナログの値を渡している内容ですが、今回温度・湿度を交互に表示したいので、_switchFlgをフラグとして一定時間でtrue/falseを切り替えることで_numberに温度・湿度が交互に代入されるようにしています。今回はloop関数の最後でdelay(10) = 0.01秒ごとに_cntを加算させていき、_cntが100になった場合に_cntを0に戻して_switchFlgの状態を切り替えているので、0.01秒×100で1秒ごとに切り替が実行されます。

他の電源で動かしてみる

ここまでこれば、ようやく百葉箱の中身として機能がそろいましたね。では、次にArduinoを他の電源で動かしてみましょう。これまではパソコンとUSBケーブルをつないでArduinoを動かしていましたが、これまで説明した通りプログラムはArduinoに書き込まれていますので、電源だけ確保できれば単独で動作します。

では、実際にはどれくらいの電力をArduinoに提供できれば良いのでしょうか。これまで利用しているArduino UNOの入力電圧は仕様(http://arduino.cc/en/Main/ArduinoBoardUno)では最低限必要な動作電圧は5V、標準電圧は7〜12Vとなっています。今回はACアダプターおよび9V電池をArduinoの電源として利用してみます。

ACアダプターでArduinoを動かしてみる

ACアダプターでArduinoを動かす場合、Arduinoについているアダプタージャックに接続するだけでArduinoに電源が提供されて動きます。

2014-10-01 17.35.40

9V電池でArduinoを動かしてみる

9V電池でArduinoを動かす場合は同様に電池ボックスがArduinoのジャックに対応していればACアダプターと同様ジャックに接続するだけですが、線の場合は、ArduinoのVinポートにプラス、GNDにマイナスをつなぐことで電源を供給できます。

009_010

乾電池と比べるとArudinoの小ささが際立ちます

ここまでの仕様を確認しましょう。

  1. インターネットを通じてPC上からいつでも数値を確認したい
  2. 色々な所に置きやすいようにPCにつなげなくても独立して動くようにしたい
  3. さらに百葉箱につなぐ線もできるだけ減らしたい(可能であれば全ての線をなくしたい)
  4. PCだけでなく直接数値を確認したい
  5. サイズをコンパクトにしたい

これで当初目的としていた簡易百葉箱の仕様がほぼそろいました。一旦ここまでできた状態で手元にちょうどスマートフォン用のスタンドクリップがあったのでそれを使って簡易的に設置してみました。

Arduinoによる温度・湿度計

おぉ、立ててみると基板がむき出しでかっこいいですね(笑)

ただ、これじゃすぐ線は抜けそうだし、Arduino本体は線のみでつながっている状態・・・、そもそもぶつかったらすぐ壊れてしまうこと間違いなしです(笑)。

こんな状態では完成というには程遠いので、次回はこれまでの実装をもとに外箱を含めて簡易百葉箱を完成させたいと思います!

 

NHK学生ロボコン2016 出場ロボット解剖計画
赤川シホロ

電子工作や新しいデバイスをこよなく愛するエンジニア。日常生活のちょっとしたことを電子工作で作って試して、おもしろく過ごしたいと日々考えています。