自作のECメーターをIoT化するためのプログラムの構成。ラズパイからJSを使ってPHPにアクセスし、PHPからMySqlのデータを取得している様子を解説

【完全自作】ECメーターを自作しよう。回路とプログラムを詳しく解説。でECメーターの回路は一応完成しました。回路が少し複雑なので基板化しているところです。

ちょっと時間があるのでその間になんでもできるラズパイを使ってリモートでECメーターの値を取れるようにしたいと思います。IoT化というやつですかね(๑•̀ㅂ•́)و✧

実はこれまでに【ラズパイでIoT】 温度モニター実装方法を詳細解説。水耕栽培に活用します。という内容で手元にある温度計をブラウザから見れるようにしたのですが同じことをしたいと思います。
自作のECメーターをIoT化するためのプログラムの構成。ラズパイからJSを使ってPHPにアクセスし、PHPからMySqlのデータを取得している様子を解説

今回実装する方法の特徴
  • ブラウザでECと温度のデータをグラフを見れるようにします。
    インタラクティブにできるJavaScriptでグラフを描画します。
  • グラフの元データはPHP経由でMySQLに登録されているデータを使います。
    JSでやっちゃうと元データのクエリ方法が見らてしまいます。
  • ExeファイルがCrontabのスケジュールで動いてMySQLにECと温度を登録します。
    C++からMySQLを使う方法もご紹介しますよー!

最終的にはこんなものができます。EC値と温度が表示されています。⚠️EC値の補正はしていません
自作のECメーターをIoT化してパソコンからグラフを描画している様子

まずはMySQLにデータが登録できないとしょうがないので、その方法を簡単にご紹介します。
そのあとJS -> PHP -> MySQLでどうやってデータを取得できるかをご紹介しますね(〃’ω’)

C++のコードにMySQLへのアクセスを追加します。

【完全自作】ECメーターを自作しよう。回路とプログラムを詳しく解説。でEC値は取得できるようになりました。

せっかく取得したデータは保存しておかないともったいないですね。

ということでMySQLのデータベースにデータを保存して活用できるようにします。

MySQLをC++で使うための事前準備。

MySQLをラズパイにインストールしないことには何もできません。。
ということでC++でMySQLを使うために必要なライブラリをインストールしましょう。

次にC++のコードにMySQLへのアクセス部分を追加します。

C++でMySQLにデータを登録できるクラスを追加

ライブラリがインストールできたので、あとは実際に呼び出してあげましょう。

新しいクラスMySqlInterfaceがSQLへのアクセスを担当します。まずは簡単にご説明。

コードの変更点
  • メイン関数に新しくMySqlInterfaceクラスのmySqlを作ります
    MySQLのユーザーネーム、パスワード、使用するデータベース、使用するテーブルの名前で初期化します。
  • ECの値や温度をRegisterメソッドで登録します。
    ConnectメソッドでMySQLへのソケットができたらデータを登録します。

そんなMySqlInterfaceを使って拡張したメイン関数がこちら。たいしたことはしていないです。

新しく作ったMySqlInterfaceクラスを簡単に解説します。

メイン関数からの呼び出しは簡単でしたね。簡単にMySqlInterfaceのメソッドを説明します。

#include mysql/mysql.hというライブラリを使います。

MySqlInterfaceのクラス
  • Connectメソッドのmysql_real_connect関数が実際にMySQLとの接続を確率します。
  • Registerメソッドのmysql_queryで第二引数のメッセージが送られます。
    INSERT INTO %s VALUES(%s)の部分です。

ライブラリのフォーマットにあうように文字列を整形しているだけになります。

これでEC値とその時の温度が取得できるようになりました。

次はこのプログラムが定期的に実行されるようにします。

crontabでプログラムを定期的に実行

ECの値の取得のためにプログラムをずっと稼働しているのはあまりよくなさそうです。

ということでプログラム自体はデータをワンショットでとる仕様にして、定期的に実行する方法をとりたいと思います。

crontabでやってみたいと思います( ಠωಠ)

Crontab(CRON TABle)はcronタスクを持つファイルで、このファイルに記載することでcronタスクは実行されます。

cronはunixやLinuxなどでcron daemonを使いバックグラウンドで一定間隔で自動的に実行されることを許されているタスクです。

crontabを使ったスケジュールを設定しましょう。

それではcrontabを使ってスケジュールを設定しましょう。

cronタスク(job / schedule)には設定、日付、時間を設定できます。

こちらがよく使うコマンドです。これらを使いながら設定しましょう。

Crontabのコマンド
  • crontab -e
    crontabファイルを編集します。
  • crontab -l
    cronタスクを確認できます。
  • crontab -r
    cronのファイルを削除します。

crontabので定期実行の設定を追加

crontab -e でcrontabファイルを編集します。

