前回まで/次回以降の取り組みはこちらから。
ということで、さっそくIoTで観察日記をつけるための仕組みを作っていきます。
今回は温度・湿度センサをArduinoに接続して温度と湿度を測定してみます。
あさがおIoT観察日記に限らず、Arduinoで温度や湿度を測定する場合にも同様に測定できます。
今回、部品を選ぶにあたっては、Amazonで販売されているKeystudioさんのArduinoパーツキットに入っている部品を中心に選定しています。
というのも、たまたま持っていて、ちょうどよく必要な部品が揃いそうだったので。
ただし、一部後付けで追加している部品もあります。
Arduinoで温度と湿度を測る
温度や湿度を測るにもいろいろなセンサがありますが、今回はDHT11というセンサを使います。
これですね↓
Arduinoに接続する
先述のパーツキットには動作に必要な抵抗・コンデンサとともに基板に実装した状態でついてきます。
「+」ピンは5V、「ー」ピンはGND、「S」ピンはD2にそれぞれ接続します。
(センサの陰でちゃんとつないであります…)
Arduino用ライブラリをインストールする
ArduinoIDEにはDHT11や同じシリーズの温度湿度センサを使うためのライブラリがあります。
DHT11は「1-wireライク通信」という通信方式でArduinoと通信をして使用しますが、このライブラリを使うことで実際の通信について知らなくても使うことができます。
ライブラリにもいろいろありますが、今回は「DHT sensor liblary」を使用します。
ArduinoIDEのメニューバーから[スケッチ]→[ライブラリをインクルード]→[ライブラリを管理]と進みます。
右上の検索ボックスに「DHT」と入力して検索します。
「DHT sensor liblary」を選んで「インストール」
「DHT sensor liblaryの動作に必要な他のライブラリをインストールしますか?」と聞かれたら、「Install all」と答えておきます。
インストール完了まで待ちます。
サンプルスケッチを開く
メニューバー[ファイル]→[スケッチ例]→[DHT sensor liblary]からサンプルスケッチ「DHT_Unified_Sensor.ino」を開いてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | // DHT Temperature & Humidity Sensor // Unified Sensor Library Example // Written by Tony DiCola for Adafruit Industries // Released under an MIT license. // REQUIRES the following Arduino libraries: // - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library // - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor #include <Adafruit_Sensor.h> #include <DHT.h> #include <DHT_U.h> #define DHTPIN 2 // Digital pin connected to the DHT sensor // Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 -- // Pin 15 can work but DHT must be disconnected during program upload. // Uncomment the type of sensor in use: //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) // See guide for details on sensor wiring and usage: // https://learn.adafruit.com/dht/overview DHT_Unified dht(DHTPIN, DHTTYPE); uint32_t delayMS; void setup() { Serial.begin(9600); // Initialize device. dht.begin(); Serial.println(F("DHTxx Unified Sensor Example")); // Print temperature sensor details. sensor_t sensor; dht.temperature().getSensor(&sensor); Serial.println(F("------------------------------------")); Serial.println(F("Temperature Sensor")); Serial.print (F("Sensor Type: ")); Serial.println(sensor.name); Serial.print (F("Driver Ver: ")); Serial.println(sensor.version); Serial.print (F("Unique ID: ")); Serial.println(sensor.sensor_id); Serial.print (F("Max Value: ")); Serial.print(sensor.max_value); Serial.println(F("°C")); Serial.print (F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F("°C")); Serial.print (F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F("°C")); Serial.println(F("------------------------------------")); // Print humidity sensor details. dht.humidity().getSensor(&sensor); Serial.println(F("Humidity Sensor")); Serial.print (F("Sensor Type: ")); Serial.println(sensor.name); Serial.print (F("Driver Ver: ")); Serial.println(sensor.version); Serial.print (F("Unique ID: ")); Serial.println(sensor.sensor_id); Serial.print (F("Max Value: ")); Serial.print(sensor.max_value); Serial.println(F("%")); Serial.print (F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F("%")); Serial.print (F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F("%")); Serial.println(F("------------------------------------")); // Set delay between sensor readings based on sensor details. delayMS = sensor.min_delay / 1000; } void loop() { // Delay between measurements. delay(delayMS); // Get temperature event and print its value. sensors_event_t event; dht.temperature().getEvent(&event); if (isnan(event.temperature)) { Serial.println(F("Error reading temperature!")); } else { Serial.print(F("Temperature: ")); Serial.print(event.temperature); Serial.println(F("°C")); } // Get humidity event and print its value. dht.humidity().getEvent(&event); if (isnan(event.relative_humidity)) { Serial.println(F("Error reading humidity!")); } else { Serial.print(F("Humidity: ")); Serial.print(event.relative_humidity); Serial.println(F("%")); } } |
サンプルスケッチを変更する
このままでは動かないので、一部書き換える必要があります。
18~21行目
18 19 20 21 | // Uncomment the type of sensor in use: //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) |
となっています。
18、19、21行目がコメントアウトされています。
これを今回は19行目のコメントアウトを外し、20行目をコメントアウトします。
18 19 20 21 | // Uncomment the type of sensor in use: #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) |
こうなります。
このライブラリはDHT11のほかにも同じシリーズのDHT21、DHT22というセンサにも対応していて、それぞれのセンサ用の設定をすべて書いておいて、使わないものをコメントアウトしておくという作りになっています。
このため、必要な部分のコメントアウトを外し、不要な部分をコメントアウトするだけでかんたんに使いたいセンサに合わせて変更ができる、というわけです。
割といろいろなライブラリで使われています。
逆にこのコメントアウト部分がなかったら、この部分には何を書いておけばよいのか、ということをライブラリに付属の資料などから読み解いて記入する必要があります。
また、先ほどセンサの「S」ピンをD2につないだのはこのスケッチの14行目で
14 | #define DHTPIN 2 // Digital pin connected to the DHT sensor |
と指定されていたからなのでした。
動かしてみる
ここまででArduinoに書き込んでみます。
書き込んだら、シリアルモニタを起動します
温度と湿度がPCにシリアル通信で返ってきています。
体感的にですが、大きくずれているということはなさそうです。
あさがお観察用スケッチを作る
サンプルスケッチをたたき台にして、最終的に使うスケッチを作っていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | // あさがおIoT観察日記 Arduino側プログラム // 2020.05.21 V0.0.1 DHT11による温度・湿度取得(DHT11サンプルスケッチより作成) #include <Adafruit_Sensor.h> #include <DHT.h> #include <DHT_U.h> #define DHTPIN 2 // Digital pin connected to the DHT sensor #define DHTTYPE DHT11 // DHT 11 DHT_Unified dht(DHTPIN, DHTTYPE); uint32_t delayMS; void setup() { Serial.begin(9600); dht.begin(); sensor_t sensor; delayMS = sensor.min_delay / 1000; } void loop() { double temp; double humid; delay(delayMS); sensors_event_t event; dht.temperature().getEvent(&event); if (!isnan(event.temperature)) { temp = event.temperature; } dht.humidity().getEvent(&event); if (!isnan(event.relative_humidity)) { humid = event.relative_humidity; } Serial.println(temp); Serial.println(humid); } |
基本的にサンプルスケッチから不要と思われる部分を削除しただけです。
温度を「temp」、湿度を「humid」という、それぞれdouble型の変数に代入し、数字だけをシリアル通信でPCに送るようにしてみました。
最終的にはシリアル通信でPCではなくRaspberryPiに送って、IoTサービスにデータをアップロードしていく、という流れになります。
最終的にはながーいケーブルで屋外にまで引き回して使いますが、ひとまずブレッドボード上での動作確認はこれでOK。
とりあえず温度・湿度が測定できるようになりました。
まだまだ続きます。
コメント