DHT11とESP32で実現!自宅で作るIoT温湿度計測システム

ThingSpeakという面白そうなサービス見つけたので、遊んでみることにしました。このプロジェクトでは、ESP32マイクロコントローラーとDHT11温湿度センサーを組み合わせて、環境データをリアルタイムで監視します。

ThingSpeakを使用して、センサーからのデータをリアルタイムでグラフにすることで、温度と湿度の変化を直感的に追跡できます。

プロジェクトの準備

このセクションでは、IoTプロジェクトを開始するために必要なパーツとサービスについて説明します。

必要なパーツ:

  • ・ESP32 devkitc v1
  • ・DHT11
  • ・ブレッドボード
  • ・ジャンプワイヤー
  • ・抵抗(5.16 kOhms 1%)
ESP32とDHT11の配線図

ESP32とDHT11センサーの配線図

利用したサービス:

データの視覚化と監視には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ライブラリ

  • WiFi.mode():
    WiFi.mode(mode)でESP32のWiFiモードを設定します。modeにはWIFI_STA(ステーションモード)、WIFI_AP(アクセスポイントモード)、WIFI_AP_STA(両方のモード)があります。
    例: WiFi.mode(WIFI_STA)でESP32をステーションモードに設定します。
  • WiFi.status():
    WiFi.status()で現在のWiFi接続状態を確認します。戻り値は接続状態を表す定数です。
    例: if(WiFi.status() != WL_CONNECTED)でWiFiが未接続かどうかを確認します。
  • WiFi.begin(SECRET_SSID, SECRET_PASS):
    WiFi.begin(ssid, pass)で指定されたSSIDとパスワードを使用してWiFiネットワークに接続します。
    例: WiFi.begin("mySSID", "myPassword")でmySSIDというネットワークにmyPasswordを使って接続します。

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にアップロードした実際の結果です。これにより、環境の変化を視覚的に確認することができます。

ThingSpeakのデータチャート

ThingSpeakにおける温度と湿度のリアルタイムデータチャート