crontabファイル5つの6つフィールドがあります。分、時間、月の日、月、曜日、最後に実行したいコマンドです。

* * * * * command to be executed
– – – – –
| | | | |
| | | | +—– day of week (0 – 6) (Sunday=0)
| | | +——- month (1 – 12)
| | +——— day of month (1 – 31)
| +———– hour (0 – 23)
+————- min (0 – 59)

*をワイルドカードとして使うことができます。最小の単位はminなので1分ごとのスケジュール実行ができます。
よく使いそうな5分ごとの実行は */5 * * * * と書きます。

サンプルやフォーマットの説明はこちらにありました。
crontabの解説

今回は毎時間ごとに実行したいのでminのフィールドに00します。

MeasureECというプログラムを作製して、/usr/local/binに置いた場合の記載方法はこんな感じです。

00 * * * * /usr/local/bin/MeasureEC

ここではcrontabでの設定方法を簡単にご紹介しました。

結構使えますよね。スケジュール管理はこのプログラムにお任せでいいのかなと思います。

次は登録されたMySQLのデータをclient(User)側から取得してみましょう。

Web applicationを動かすための環境を構築

ラズパイでweb applicationを動かすためにはウェブサーバーソフトを入れる必要があります。
世界でもっとも使われているウェブサーバーソフトのApacheのインストールとPHPの設定をまとめます。

まずはインストール作業

インストール作業がたくさん続きます。

Apache2とPHPをインストールします。

ApacheとPHPがちゃんとインストールされたかを確認します。

Apacheがうまくインストールされたかどうかの確認は簡単です。

http://Your_RaspberryPi_IP-Address/ へご自身のスマホやPCからアクセスしてみてください。Your_RaspberryPi_IP-AddressはラズパイのIPアドレスです。

うまくアクセスできれば下記画面が表示されます。

PHPがインストールされたかも確認しましょう。

PHPが正しくインストールされたかはコマンドラインから確認できます。

php7.0-mysqlがインストールされたかも確認しましょう。

下記のコードをinfo.phpとして保存して/var/www/htmlに保存して
http://Your_RaspberryPi_IP-Address/info.php とアクセスしてみてください。

表示されたPDOの項目をご覧ください。ちゃんとインストールされてないとPDO driverの項目にno valueと表示されます。

これで必要なインストールや設定は終わりました。次回からweb applicationを書いていきます。

ブラウザからEC値と温度を取得します。

残すはweb applicationの実装のみです。サンプルのプログラムec-measure-web_sampleはこちらです。

こちらをラズパイの/var/www/html/の配下においてください。ブラウザからhttp://Your_PI_IP_Addr/EC-Status.php とアクセスすればデータが見えるようになります。

MySQLのユーザー、パスワード、テーブル等はDbManager.phpに設定してください。

ここでは内容を簡単に説明します。

PHPからMySQLにアクセスしてデータを取得しよう

PHPからMySQLのデータを取得します
  • DAY/WEEK/MONTHオプションがあります。
    1日の変化が見たかったり、月の変化が見たかったりしますよね。呼び出し元のコードからPOSTデータを取得して把握します。
  • DbManager.phpのGetDbメソッドでPHPからMySQLへのソケットを開けます。
  • DAY/WEEK/MONTHでqueryのoptionが変わります。
    WEEK/MONTHでは平均のデータを使うようにします。
  • 取得したデータは呼び出し元にJSON formatで返します。
    呼び出し元ではグラフの作成にGoogle chartsを使うことを想定しています。Google ChartsはJSONフォーマットのデータに対応しているのでこの形にしました。

JavaScriptからPHPを呼んでグラフを描画しよう

ここまでくればあとはデータを描画するだけです。Google Chartsを使ってインタラクティブなグラフを描画しましょう。

呼びだし元のコード
  • Google ChartsのLineChartを使っています。
  • データはjQueryのajax()関数からPHPを呼んでJSONフォーマットのリスポンスを受け取ります。
  • PHPを呼ぶときにはDAY/WEEK/MONTHをPOSTデータとして渡します。

JavaScript内でjQueryのajax()関数を使いURLにアクセスしてそのリスポンスを受け取っています。

URLに先ほどのPHPのコードを指定してPHP内で動かしたMySQLのクエリ結果をリスポンスの形で受け取ることができます。

ちなみにレスポンスはJSONフォーマットに整形しているのでその値をデータとして使うだけです。

全体のプログラムです。EC値と温度があるので、Y軸を2軸にしています。

まとめ

自作のECメーターをWebでインタラクティブに見れるようにしました。やることは多いですが、一度作っちゃえば応用が効くのかなという印象です。

記事を読んでいただいてありがとうございます。この記事がいいなと思ったら下記のSNSボタンのクリックをお願いします。励みになります😁