ESP32とDHT11を使って温度と湿度を測定し、AWS Lambda経由でX(Twitter)に投稿する
![](https://firebasestorage.googleapis.com/v0/b/webdevelopers-1886f.appspot.com/o/images%2Fxx-1.webp?alt=media&token=d26128ba-31e2-4a55-b9c4-a5de4c2493a3)
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ピンに接続しました。
![](https://firebasestorage.googleapis.com/v0/b/webdevelopers-1886f.appspot.com/o/images%2FIMG_5442.webp?alt=media&token=69d8c76e-680d-4613-9d27-1748e913dce2)
ステップ 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)に投稿する処理を実装します。
このステップでは、AWS LambdaとX(Twitter) APIの連携方法について説明します。
AWS Lambdaに以下のプログラムを下記のコマンドでzip圧縮し、アップロードしました。
$ zip -r project.zip *
// Node.js index.mjs
import { TwitterApi } from 'twitter-api-v2';
import dotenv from 'dotenv';
dotenv.config();
// 環境変数からAPIキーを取得
const twitterApiKey = process.env.TWITTER_API_KEY;
const twitterApiSecret = process.env.TWITTER_API_SECRET;
const twitterAccessToken = process.env.TWITTER_ACCESS_TOKEN;
const twitterAccessSecret = process.env.TWITTER_ACCESS_SECRET;
const twitterClient = new TwitterApi({
appKey: twitterApiKey,
appSecret: twitterApiSecret,
accessToken: twitterAccessToken,
accessSecret: twitterAccessSecret,
});
// POSTのみ
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などの環境変数を設定しました。
そして、「設定」の「トリガー」よりAWS API Gatewayの作成を行います。
特に設定はなにもせず、クロスオリジンリソースだけ以下のようにしました。
![](https://firebasestorage.googleapis.com/v0/b/webdevelopers-1886f.appspot.com/o/images%2Fxx-ss.webp?alt=media&token=5c2c64ff-7c13-4219-8b51-e755bc81e062)
AWS API GatewayのURLが発行されたらESP32のプログラムのawsEndpoint変数
にURLを入力します。
ステップ 5: X(Twitter)に投稿するLambda関数が正しく設定され、API Gateway経由で呼び出されると、温度と湿度のデータがX(Twitter)に投稿されます。
ここでためしにcurlでテストしてみます。以下のコマンドを入力しました。
$ curl -X POST https://APIGatewayで作成したURL -H "Content-Type: application/json" -d '{"temperature": "22.9", "humidity": "61"}'
投稿できました!Lambdaの設定は以上です。
![](https://firebasestorage.googleapis.com/v0/b/webdevelopers-1886f.appspot.com/o/images%2F%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202024-04-05%2011.07.30.png?alt=media&token=0803a124-c078-4627-afd2-aeab4bfe51b9)
では、いよいよESP32側にプログラムをアップロードし実行します。
Airdunio IDEとESP32を接続してアップロードしました!
なんと
無事に投稿できました!
![](https://firebasestorage.googleapis.com/v0/b/webdevelopers-1886f.appspot.com/o/images%2F%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202024-04-05%2011.12.13.png?alt=media&token=e8c0e6db-6e59-4041-92ad-23bfdb9c3c68)
このプロジェクトを通じて、ESP32とDHT11センサーを使用して温度と湿度のデータを取得し、AWS LambdaとAPI Gatewayを活用してデータをクラウドに送信、最終的にソーシャルメディアにそのデータを共有する方法を学べました。
IoTデバイスからのデータ収集とクラウドコンピューティングの力を組み合わせることで、実世界のデータをリアルタイムで共有し、活用する幅広い可能性が広がりますね!
ここまで、お読みくださりありがとうございました!