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)に投稿する処理を実装します。

このステップでは、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の作成を行います。

特に設定はなにもせず、クロスオリジンリソースだけ以下のようにしました。

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の設定は以上です。

では、いよいよESP32側にプログラムをアップロードし実行します。

Airdunio IDEとESP32を接続してアップロードしました!

なんと

無事に投稿できました!

このプロジェクトを通じて、ESP32とDHT11センサーを使用して温度と湿度のデータを取得し、AWS LambdaとAPI Gatewayを活用してデータをクラウドに送信、最終的にソーシャルメディアにそのデータを共有する方法を学べました。

IoTデバイスからのデータ収集とクラウドコンピューティングの力を組み合わせることで、実世界のデータをリアルタイムで共有し、活用する幅広い可能性が広がりますね!

ここまで、お読みくださりありがとうございました!