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>
■ブラウザで最新のデータを確認
