ラベル ESP32 の投稿を表示しています。 すべての投稿を表示
ラベル ESP32 の投稿を表示しています。 すべての投稿を表示

2025/07/19

ESP32とDHT11で自宅温湿度を測定してGoogleスプレッドシートに自動書込み

前回までは温度センサーをMCP9701を使用しておりましたが、今回はDHT11を使用します。
なぜセンサーを変えたかって?なんか精度があまり芳しくないからです。
センサーからの出力を温度に変換する計算式を考慮すれば改善するかもですが、、、
面倒くさいので止めました!

ということで今回はDHT11を使用するのですが、このセンサーは温度と湿度を両方測定することが可能です。

また、今回の新しいこととして、測定した値をGoogleスプレッドシートに送信して日時とともにセンシングした値を入力させます。

さらに今回は新たにAIにコーディングさせてみました。
使用したのはGemini 2.5flashになります。

入力したプロンプトは以下になります。

ESP32で取得した温度湿度のデータをGoogleのスプレッドシートにその日時と一緒に順次記載していく方法はある?

たったこれだけ!で回答をくれるのですからすごい時代ですね。
ちなみに回答されたコードは以下になります。
①Googleスプレッドシート向け

// doPost関数は、HTTP POSTリクエストがこのWebアプリケーションに送信されたときに実行されます。
function doPost(e) {
  // スプレッドシートのIDを取得します。
  // ここをあなたのスプレッドシートのIDに置き換えてください。
  // スプレッドシートのURL (https://docs.google.com/spreadsheets/d/YOUR_SPREADSHEET_ID/edit#gid=0) から取得できます。
  var SPREADSHEET_ID = "あなたのスプレッドシートIDをここに貼り付け"; 
  var sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getActiveSheet();
  // POSTリクエストのパラメータを取得します。
  // ESP32から 'temp' と 'humidity' という名前でデータが送られてくることを想定しています。
  var temperature = e.parameter.temp;
  var humidity = e.parameter.humidity;
  // 現在の日時を取得します。
  var timestamp = new Date();
  // スプレッドシートの最終行に新しいデータを追加します。
  sheet.appendRow([timestamp, temperature, humidity]);
  // 成功レスポンスを返します。
  return ContentService.createTextOutput("Data logged successfully").setMimeType(ContentService.MimeType.TEXT);
}


②ESP32向け

#include <WiFi.h>
#include <HTTPClient.h>
#include "DHT.h" // DHTセンサーを使用する場合
// Wi-Fi設定
const char* ssid = "あなたのWi-Fi SSID";
const char* password = "あなたのWi-Fi パスワード";
// Google Apps ScriptのウェブアプリURL
// ステップ2でコピーしたURLをここに貼り付け
const char* gasUrl = "ここにGoogle Apps ScriptのウェブアプリURLを貼り付け";
// DHTセンサー設定 (DHT11の場合)
#define DHTPIN 4      // DHTセンサーが接続されているESP32のGPIOピン番号
#define DHTTYPE DHT11 // DHT11またはDHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(115200);
  dht.begin(); // DHTセンサー初期化
  // Wi-Fi接続
  Serial.print("Connecting to WiFi: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected.");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());
}
void loop() {
  delay(5000); // 5秒ごとにデータを送信
  // センサーから温度と湿度を読み取る
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  // 読み取りに失敗した場合
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C, Humidity: ");
  Serial.print(h);
  Serial.println(" %");
  // HTTP POSTリクエストを送信
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin(gasUrl);
    http.addHeader("Content-Type", "application/x-www-form-urlencoded");
    // POSTデータを作成
    String httpRequestData = "temp=" + String(t) + "&humidity=" + String(h);
    Serial.print("Sending data: ");
    Serial.println(httpRequestData);
    int httpResponseCode = http.POST(httpRequestData);
    if (httpResponseCode > 0) {
      Serial.print("HTTP Response code: ");
      Serial.println(httpResponseCode);
      String response = http.getString();
      Serial.println(response);
    } else {
      Serial.print("Error code: ");
      Serial.println(httpResponseCode);
    }
    http.end();
  } else {
    Serial.println("WiFi Disconnected. Reconnecting...");
    WiFi.begin(ssid, password);
    // 再接続ロジックをここに追加することもできます
  }
}

以上のコードをから物理的には以下のような構成にしました。
すごくシンプルです。


あとはGeminiに指示しなかったから5秒毎に温湿度を送信するプログラムになってしまったのでそれを30分毎に修正して、コンパイル!

