Seeed Studio XIAO_ESP32C3 : レンタルサーバー に POST 2022/12/05
2022/12/05 PHP にメール送信を追加
■概要
XIAO ESP32C3 については→こちら(スイッチサイエンス)
WiFi に接続した ESP32C3 から 温度、湿度、露点温度の3つのデータをレンタルサーバーに POST し、CSV ファイルに保存します。
テストのため、計測データは固定値を使っています。
実装する場合は body = "temp=12.3&humi=45.6&dewp=78.9" の文字列をプログラムで測定データに変更する必要があります;。
■XIAO ESP32C3 側
「なごるふ」様の 【Arduino】ESP32でHTTP(POST)を試してみる そのままです。
#include <WiFi.h> const int httpPort = 80; const char* ssid = "TP-LINK_77A4"; const char* password = "36417315"; const char* host = "izawa-web.com"; String path = "/posttemp.php"; String body = "temp=12.3&humi=45.6&dewp=78.9";// テスト用のダミーデータ(複数の場合は & で追加) void setup() { Serial.begin(115200); Serial.print("Connecting to "); Serial.println(ssid); // 接続先設定 WiFi.begin(ssid, password); // 接続完了まで待機 while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } // 接続完了 Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void loop() { delay(5000); Serial.print("connecting to "); Serial.println(host); // 接続 WiFiClient client; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // リクエスト(POST) client.print("POST " + path + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Content-Type:application/x-www-form-urlencoded\r\n" + "Content-Length:" + String(body.length()) + "\r\n" + "Connection: close\r\n\r\n" + body); // リクエスト(GET). // client.print("GET " + path + "?" + body + " HTTP/1.1\r\n" + // "Host: " + host + "\r\n" + // "Connection: close\r\n\r\n"); // 一定時間レスポンスがなければタイムアウト. unsigned long timeout = millis(); while (client.available() == 0) { if (millis() - timeout > 5000) { Serial.println(">>> Client Timeout !"); client.stop(); return; } } // レスポンスを表示 while(client.available()) { String line = client.readStringUntil('\r'); Serial.print(line); } Serial.println(); client.stop(); Serial.println("closing connection"); }
■サーバー側 ESP32C3 から POST データを受け取り CSV ファイルに保存 posttemp.php
2022/12/05 : メール送信を追加
<?php // ESP32 から POST されるデータを CSV ファイルに保存する $temp = htmlspecialchars($_POST['temp'], ENT_QUOTES); $humi = htmlspecialchars($_POST['humi'], ENT_QUOTES); $dewp = htmlspecialchars($_POST['dewp'], ENT_QUOTES); // メールアドレスを受け取る $mlto = htmlspecialchars($_POST['mlto'], ENT_QUOTES); //$mlto = "f.izawa@dream.com"; // データを配列に $array = [date('Y/m/d H:i:s'), $temp, $humi, $dewp]; // 保存用データ $fp = fopen("logtemp.csv", "a"); // 追加 fputcsv($fp, $array);// CSV で保存 fclose($fp); // 表示用データ1行のみ $fp = fopen("viewtemp.csv", "w"); // 作成 fputcsv($fp, $array);// CSV で保存 fclose($fp); // メール送信 if ($mlto <> ""){ $subject = "TEST"; $message = "This is TEST."; $headers = "From : Seeed XIAO_ESP32C3"; mb_language("japanese"); mb_internal_encoding("UTF-8"); mb_send_mail($mlto, $subject, $message, $headers); }; // ESP32 に返す(確認できるように) var_dump($array) ?>
■作成された CSV ファイル logtemp.csv
■サーバー側 CSV ファイルを読み、ブラウザに表示(5秒間隔で更新) viewtemp.php
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <?php header("refresh: 5;"); // 現在の日時表示 echo date('Y/m/d H:i:s')."<br/>\n"; $f = fopen("viewtemp.csv", "r"); $data = fgetcsv($f); fclose($f); ?> <h1>温湿度計測</h1> <p>時刻:<?php echo $data[0] ?> </p> <p>温度:<?php echo $data[1] ?> ℃</p> <p>湿度:<?php echo $data[2] ?> %RH</p> <p>露点:<?php echo $data[3] ?> ℃DP</p> <?php header("refresh: 5;") ?> </body> </html>■ブラウザで最新のデータを確認