Wifiモジュールを使って天気予報ランプを作ってみた話 その1
こんにちは!
先日、以前紹介したWifiモジュール「esp8266」を使って天気予報を表示するLEDランプを作成したので、それについて書いていきたいと思います。自宅IoTの一歩って感じですねw ちょっと長くなりそうなので2回か3回に分けて書く予定で、今回は全体構成とサーバーサイドのコーディングについて記載し、モジュール側のプログラムや電子工作は次回以降に書いていきます。
作りたいもの・仕様
今回は「天気予報ランプ」をつくるわけですが、まずはどんなものを作っていくのかを考えてみます。
そもそもこれを作りたいなと思った理由は、雨の日に外出するときに傘を忘れがちなので、家の入り口の近くで天気がひと目でわかるようなモノがあると良いなと思ったからです。実装の方法は色々と考えられますが、電子工作ではよく使われるLEDを使うのが一番簡単かつ手っ取り早いかなと。天気や降水確率の予報をもとに、LEDを適切な色に光らせる感じですね。
また、天気予報については自分でやるのは無理なのでw、ウェブ上で公開しているAPIを利用します。ウェブ上にある天気予報を読み込み、それをもとにLEDを光らせる色を決める形にすればそこまで無理なく作れそうです。
あとは、LEDを光らせるだけでなく、その内容を音声通知してくれるとなお良しです。前回の記事を読んだ方ならピンと来たと思いますが、これにはSlackのIncoming Webhookを使います。天気予報の情報をLEDの点灯に使うだけでなく、その内容をSlackに投げることで、家の中でその内容を読み上げしてくれるようにできます。
というわけで、今回つくるものの内容をまとめると…
1. ウェブ上の天気予報を取得する
2. 取得したデータを元にLEDを適切な色に光らせる
3. 天気予報の内容をSlackに投稿する
あたりがメインの機能になります。それでは、これを実際に作るための検討をしていきましょう。
全体の構成
まずは、今回作ったものの全体像はこんな感じ。
ぱっと見るとちょっと複雑に見えるかも知れませんが、やっている事自体はそうでもないです。大まかなデータの流れとしては
1. esp8266がサーバーマシンのphpプログラムを呼ぶ
2. phpプログラムが天気予報APIにアクセスして天候情報を取得する
3. phpプログラムがSlackに天気予報情報を投稿
3-1. タブレットがSlackの通知を受取り、読み上げる
4. phpプログラムが天候情報からLEDの光る色を決め、esp8266に返す
4-1. esp8266が受け取った情報を元にLEDを光らせる
ポイントとしては、処理のメイン部分をサーバーのphpプログラムに担わせていることですかね。以前にも書いたとおり、僕の家には常時起動のapacheサーバー(ローカル)が動いているので、ここにメインとなるphpのプログラムを置いてメイン処理を行わせている形です。
おそらく、この程度の処理であればesp8266マイコン内でも処理できるとは思いますが、主に二つの理由からphpのプログラムを経由する形で実装しています。
一つ目は、マイコン側のプログラムの書き換えが比較的めんどくさいことです。phpプログラムの書き換えはPC内で完結するので割と手軽に行えますが、マイコン側のプログラムを書きかえるには、物理的にマイコンをPCとつなげてやらなければならないので微妙にめんどくさいw。使っていく中でバグが見つかったり、天気予報APIの仕様が変わったりということは容易に想像できるので、そういったときにいちいちマイコン側に手を加えるのを避けたかったというのが理由の一つです。
もう一つはArduino言語(というかc++)の文字列処理が複雑になりがちなところです。char型とString型の使い分けやポインタの概念など、めちゃくちゃ難しいというわけではないものの、普段使い慣れていないとコーディングにちょっと時間がかかってしまいます。普段Pythonで文字列処理で楽をしている身としてはこれがなかなかつらいw もちろん、c++のような比較的厳密な言語がゆえの良さはあるのだと思いますが、今回は開発のスピードを重視して、文字列処理部分はphpで実装します。php自体を使うのはほぼ初めてなわけですが、Python同様に非常にコーディングしやすい言語なのでそこのハードルは特になかったですね。
余談ですが、こういうことをしていると、自宅にローカルサーバーがあるというのはなんだかんだで便利だなと痛感しますね。初めてサーバーを立てたときは何に使おうかと思っていましたが、色々と手を付けていくとローカルといえど自宅にサーバーがあるとできることの選択肢がかなり広がる気がします。
ソースコード
ということで、phpのソースコードの紹介です。先に書いたとおり、phpでコーディングするのは初めてなので、書き方はお察しのレベルだと思いますw
今回、天気予報の情報取得に用いたのはこちらのサイト。気象庁の天気予報情報をxml形式で配信しているAPIとなります。
phpプログラムの処理を大まかに分けると以下の通り。
1. 上記APIをリクエストして天気予報をxml形式で入手する
2. xmlから必要な情報(東京地方の今日の天気と降水確率)を抽出
3. 今日の天気と降水確率からLEDの光らせる色を算出
4. Slackに天気と降水確率を投稿
5. 返り値として色コード(RGBコード)を返却
サーバーサイドのプログラムはこんな感じです。あとは、マイコン側のプログラムと基盤への実装が必要なわけですが、そこまで書くと長くなりそうなので、それは次回に回したいと思います。
まとめ
今回は、天気予報を示すLEDランプの制作について、全体の構成とサーバーサイドのプログラムについて書いてみました。主にシステム面の話でしたが、今までの知識を上手く組み合わせてこういうシステムを考えていくのはなかなか楽しいですね。
先にも書きましたが、次回はマイコン側のプログラムと実際のモノづくりの部分を書く予定です。興味のある方はお楽しみに!
それでは、また!