XBeeモジュールとArduinoを利用した、センサノードの製作にチャレンジしましょう。
今回は、温湿度センサDHT11とArduinoを利用する方法を紹介します。
このDHT11をはじめ、市販されているセンサの中には、XBeeモジュールから直接読みだすことができず、データを取り出すためにマイクロコントローラが必須となるものがあります。
こうしたセンサは、測定値をデジタル信号で出力しており、XBeeモジュールではデータを正しく読み取ることが難しいからです。この後のセクションで、XBeeモジュールに直接接続できる、シンプルなアナログ出力のセンサも紹介します。
この例では、ブレッドボード上でArduinoにDHT11温湿度センサを接続してデータを読み出します。その他に必要な外付け部品は、出力データをArduinoが読み取りやすくするための抵抗1本だけです。
早速、ブレッドボード上に回路を組み立ててみましょう
ハードウェアの作製
この工作に必要な部品は、Arduino UNO、温湿度センサDHT11、ブレッドボード、4.7kΩの抵抗(色帯:「黄・紫・赤・金」もしくは「黄・紫・黒・茶・茶」)、ブレッドボード用のジャンパー線です。
まず、Arduino UNOをブレッドボードの横に置きます。図1に示す通り、DHT11温湿度センサをブレッドボードに差し込みます。
次に、Arduinoからブレッドボードに電源を供給します。Arduinoの「5V」ピンをブレッドボードの赤色の電源レールに、「GND」ピンを黒色の電源レールに、それぞれジャンパー線を使用して接続します。
続いて、温湿度センサDHT11に配線していきます。温湿度センサDHT11には4本のピンがありますが、そのうち3本を使用します。表6-1に接続先を示します。水色のセンサ本体が上を、ピンが下を向くように持った時、左から1、2、3、4ピンの順番です。
図1を参考に、間違いのないように配線してください。
ピン | 接続先 |
1 | 5V、4.7kΩ抵抗(プルアップ抵抗) |
2 | ArduinoのD7ピン、4.7kΩ抵抗 |
3 | 接続なし |
4 | GND |
Arduino IDEの設定
ArduinoでDHT11を使用するには、DHT11用のライブラリが必要です。ライブラリは、Arduino IDEのライブラリマネージャから簡単にインストールできます。
Arduino IDEを開き、メニューから「スケッチ」>「ライブラリをインクルード」>「ライブラリを管理」をクリックすると、図6-22のようなライブラリマネージャが開きます。
ライブラリマネージャは起動後すぐにサーバーに接続し、最新のライブラリのカタログをダウンロードします。ここで少し待たされることがあります。
ダウンロードが終わり、ライブラリマネージャが使えるようになったら、右上のテキストボックスに「DHT11」と入力してENTERキーを押します。関連するライブラリがすべて表示されます。
これらの中から、AdafruitのDHTセンサライブラリ「DHT Sensor Library」を選択し、「インストール」をクリックします。図3のような画面が出た場合は、「Install all」をクリックしてください。このライブラリを使うのに関連して必要な別のライブラリを、自動で一緒にインストールしてくれます。
ハードウェアの製作と、DHT11ライブラリの準備が整ったので、早速スケッチを書いてみましょう。
スケッチ(プログラム)の作成
これまでに作成した他のスケッチと同様に、ライブラリをインクルードし、定数を定義します。加えて、メインのloop文の前でDHTオブジェクトのインスタンスを生成します。
ここでは、まずDHTライブラリをインクルードし、センサのデータ読み取りピンをArduinoのD7ピンに設定してDHTクラスのインスタンスを生成します。今回使用しているライブラリはDHTシリーズの様々な温湿度センサに対応しているので、使用するセンサのタイプを定義する必要があります。
これとは別に、センサ読み取りの時間間隔を5秒と定めます。
スケッチの前文は次のようになります。
#include "DHT.h" #define DHTPIN 7 //DHT11はD7ピンに接続 #define DHTTYPE DHT11 // 使用するセンサ:DHT11 #define read_delay 5000 //センサ読み取り間隔:5秒
続いて、DHTクラスのインスタンスを生成します。前文で指定したピンと使用するセンサのタイプを渡します。
DHT dht(DHTPIN, DHTTYPE);
前述のように、DHT11はデータ通信をするための独自のプロトコル(通信をする上での約束ごと)を持っており、簡単にはデータを取り出すことができません。
そこでライブラリを使用します。ライブラリを使用することで、簡単にセンサデータを取り出せるようになります。表6-2のようなメソッド(命令)を呼び出すだけで、変数に温度や湿度のデータを保存できます。
なお、「摂氏」「華氏」というのは温度を表す数字の種類のことで、通常私たちは「摂氏」と呼ばれる指標を使用しています。体感温度は、温度と湿度の情報を基に計算した値を返してくれます。
表2 DHTライブラリでデータを読み取る方法
メソッド | 動作 |
dht.readHumidity() | 湿度を読み取る |
dht.readTemperature() | 温度を摂氏で読み取る |
dht.readTemperature(true) | 温度を華氏で読み取る |
dht.computeHeatIndex(temp_c,humidity) | 体感温度を摂氏で読み取る |
dht.computeHeatIndex(temp_f,humidity,false) | 体感温度を華氏で読み取る |
温度や湿度といったデータを読み取るためには、まずデータを格納するための変数を用意してこれらのメソッドを呼び出します。スケッチを分かりやすくするため、一連のメソッドを「read_data()」という関数として以下にまとめてみました。
■read_data()関数
void read_data(){ //湿度を読み取る float humidity = dht.readHumidity(); //摂氏で温度を読み取る float temp_c = dht.readTemperature(); //華氏で温度を読み取る float temp_f = dht.readTemperature(true); //エラーチェック(読み取れていない数値がないか?) if (isnan(humidity) || isnan(temp_c) || isnan(temp_f)) { Serial.println(F("Failed to read from DHT sensor!")); return; } //摂氏で体感温度を計算する float hi_c = dht.computeHeatIndex(temp_c, humidity, false); //華氏で体感温度を計算する float hi_f = dht.computeHeatIndex(temp_f, humidity, true); //シリアル通信で送信 Serial.print("Humidity: "); Serial.print(humidity); Serial.print("% "); Serial.print("Temperature: "); Serial.print(temp_c); Serial.print("C ,"); Serial.print(temp_f); Serial.print("F "); Serial.print("Heat index: "); Serial.print(hi_c); Serial.print("C ,"); Serial.print(hi_f); Serial.println("F"); }
スケッチはとても簡単です。前述のように数値の読み取り・計算を行い、Serial.print()、Serial.println()メソッドでシリアルモニタに書き込んでデータをPC上に表示します。
残るはsetup()とloop()メソッドです。
setup()メソッドではシリアル通信とdhtクラスの初期化を行います。
loop()メソッドはdelay()を使って一定時間おきにread_data()関数を呼び出します。
改正したスケッチを以下に示します。
■完成したスケッチ
#include "DHT.h" #define DHTPIN 7 //DHT11はD7ピンに接続 #define DHTTYPE DHT11 // 使用するセンサ:DHT11 #define read_delay 5000 //センサ読み取り間隔:5秒 DHT dht(DHTPIN, DHTTYPE); void read_data(){ //湿度を読み取る float humidity = dht.readHumidity(); //摂氏で温度を読み取る float temp_c = dht.readTemperature(); //華氏で温度を読み取る float temp_f = dht.readTemperature(true); //エラーチェック(読み取れていない数値がないか?) if (isnan(humidity) || isnan(temp_c) || isnan(temp_f)) { Serial.println(F("Failed to read from DHT sensor! ")); return; } //摂氏で体感温度を計算する float hi_c = dht.computeHeatIndex(temp_c, humidity, false); //華氏で体感温度を計算する float hi_f = dht.computeHeatIndex(temp_f, humidity, true); //シリアル通信で送信 Serial.print("Humidity: "); Serial.print(humidity); Serial.print("% "); Serial.print("Temperature: "); Serial.print(temp_c); Serial.print("C ,"); Serial.print(temp_f); Serial.print("F "); Serial.print("Heat index: "); Serial.print(hi_c); Serial.print("C ,"); Serial.print(hi_f); Serial.println("F"); } void setup(){ Serial.begin(9600); //シリアル通信開始 dht.begin(); delay(1000); Serial.println("Welcome to the DHT-11 Arduino example!"); } void loop(){ delay(read_delay); read_data(); }
動作テスト
早速作成したスケッチをArduinoにアップロードして、動作テストを行ってみましょう。
ArduinoをPCに接続してください。
まずはスケッチをアップロードする前に一度コンパイルしておきましょう。Arduino IDEのツールバー左端のチェックマークをクリックして、画面下部のメッセージ画面を観察します。エラーが出ていれば、修正してコンパイルをやり直します。
よくあるエラーとしては、DHTライブラリや関連するライブラリがインストールできていない・読み込めていない(Arduino IDEを一度閉じて、再立ち上げしてみましょう)、タイピングの間違い、構文エラー(特にカッコの対応が取れていない、行末の「;」の付け忘れ)などが挙げられます。
正しくコンパイル実行できたら、メニューバー「ツール」の「ボード」が「Arduino UNO」に、「シリアルポート」が正しく設定されていることを確認して、ツールバーの「→」のボタンをクリックしてArduinoにアップロードします。
アップロードが終わったらシリアルモニタを開きます。
以下のように出力されていれば成功です。
■DHT11センサのシリアルモニタ出力
Welcome to the DHT-11 Arduino example!
Humidity: 38.00% Temperature: 26.00C ,78.80F Heat index: 25.65C ,78.17F
Humidity: 39.00% Temperature: 26.00C ,78.80F Heat index: 25.67C ,78.21F
Humidity: 37.00% Temperature: 27.00C ,80.60F Heat index: 26.72C ,80.09F
…
Arduinoホストのセンサノードが完成しました。
センサに息を吹きかけたり、手で温めたりすると温度が変わっていくのが観察できるでしょう。
次回は、ここにさらにXBeeモジュールを追加することで、センサとArduinoが離れていてもデータを読み取れるようにしてみましょう。
コメントを残す