Raspberry PiとArduinoでアクアリウム(その4)「実際にスマホでコントロール編」

その1はこちらです。

 前回まではちょっと詳しく解説しすぎたり、内容が定まっていなかったので今回から調整します。書き直しても良いのですが、教訓として残しておきます。応援よろしくお願いします。
 実際にスマホでコントロールしてみました動画です。Arduinoは基板が上に載っていて、分かりにくいですがRaspberry Piの隣に写ってます。スマホからは専用のページでコントロールしています。 www.youtube.com

仕組み

f:id:takumus:20160908235429p:plain  動画内のiPod TouchとAndroidはどちらもブラウザで特定のページを開いていますが、このページはPiではなく、さくらのVPSで用意したウェブサーバーで立てています。ページを開くとwebsocket.io(以降ws)でさくらVPS(以降親サーバー)と繋がります。ライト点灯命令はすべてwsを使って送信されます。(動画内でもわかる通り、2台の端末でライトの点灯状態が同期しています。)そして、親サーバーはブラウザから受信した命令をPiへ流すのです。Piとは親サーバーが立てたSocketサーバーで繋がっています。PiとArduinoはSerial接続しています。
 なぜこうなったかと言うと、

  1. ポート開放をしたくなかったのと、
  2. 家は固定IPではないのと、
  3. 将来的に大人数がこの監視システムにアクセス出来たらよいと思っているので、Piはサーバーにせず極力休んでいてほしいのと、
  4. 命令ログやその他のデータの保管や処理はPiではなく、スペックの十分な親サーバーで行いたい、

など。その他理由はいくつかありますが、とにかく直接Piに外から繋ぎたくはなかったのです。
 自分にある知識を絞り出して考えた設計なので変な所ありましたら意見いただけると嬉しいです。

設定もリアルタイム

www.youtube.com  今回全ての情報はwsでリアルタイム共有されることになっているので、一応こういう仕様になっています。IoT系のもので多いのが、IからTまで非常にラグがあることです。自分的にそれは嫌だったので今回贅沢にもwsリアルタイム重視で設計しています。

ソース達

 このブログはすでに大体完成してから書いているので、ソースにはまだ紹介していない機能などが載っていて分かりにくいと思います。
 arduinoディレクトリにはarduinoのソース、piにはpiのソース。clientはスマホで表示するページのソースです。serverは、clientとpiを繋ぐ親サーバー部分です。 github.com