私一応DBエンジニアをしておりまして、ESP8266でやりたかったのがまさに表題の件です。これを実装するだけでもかなり応用の幅が広がるとおもいませんか?この実装しながらワクワクがとまりませんでした。今回の記事ではESP8266に温度計センサーを実装したと仮定してその温度データをhttp通信でPostしPHPでSQLを発行してMySQLのテーブルに追加するという内容です。
やりたいこと
- 仮温度データをESP8266をWifiに接続し、レンタルサーバ上のPHPに送信(httpPost)する。
- PHPでは受け取った仮温度データをMySQL上のテーブルにSQLでレコード追加する。
ESP8266からレンタルサーバ上のファイルに温度を書き込みたい!ということです。
処理概要
全体
ESP8266から温度データを送信してレンタルサーバ内のテーブルにレコードを追加する。
ESP8266側
- Wifiに接続する
- 温度データを内部で送信用に準備する(今回は仮の固定数値を使います)
- 送信データをPHPにPOSTする
- 10秒間隔でPOSTを繰り返す
レンタルサーバ側
- PHPでデータを受信する
- 受け取ったデータをSQLでテーブルにInsertする
ESP8266側実装コード
/*
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
/* Set these to your desired credentials. */
const char *ssid = "SSID"; //ENTER YOUR WIFI SETTINGS
const char *password = "パスワード";
//Web/Server address to read/write from
//const char *host = "xxxxxxxx.さくら.net"; //https://circuits4you.com website or IP address of server
//=======================================================================
// Power on setup
//=======================================================================
void setup() {
delay(1000);
Serial.begin(115200);
WiFi.mode(WIFI_OFF); //Prevents reconnection issue (taking too long to connect)
delay(1000);
WiFi.mode(WIFI_STA); //This line hides the viewing of ESP as wifi hotspot
WiFi.begin(ssid, password); //Connect to your WiFi router
Serial.println("");
Serial.print("Connecting");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
//If connection successful show IP address in serial monitor
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); //IP address assigned to your ESP
}
//=======================================================================
// Main Program Loop
//=======================================================================
void loop() {
HTTPClient http; //Declare object of class HTTPClient
String postData,watasuData;
//int adcvalue=analogRead(A0); //Read Analog value of LDR
//ADCData = String(adcvalue); //String to interger conversion
//station = "A";
//Post Data
int watasuValue = 54;
watasuData = String(watasuValue);
//postData = "status=" + ADCData + "&station=" + station ;
postData = "ondoDataPara=" + watasuData ;
http.begin("http://xxxxxx.さくら.ne.jp/ほにゃらら.php?"); //Specify request destination
http.addHeader("Content-Type", "application/x-www-form-urlencoded"); //Specify content-type header
int httpCode = http.POST(postData); //Send the request
String payload = http.getString(); //Get the response payload
Serial.println("*****");
Serial.println(httpCode); //Print HTTP return code
Serial.println("*****");
Serial.println(payload); //Print request response payload
Serial.println("*****");
http.end(); //Close connection
delay(10000); //Post Data at every 10 seconds
}
setup()でWifiに接続します
loop()で仮データをhttpでPOSTし、この処理を10秒間隔で繰り返します。
レンタルサーバ側 テーブル設計とサンプルコード
テーブル設計
テーブル設計 テーブルは必要最低限の項目のみとしています。
PHP コード
サーバ側の環境は皆様のものとは異なるため伏字・xxx等にしておりますが、わかりやすいかと思います。
<?php
$uketoriOndo = $_POST['ondoDataPara'];
// データベースに接続するために必要なデータソースを変数に格納
// mysql:host=ホスト名;dbname=データベース名;charset=文字エンコード
$dsn = 'mysql:host=mysqlxxxx.db.xxxxx.ne.jp;dbname=データベース名;charset=utf8';
// データベースのユーザー名
$user = 'データベースアクセスユーザー名';
// データベースのパスワード
$password = 'アクセスパスワード';
// tryにPDOの処理を記述
try {
// PDOインスタンスを生成
$dbh = new PDO($dsn, $user, $password);
// エラー(例外)が発生した時の処理を記述
} catch (PDOException $e) {
// エラーメッセージを表示させる
echo 'データベースにアクセスできません!' . $e->getMessage();
// 強制終了
exit;
}
// SELECT文を変数に格納
$sql = "INSERT INTO テーブル名 (temperatureField) VALUES ($uketoriOndo)";
// SQLステートメントを実行し、結果を変数に格納
$stmt = $dbh->query($sql);
?>
テーブル内容確認
temperatureFieldに送信した数値がセットされており、タイムスタンプでそれが確認できる。
まとめ
ESP8266側のコーディングもライブラリのサンプルを用いれば変更も簡単でわかりやすかったと思います。エラー制御等はこの記事では実装していませんが接続不可の場合のみでもいいんじゃないでしょうか?あとはサーバ側でなんとかできればOKでしょう。
サーバ側はPHPのコードも簡単ですし負荷も高くないので問題ないと思います。テーブルにさえレコードが書き出されさえすればあとはいかようにも加工して利用できますね。
今後は逆にサーバ側からESP8266への動作指示を実装してみたいです。PUSH型で実装するにはPUSHサーバを用いるかESP8266側にグローバルIPを持たせるかという感じなのですが安い固定IPつかえればそっちでもいいですね。安価に実件するにはPUSH型ではなくてESP8266から定期的に指示データを確認しにいくパターンを実装すればよさそうですね。
コメント