12 Arduino 温度湿度センサーを接続
この記事では、Arduino に温度湿度センサーを接続します。
使用する超音波距離センサーモジュールは写真のように、小さな基板に温度湿度センサーが組み込まれ、入出力ピン(左から : DATA入出力、電源5v、GND)が出ています。使用した超音波距離センサーは、「DHT11」です。
超音波距離センサーDHT11 デバイスは、双方向性のシングル バス通信を使用します。「DATA」ピンが唯一のデータラインであり、システム内のデータ交換と制御はシングルバスで完結します。通常、データラインは約 4.7 k Ω の外部プルアップ抵抗が必要ですが、今回はArduino の内部プルアップ抵抗(20 k Ω )で代用しています。
超音波距離センサーを以下の手順で使用し距離を測定します。
- Arduino から DATAピンに、Start信号として 20ms の LOW パルスを出力します。
- Arduino は出力の終了と同時に、 DATAピンを Pull up 入力に切り替えセンサーからの応答を待ちます。
- センサーは、Start信号を受け取ると Response信号として 80usの LOW および HIGHパルスを出力後に、40 bits (8bits x 5) の観測データを送ります。
- センサーは、40 bits データを送り終えるとEnd信号として 80usの LOW パルスを出力し、 DATAピンをハイインピーダンスにします。
40 bits の観測データは以下の 8bits x 5 の内容を表しています。
- 湿度 HI byte ; 20 〜 90 %RH の値
- 湿度 LOW byte ; 常にゼロ
- 温度 HI byte ; 0 〜 50 °C の値
- 温度 LOW byte ; 常にゼロ
- パリティ byte ; 湿度 HI + 湿度 LOW + 温度 HI + 温度 LOW
40 bits の観測データは以下のように 50us の LOW パルスに続く HIGH パルスの長さで、「0」と「1」を区別しています。プログラムでは、50us を超えると「1」として扱っています。
今回超センサーを以下のように接続しました。
- DAIA - pin 2(入出力)
- 電源 - 5v
- GND - GND
スケッチ内容
以下の動作を3秒に1回実行します。
- 湿度温度センサーの操作手順に従い、20ms のStart信号を出力します。
- DATAピンの波形を計測し、5個の 8 bite データに変換します。
- 変換結果は、シリアル通信でPCに送信します。
- Parity byte を確認し、エラーがあれば「error」表示します。
// 温度湿度センサー DHT11 // 2121-6-5 #define DHT_PIN 2 // DHT11 接続ピン // 初期化 void setup( ) { Serial.begin( 9600); pinMode(DHT_PIN,INPUT_PULLUP); digitalWrite(DHT_PIN,LOW); } // 繰り返し void loop( ) { int data[5]; // 読み込みデータを保管 // DHT_PIN ピンに Start信号を送る pinMode(DHT_PIN, OUTPUT); digitalWrite(DHT_PIN,LOW); delay(20); pinMode(DHT_PIN,INPUT_PULLUP); // Response信号の空読み pulseIn(DHT_PIN, HIGH, 300); // Byte x 5 計40Bites を読み込む for(int dataIdx=0;dataIdx<5;dataIdx++){ data[dataIdx] = 0; for(int bitIdx=0;bitIdx<8;bitIdx++){ data[dataIdx] <<= 1; // HIGH が 50ms を越えれば「1」 if(pulseIn(DHT_PIN, HIGH, 300) > 50) data[dataIdx] += 1; } } // DHT11 からの読み込みデータを送信 Serial.print( "T = " ); Serial.print( data[2] ); Serial.print( " deg. C, H = " ); Serial.print( data[0] ); Serial.print( "%" ); // Parityを確認 if((data[0]+data[1]+data[2]+data[3])==data[4]) Serial.println( ); else Serial.println( " Parity Error" ); // 3秒間隔で実施する delay(3000); }
使用した Arduino命令
今回使用したArduino関連の命令の簡単な説明とその日本語レファレンスの掲載されているリンクを紹介します。
- pulseIn(pin, value)
pin に入力されるパルスをus単位で計測します。
パルス種類(value)をHIGHに指定した場合、
入力の立ち上がりで計測を始め、立ち下がりでパルス長を返します。 - Serial.begin(speed)
シリアル通信のデータ転送レートをbps(baud)で指定します。 - Serial.print(data,)
データをテキストに変換してシリアルポートへ出力します。 - Serial.println(data, format)
Serial.print()と同じですが、データの末尾に改行コードを付けて送信します。
動作の確認
スケッチを Arduino に書き込みプログラムがスタートしたら、Arduino IDE 右上の「シリアルモニタ」アイコンをクリックします。
下のようなシリアルモニタ画面が開き、測定した距離が3秒に1度の頻度で書き込まれていきます。
次回は、アナログジョイスティックを接続します。