ESP32+DHT22でWiFi経由の温湿度取得APIを作る(Arduino)
本記事では、ESP32 Devkitを使用して
WiFi経由で温湿度を取得する簡単なIoTシステムを作成する方法を紹介します。
ESP32はWiFiが標準搭載で安く、Arduino環境で簡単に開発でき、使いやすいと思います。
※本記事はローカルネットワーク内での利用を想定しています
1.この記事でできること
ESP32 DevKitと温湿度センサーを使用し、
WiFi経由で温湿度を取得できる簡単なAPIを作成します。
最終的には以下のようにHTTPアクセスすると
温湿度データがJSON形式で取得できます。
2.使用機材(購入品)
・ESP32
・ブレッドボード
・温湿度センサー(DHT22)
このほかに抵抗やジャンパワイヤを使用しました。
3.開発環境
ESP32にプログラムを書き込むためには
Arduino IDE のインストールと環境構築が必要です。
この部分については既に多くの解説記事があるため,以下の記事を参考にしました。
参考記事
マイコンESP32にArduinoIDEでプログラムを書き込んで実行するまでの手順
上記記事の手順を進めると、ESP32へプログラムを書き込める状態になります。
4.システム構成
DHT22 → ESP32 → WiFi → WebAPI → PC
といった形で,WiFi経由で温湿度の確認ができるようにしていきます。
5.配線
DHT22は以下のように接続します。
- VCC → 3.3V
- GND → GND
- DATA → GPIO4
以下のような感じです
(使用しているPINの番号が違うのは、PIN配置が実物と異なるためです)

6.プログラム
実際にESP32に書き込むプログラム
#include <WiFi.h>
#include "DHT.h"
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
const char* ssid = "○○○";
const char* password = "△△△";
// 固定IP
IPAddress local_IP(192,168,0,50);
IPAddress gateway(192,168,0,1);
IPAddress subnet(255,255,255,0);
IPAddress dns(8,8,8,8);
WiFiServer server(80);
void setup() {
Serial.begin(115200);
dht.begin();
if (!WiFi.config(local_IP, gateway, subnet, dns)) {
Serial.println("設定失敗");
}
WiFi.begin(ssid, password);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Connected IP: ");
Serial.println(WiFi.localIP());
server.begin();
}
void loop() {
WiFiClient client = server.available();
if (!client) return;
Serial.println("Client connected");
String request = client.readStringUntil('\r');
client.flush();
Serial.println(request);
if (request.indexOf("GET /sensor") >= 0) {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
if (isnan(humidity) || isnan(temperature)) {
humidity = 0;
temperature = 0;
}
String json = "{";
json += "\"temperature\":";
json += String(temperature,1);
json += ",";
json += "\"humidity\":";
json += String(humidity,1);
json += "}";
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println("Connection: close");
client.println();
client.println(json);
}
else {
client.println("HTTP/1.1 404 Not Found");
client.println();
}
delay(1);
client.stop();
Serial.println("Client disconnected");
}
6-1. WiFi接続
WiFi.begin(ssid, password);
ここでWiFiに接続します。
ルーターの名称と,パスワードです。
6-2. Webサーバー起動
WiFiServer server(80);
ポート80でHTTPサーバーを起動しています。
6-3. センサー取得
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
センサーから温湿度を取得します。
6-4. JSONレスポンス
{
"temperature": 25.3,
"humidity": 60.1
}
この形式でクライアントへ返しています。
6-5.使用するピンについて
#define DHTPIN 4
ESP32でデータを取るためにDHT22とつないで使用するピンは,
電源を取るピンと,GNDのピンのある側面のピンから選択するとよい.
(必須ではありません)
7.動作確認
実際にESP32にプログラムを書き込んだ後、ブラウザで以下にアクセスします。
そうすると、以下のように温度と湿度が確認できます。
8.躓いた点
IPアドレスについて
IPアドレスは、192,168,0,50としていますが、これは通信する際に、通信元が192.168.0.XXのような場合でのみ通信できます。
そのため、動作確認できないときは,ここが違うかもしれません。
(サブネットマスクを変えたらその限りではないですが,今回は割愛します)
IPアドレスはコマンドプロンプトを開いてipconfigで確認できます!
いま,PCのIPアドレスを確認したところ192.168.0.247だったので通信できます。

やっておくと便利な点
ESP32の使用するピンは可能であれば片側のみで済ませる。
片側で済ませると,ブレッドボードの大きさが小さくても配線できる。
(今回のリンクで紹介しているブレッドボード一ではESP32のピンを両側使えませんでした)
まとめ
ESP32を使用することで、
WiFi経由で温湿度データを取得する簡単なIoTデバイスを作成することができました。
次はC#(Blazor)を使用したWebアプリから
このセンサーを取得する仕組みを作成予定です。