こまごまとしたエラーが出ましたが解決してGoogleスプレッドシートに書かれた結果はこんな感じです。


ご覧の通り温度湿度をGoogleスプレッドシートにとりあえず送信することが出来ました。
ただ、30分のカウントがESP32まかせになっているので段々ズレが発生していますね。

そとから自宅の室温を確認するには特に困りませんが、気にはなるのでおいおい直していきましょう!

今回はここまでです!

2022/02/27

ESP32とMCP9701で温度測定

今回も前回に引続きESP32に挑戦していきます。
今回はスタートブックの3章からです。

書籍に記載あった温度センサは我が家の在庫に無かったので
家にあった似たような温度センサMCP9701を使います。

前回のLED同様にESP32の25Pinに温度センサの出力を接続します。
本来はノイズ対策にコンデンサ0.1μFを挟むべきとのことですが今回は無しです。

作成したコードは以下の通りですが、
スタートブックは温度のみを出力する仕様でしたが、
私はセンサ出力値(AD変換後生値)、センサ電圧値(計算値)、温度(計算値)を出力します。

//ESP32とMCP9701(温度センサ)で温度測定
#define sensor 25 //"sensor"を25に固定

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);   //シリアル通信の初期設定
  while(!Serial);         //シリアル通信が可能になるまで繰り返す
  pinMode(sensor,INPUT);  //sensor(25)を入力モードに切替える

}

void loop() {
  // put your main code here, to run repeatedly:
  int e = analogRead(sensor);   //センサからのアナログ値を読取り
 
  float Vout = 3.3 / 4095 * e + 0.1132;    //補正式から電圧を補正:分解能の読取り最大値 ÷ ESP32の分解能 × センサ入力値 + ESP32の補正値 
 
  float temp = (Vout - 0.5) / 0.01;          //電圧から温度に変換:
 
  Serial.print("V =");
  Serial.println(e);                     //補正前の電圧を出力
  Serial.print("Volt =");
  Serial.println(Vout);                     //補正後の電圧を出力
  Serial.print("tenmp =");
  Serial.println(temp);                     //温度を出力
  delay(1000);

}

コードは以上です。

出力を温度以外にもしたのは、何故か温度が正しく出力させなかったのです。
(-30℃くらい出力されました。。。)

原因はセンサ値から電圧+補正の計算を書籍通り
float Vout = e / 4095 * 3.3 + 0.1132;で実施したところ
何故か計算を実施しなかった点です。
そのため計算式を下記のようのに書換えました。
float Vout = 3.3 / 4095 * e + 0.1132;
順番を変えただけですが、上手くいきました。
なぜでしょうね?
まぁ、動いたからヨシッ!

次回はついにネットワークへの接続に挑戦です。

2022/02/19

ESP32 挑戦!! 環境設定とLチカ

 本日はESP32に挑戦!!
まぁ、購入してから、ずっと放置していたので手を付けます。

参考にしたのはこちらの書籍です。

IoT開発スタートブック ── ESP32でクラウドにつなげる電子工作をはじめよう!

では始めて行きましょう!

開発環境はArduino IDEです。
インストールは済なのでここはカット。。。
ボードの設定は必要なようですね。

「ファイル」→「環境設定」追加のボードマネージャのURLに
”https://dl.espressif.com/dl/package_esp32_index.json”を追加してOK。

「ツール」→「ボード」→「ボードマネージャ」から”ESP32”をインストール。

「ボードマネージャ」から”ESP32 Dev modul”を選択
以上で環境設定は完了!

では、プログラムのテストは定番のLチカです。
コードはこんな感じ

void setup() {
  // put your setup code here, to run once:
  pinMode(25, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(25,HIGH);
  delay(500);
  digitalWrite(25,LOW);
  delay(500);
}

ではさっそくコンパイルして、書き込みとしたのですが、
書き込めませんね。


ネットで少し調べてみると他の方も同じような状態の方が
いらっしゃいますね。
で、解決法はいろいろな方法があるようですが、
書き込み中にBOOTボタンの押しっぱなしで書き込みが出来ました。


で、Lチカも問題なしです。


とりあえず、本日はここまでです。

IoT開発スタートブックの第2章まで完です。

ではまた~



技術書典20 を振り返って

 オンラインがまだ続いている中ではありますが、2026年4月12日に開催されたオフラインでの振り返りを少々しようと思います。  今回の原稿の準備についてですが、今までと同様にRe:view Starterを使用していたのですが、今までと大きく変えたのがローカルドライブでは無くOn...