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