DHT11とESP32で実現!自宅で作るIoT温湿度計測システム
ThingSpeakという面白そうなサービス見つけたので、遊んでみることにしました。このプロジェクトでは、ESP32マイクロコントローラーとDHT11温湿度センサーを組み合わせて、環境データをリアルタイムで監視します。
ThingSpeakを使用して、センサーからのデータをリアルタイムでグラフにすることで、温度と湿度の変化を直感的に追跡できます。
プロジェクトの準備
このセクションでは、IoTプロジェクトを開始するために必要なパーツとサービスについて説明します。
必要なパーツ:
- ・ESP32 devkitc v1
- ・DHT11
- ・ブレッドボード
- ・ジャンプワイヤー
- ・抵抗(5.16 kOhms 1%)
利用したサービス:
データの視覚化と監視にはThingSpeakを使用しました。これはIoTデバイスからのデータを収集し、グラフ化することができるクラウドベースのサービスです。
ソースコード
#include <WiFi.h> // WiFi機能を利用するためのライブラリ
#include <DHT.h> // DHTセンサーを利用するためのライブラリ
#include "secrets.h" // WiFi接続情報とThingSpeakのAPIキーを含む秘密情報
#include "ThingSpeak.h" // ThingSpeakライブラリ
#define DHTPIN 22 // DHTセンサーが接続されているピンの番号
#define DHTTYPE DHT11 // 使用するDHTセンサーのタイプを指定
DHT dht(DHTPIN, DHTTYPE); // DHTセンサーのインスタンスを作成
WiFiClient client; // WiFiクライアントのインスタンスを作成
void setup() {
Serial.begin(115200); // シリアル通信の初期化
dht.begin(); // DHTセンサーの初期化
WiFi.mode(WIFI_STA); // WiFiをステーションモードに設定
ThingSpeak.begin(client);// ThingSpeakの初期化
}
void loop() {
// WiFi接続が切れている場合は再接続を試みる
if (WiFi.status() != WL_CONNECTED) {
Serial.print("接続中 ");
Serial.println(SECRET_SSID);
WiFi.begin(SECRET_SSID, SECRET_PASS); // WiFiに接続
while (WiFi.status() != WL_CONNECTED) {
delay(5000); // 接続が完了するまで待機
Serial.print(".");
}
Serial.println("\\n接続完了");
}
float temp = dht.readTemperature(); // 温度を読み取る
float humi = dht.readHumidity(); // 湿度を読み取る
Serial.print("温度: ");
Serial.print(temp);
Serial.print("[℃]");
Serial.print(" 湿度: ");
Serial.print(humi);
Serial.println("[%]");
// ThingSpeakのフィールドにデータを設定
ThingSpeak.setField(1, temp);
ThingSpeak.setField(2, humi);
// ThingSpeakにデータを送信
int x = ThingSpeak.writeFields(SECRET_CH_ID, SECRET_WRITE_APIKEY);
if (x == 200) {
Serial.println("データ送信成功");
} else {
Serial.println("送信エラー: HTTPステータスコード " + String(x));
}
delay(20000); // 20秒待機し、次の測定までの間隔を設ける
}
追加ファイル: secrets.h
プロジェクトには別途secrets.h
ファイルが必要です。このファイルにはWiFi接続情報とThingSpeakのAPIキーを定義します。このファイルは同一フォルダー内に作成してください。
// WiFiの設定
#define SECRET_SSID "********" // WiFiのSSID
#define SECRET_PASS "********" // WiFiのパスワード
// ThingSpeakの設定
#define SECRET_CH_ID ******** // ThingSpeakのチャンネルID
#define SECRET_WRITE_APIKEY "********" // ThingSpeakのWrite APIキー
Arduino標準ライブラリ
- Serial.begin():
Serial.begin(speed)でシリアル通信を初期化します。speedは通信速度(ボーレート)をボーで指定します。
例: Serial.begin(115200)は115200 bpsでシリアル通信を開始します。 - delay(milliseconds):
delay(ms)でプログラムの実行を指定されたミリ秒数だけ一時停止します。
例: delay(5000)は5秒間プログラムを一時停止します。
ESP32 WiFiライブラリ
DHTセンサーライブラリ
- dht.begin():
dht.begin()でDHTセンサーを初期化します。
例: 初期化後にセンサーからデータを読み取ることができます。 - dht.readTemperature():
dht.readTemperature()でセンサーから温度データを読み取ります。摂氏温度が戻り値です。
例: float temp = dht.readTemperature()で温度を変数tempに保存します。 - dht.readHumidity():
dht.readHumidity()でセンサーから湿度データを読み取ります。湿度のパーセンテージが戻り値です。
例: float humidity = dht.readHumidity()で湿度を変数humidityに保存します。
ThingSpeakライブラリ
- ThingSpeak.begin(client):
ThingSpeak.begin(client)でThingSpeak通信の初期化を行います。clientはWiFiClientのインスタンスです。
例: ThingSpeak.begin(client)でThingSpeakへの接続準備が整います。 - ThingSpeak.setField(field, data):
ThingSpeak.setField(field, data)でThingSpeakの特定のフィールドにデータを設定します。fieldはフィールド番号、dataは送信するデータです。
例: ThingSpeak.setField(1, temperature)でフィールド1に温度データを設定します。 - ThingSpeak.writeFields(SECRET_CH_ID, SECRET_WRITE_APIKEY):
ThingSpeak.writeFields(channelNumber, writeAPIKey)で設定されたフィールドのデータをThingSpeakに送信します。channelNumberはチャンネルID、writeAPIKeyはAPIキーです。
例: ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey)でデータをThingSpeakに送信します。
出力結果
以下のチャートは、ESP32とDHT11センサーから取得した温度と湿度のデータをThingSpeakにアップロードした実際の結果です。これにより、環境の変化を視覚的に確認することができます。