※この記事は2014年10月3日に公開した記事を再編集し、2022年1月13日に再度公開しました。
簡易百葉箱を作ってみる回も、今回で3回目。Arduinoの扱いもだいぶ慣れてきました。前回は7セグメントLEDを使って表示部分のノウハウを身につけましたが、今回はまた百葉箱の主要な機能である湿度センサを実装し、実際に利用する際に使い勝手を良くする為に、Arduinoにつなぐ線の簡略化を行ってみたいと思います。
目次
今回の電子工作レシピ
完成までの時間目安:60分
必要なパーツ
- Arduino本体(Arduino Uno R3)http://www.switch-science.com/catalog/789/
- ブレッドボード http://www.switch-science.com/catalog/313/
- 7セグメントLED(超高輝度赤色7セグメントLED表示器(カソードコモン)NKR161-B)
- 湿度センサ(TDK CHS-UGR)
- 温度センサ(LM35DZ)
- ACアダプタ(http://www.switch-science.com/catalog/1408/)
- 9V電池スナップ(http://akizukidenshi.com/catalog/g/gP-00452/)
- 9V電池
仕様を振り返る
実際に作業に取り組む前に、作ろうとしている簡易百葉箱の仕様を再度確認してみます。
簡易百葉箱に対する要望(仕様書)
- インターネットを通じてPC上からいつでも数値を確認したい
→イーサネットモジュールなどを利用してLANで百葉箱をつなぐ
- 色々な所に置きやすいようにPCにつなげなくても独立して動くようにしたい
→Arduinoの給電をUSBではなくACアダプタや電池での給電に変更 - さらに百葉箱につなぐ線もできるだけ減らしたい(可能であれば全ての線をなくしたい)
→上記2の方法で電源コードを減らす、LANケーブルを無線LAN化するなどしてケーブルフリーにする等
- PCだけでなく直接数値を確認したい、PC上ではグラフとかで推移を確認したい
→ディスプレイをつけて本体に数値を表示する等
- サイズをコンパクトにしたい
→ブレッドボードではなく基板に半田付けしてサイズを小さくする、もっと小さいサイズのArduinoを利用する等
これまでの仕様では上記にあげた機能を簡易百葉箱に実装を行う予定ですね。湿度センサは上記にあげるまでもなく百葉箱の基本仕様となります。項目2,3については、今回ACアダプタや電池での駆動によってクリアすることができますね。
湿度センサを使ってみる
今回は始めに湿度センサの使い方を習得してみます。といっても、今回使う湿度センサはとても扱いやすいものですので、難しい知識は必要ありません。
今回利用する湿度センサCHS-UGRはDC.1V出力で100(%)RHを表示する仕様となっています。簡単に説明すると、湿度センサをアナログ入力に設置した場合、0V =Arduino上のアナログ入力値が0の場合は湿度が0%、1.0V = Arduino上のアナログ入力値が205の場合、湿度が100%とということになります。では、その仕様をもとに回路を組んでみます。
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%にします)の値が入力されてきますので、赤文字で記載した部分に該当する関数を作成します。
実際にArduinoを動かすとシリアルモニタには下記のように表示されると思います。湿度センサに手を近づけたり息をはくと湿度を感知して数値が変わるのが確認できると思います。
温度、湿度を両方表示する
これで温度センサ、湿度センサの両方の扱いがわかったということで、ブレッドボード上に両方のセンサを配置して両方の数値が取得できるようにしてみます。
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を利用して交互に温度、湿度を表示できるようにしてみましょう。
// // 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に電源が提供されて動きます。
9V電池でArduinoを動かしてみる
9V電池でArduinoを動かす場合は同様に電池ボックスがArduinoのジャックに対応していればACアダプタと同様ジャックに接続するだけですが、線の場合は、ArduinoのVinポートにプラス、GNDにマイナスをつなぐことで電源を供給できます。
ここまでの仕様を確認しましょう。
- インターネットを通じてPC上からいつでも数値を確認したい
- 色々な所に置きやすいようにPCにつなげなくても独立して動くようにしたい
- さらに百葉箱につなぐ線もできるだけ減らしたい(可能であれば全ての線をなくしたい)
- PCだけでなく直接数値を確認したい
- サイズをコンパクトにしたい
これで当初目的としていた簡易百葉箱の仕様がほぼそろいました。一旦ここまでできた状態で手元にちょうどスマートフォン用のスタンドクリップがあったのでそれを使って簡易的に設置してみました。
おぉ、立ててみると基板がむき出しでかっこいいですね(笑)
ただ、これじゃすぐ線は抜けそうだし、Arduino本体は線のみでつながっている状態・・・、そもそもぶつかったらすぐ壊れてしまうこと間違いなしです(笑)。
こんな状態では完成というには程遠いので、次回はこれまでの実装をもとに外箱を含めて簡易百葉箱を完成させたいと思います!
この連載の記事
- 第7回 Arduinoで作る簡易百葉箱(その1)。
- 第8回 Arduinoで作る簡易百葉箱(その2)。電光掲示板(7セグメントLED)を使って数値を表示。
- 第9回 Arduinoで作る簡易百葉箱(その3)湿度センサの習得、そして電池で動かしてみる。(このページの記事)
- 第10回 Arduinoで作る簡易百葉箱(その4)ケースの作成、ハンダ付けに挑戦、そして完成へ!