ESP8266からPHPにPOSTしてMySQLを更新する

eyechatcharduino2
SBMJOB

私一応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から定期的に指示データを確認しにいくパターンを実装すればよさそうですね。

スポンサーリンク

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

システム開発SE・アプリ開発・デバッガー等々なんでもやる猫の下僕です。現在は凶暴猫にカタカタ動く手を狙われながらキーボードを打っています。かなりゆるい性格なのでコメントやメッセージお気軽に〜お仕事のご依頼もお気軽にぃ〜

スポンサーリンク

コメント

コメントする

CAPTCHA


目次