前回までは温度センサーを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まかせになっているので段々ズレが発生していますね。
そとから自宅の室温を確認するには特に困りませんが、気にはなるのでおいおい直していきましょう!
今回はここまでです!
0 件のコメント:
コメントを投稿