
ESP32とDHT11を使って温度と湿度を測定し、AWS Lambda経由でX(Twitter)に投稿する
Freenove ESP32-WROOMボードとDHT11温湿度センサーを使用して、環境の温度と湿度を測定し、そのデータをAWS Lambdaを介してX(Twitter)に自動投稿してみました。
このプロジェクトを通じて、IoTデバイスからクラウドへのデータ送信やサーバーレスアーキテクチャの活用、さらにはソーシャルメディアとの連携方法について学べました。
必要な材料
- Freenove ESP32-WROOMボード
- DHT11温湿度センサー
- ジャンパーワイヤー
チャレンジ!
ステップ 1: ハードウェアのセットアップ
- DHT11センサーのVCCピンをESP32の3V3ピンに接続し、DHT11のデータピンをESP32の任意のデジタルピン(例: GPIO 4)に接続しました。
- DHT11のGNDピンをESP32のGNDピンに接続しました。

ステップ 2: ESP32のプログラミング
ESP32に以下の機能を実装します。
- WiFiを介してインターネットに接続
- DHT11センサーから温度と湿度を1時間ごとに読み取る
#include <WiFi.h>
#include <HTTPClient.h>
#include "DHT.h"
#define DHTPIN 4
#define DHTTYPE DHT11
const char* ssid = "wifiの名前";
const char* password = "wifiのパスワード";
const char* awsEndpoint = "次のステップのAPI Gatewayで作成したURL";
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
dht.begin();
}
void loop() {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
} else {
if(WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(awsEndpoint);
http.addHeader("Content-Type", "application/json");
String payload = "{\"temperature\": " + String(temperature) + ", \"humidity\": " + String(humidity) + "}";
Serial.println(payload);
int httpResponseCode = http.POST(payload);
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println(httpResponseCode);
Serial.println(response);
} else {
Serial.print("Error on sending POST: ");
Serial.println(httpResponseCode);
}
http.end();
} else {
Serial.println("WiFi Disconnected");
}
}
delay(3600000); // Wait for 1 hour (3600000 milliseconds)
}
ステップ 3: AWS Lambda関数の設定
AWS Lambda関数を作成し、受け取った温度と湿度のデータをX(Twitter)に投稿する処理を実装します。以下のプログラムをzip圧縮し、Lambdaにアップロードしました。
$ zip -r project.zip *
// Node.js index.mjs
import { TwitterApi } from 'twitter-api-v2';
import dotenv from 'dotenv';
dotenv.config();
const twitterClient = new TwitterApi({
appKey: process.env.TWITTER_API_KEY,
appSecret: process.env.TWITTER_API_SECRET,
accessToken: process.env.TWITTER_ACCESS_TOKEN,
accessSecret: process.env.TWITTER_ACCESS_SECRET,
});
export async function handler(event) {
if (!event.body) {
console.log('fail')
return
}
const body = JSON.parse(event.body)
const temperature = body.temperature;
const humidity = body.humidity;
const generatedText = `現在、気温${temperature}度, 湿度${humidity}%だよ!`;
try {
await twitterClient.v2.tweet(generatedText);
return {
statusCode: 200,
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
message: "Data received successfully",
temperature,
humidity
})
};
} catch (error) {
console.error('Error:', error);
return { statusCode: 500, body: 'Error posting tweet' };
}
};
ステップ 4: AWS API Gatewayの設定
AWS API Gatewayを設定して、ESP32からのHTTPリクエストを受け取り、Lambda関数に転送します。Lambdaにアップロード後、環境変数としてTWITTER_API_KEYなどを設定しました。

API GatewayのURLを取得し、ESP32のプログラムのawsEndpoint変数にURLを設定します。
ステップ 5: X(Twitter)に投稿する
curlで以下のようにテストできます。
$ curl -X POST https://APIGatewayで作成したURL -H "Content-Type: application/json" -d '{"temperature": "22.9", "humidity": "61"}'
無事に投稿できました!

結論
このプロジェクトを通じて、ESP32とDHT11センサーを使用して温度と湿度のデータを取得し、AWS LambdaとAPI Gatewayを活用してデータをクラウドに送信、最終的にソーシャルメディアにそのデータを共有する方法を学べました。
ここまでお読みくださりありがとうございました!















