RaspberryPiにNGINX+MariaDB+PHPの環境を構築する方法を紹介しました。今回はこのSQLサーバーにマイコンからデータを登録する方法を紹介します。
概要
今回紹介する方法は、ESP32から直接SQLサーバーにアクセスする方法ではありません。
SQLサーバー側にデータ登録用のPHPを用意しておき、ESP32からそのアドレスを叩くことで間接的にデータをSQLへ登録します。
データベースの準備
以下の要件をもつデータベース、テーブルを作成します。
- データベース名:DB_HOGE
- テーブル名:TB_HOGE
- カラム:ID(INT型),YDT(DATETIME型),VAL_A(FLOAT型),VAL_B(FLOAT型)
- キーはID、自動採番とする。
また、このデータベースにアクセスするためのユーザー(hoge@localhost)を作成し、SELECTとINSERTのみの権限を与えます。ユーザー名とパスワードは適宜変更してください。
実際のコマンド操作は以下のようになります。
$sudo mysql >CREATE DATABASE DB_HOGE; >USE DB_HOGE; >CREATE TABLE TB_HOGE(ID INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY, YDT DATETIME, VAL_A FLOAT, VAL_B FLOAT); >CREATE USER hoge@localhost IDENTIFIED BY 'hoge_password'; >GRANT SELECT,INSERT ON DB_HOGE.TB_HOGE TO hoge@localhost; >exit
PHPの作成
作成したデータベースにアクセスするためのPHPを作成します。ここではnginxのドキュメントルート/var/www/htmlにinsdata.phpを作成します。
$sudo emacs /var/www/html/insdata.php
<?php
$dsn= 'mysql:host=localhost;dbname=DB_HOGE';
$user = 'hoge';
$pass = 'hoge_password';
try{
$pdo = new PDO($dsn,$user,$pass);
}catch(PDOException $e){
print_r ("データベース接続失敗");
}
if(isset($_GET['valA'])) {
$valueA = $_GET['valA'];
}
if(isset($_GET['valB'])) {
$valueB = $_GET['valB'];
}
$now = date('Y-m-d H:i:s');
$sql = "INSERT INTO TB_HOGE (YDT,VAL_A,VAL_B) values(:dt,:vl_A,:vl_B)";
$sth = $pdo -> prepare($sql);
$sth -> bindValue(':dt',$now);
$sth -> bindValue(':vl_A',$valueA);
$sth -> bindValue(':vl_B',$valueB);
$sth -> execute();
$pdo = null;
?>
ウェブブラウザから以下のアドレスにアクセスしてみましょう。(サーバーのアドレスが192.168.0.121の場合。適宜修正してください。)
ブラウザには何も表示されませんが、データベースのテーブル(DB_HOGE.TB_HOGE)にIDと日時のみ記録されていればOKです。VAL_AとVAL_Bに値を入れたい場合は次のようになります。
再度データベースのテーブルを確認し、指定した値が入っていればOKです。
要するにマイコンからhttpアドレスを叩けばデータベースに登録されるわけですね。
ESP32でのスケッチ例
ESP32でのスケッチ例は以下のようになります。20秒ごとにBME280で気圧、気温、湿度を読み取り、気圧と気温をSQLサーバーに送信します。
#include <WiFi.h>
#include <HTTPClient.h>
#include <Adafruit_BME280.h>
Adafruit_BME280 bme;
const char* ssid = "your-ssid";
const char* password = "your-password";
void setup() {
//BME280接続
bme.begin(0x76);
// Wi-Fi接続
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
void sendRequest(float press, float temp)
{
HTTPClient http;
String url = "http://192.168.0.121/insdata.php?valA=" + String(press) + "&valB=" + String(temp);
http.begin(url);
int httpCode = http.GET();
http.end();
}
void loop() {
//BME280で測定
float temp, pressure, humid;
temp = bme.readTemperature();
pressure = bme.readPressure() / 100.0F;
humid = bme.readHumidity();
// データ送信
sendRequest(pressure, temp);
delay(20000);
}
まとめ
データの管理にSQLを利用すると後々データを再利用するのが簡単になります。
とりあえずデータを保存・可視化したい場合にはAmbientのようなサービスが便利ですが、無料プランではデータ数や保存期間に制限があります。一方、自前のサーバーであれば制限なく使用できます。HTTPのアドレスを叩くだけで済むので汎用性も高く、マイコンに限らず他のPCなどからのデータ収集にも役立ちますね。

コメント