読者です 読者をやめる 読者になる 読者になる

hogehoge, world.

米国カリフォルニアから日本に一時帰国中のソフトウェアエンジニアがIT・自転車・音楽・天体写真・語学などについて書く予定。

ESP-WROOM-02(Arduino)によるWiFiネットワーキング (11) ~ 降水確率予報 "Amedes"

前回まで紹介してきたクマーシステムと回転灯システムは、共にHTTPサーバとして動作するアプリケーションであった。今回はちょっと路線を変えて、公開のWebサービスを叩いて動作するHTTPクライアントの話をしよう。

…というわけで最新作、降水確率予報システム "Amedes" である。人が前を通ると、気象庁の天気予報データを取ってきて、今日明日の6時間毎の降水確率と、今後一週間の日々の降水確率を表示してくれる。スマフォで天気予報見れるじゃんという話もあるのだが、玄関に置いておくと家を出る際にチラ見するだけで傘が必要かわかるので地味に便利である。

youtu.be

表示部

表示部はAdafruitのこの8連フルカラーLEDを使っている。

NeoPixel Stick - 8 x 5050 RGB LED with Integrated Drivers

AdafruitのNeoPixelシリーズは、このスティックの他にもリング状のものなどあってなかなかおもしろい。秋月電子スイッチサイエンスで手に入るのでチェックしてみるとよい。

配線は電源+信号線一本でよく、専用のライブラリで「何番目のLEDのRGB値をこれこれにせよ」と言うだけで制御できるのでおそろしく簡単である。ただこいつ、明るすぎるのが難点である(苦笑)。買ってみたものの、デモを動かして「こんな攻撃的な明るさで一体何に使うんだよ!」とお蔵入りにしていたくらいである。これを引っ張り出し、試行錯誤でベストプラクティスを編み出して今回活躍させることができた。

  • 電源電圧は3.3Vでよい。定格の5Vで使うと明るさも発熱も暴力的。
  • 通常の情報表示は輝度10%程度でよい。これでもまぶしいくらい。
  • ピンポイントで短時間輝度を一気に上げることでキラリと光る感じの効果が出せる。ただし輝度変化が(空間的にも時間的にも)自然で滑らかになるようにしないとウザい。試行錯誤の末、輝度変化の曲線としてガウス関数を使用し、輝度更新のフレームレートを高く(100フレーム/秒くらい)設定することで、非常にいい感じのキラキラ感になることがわかった。動画だと露出オーバーでわかりにくいのが残念。

人感センサー

人を感知するセンサーにはこれを用いた。すぐに使えるモジュールになっており、感知距離が3~5m、出力3V、さらに待機電流が12μAと非常に小さく、今回の目的にぴったりである。

焦電型赤外線(人感)センサーモジュール SB412A: センサ一般 秋月電子通商 電子部品 ネット通販

http://akizukidenshi.com/img/goods/L/M-09002.jpg

回路

まずはこんな感じの何の変哲もない回路を組んでみた。前回同様基本回路部分は省略している。8連LEDをIO12につなぎ、人感センサーをIO14につなぐだけである。

f:id:tomoto335:20160622023813p:plain

ソフトウェア

ソースはここ: https://github.com/tomoto/ArduinoPlayGround/tree/master/Amedes

思いつくままポイントを書いてみる。

  • フレームワークは前回紹介したものをそのまま用いている。もともとHTTPサーバ用に作ったフレームワークだが、ネットワーク接続の確立や監視、接続先APの設定など、HTTPクライアントでも共通に使える機能は多い。
  • 降水確率データは 気象庁 | 天気予報 : 東京都 (今日明日の6時間毎予報) と 気象庁 | 週間天気予報: 東京都 (一週間予報)の画面をスクレイピングして取得する。もともと Weather API のようなAPIを使うつもりだったが、様々な理由により初版は画面スクレイピングに落ち着いた。画面が変わって今のが動かなくなったら次はAPIに移行するかもしれない。
  • 人感センサーに入力があったら、上記2つのページにHTTPリクエストを出して画面(HTML)を取得し、なんちゃってパーサに通して降水確率を取り出し、それをLEDに表示する。HTTPリクエストを出す処理はESP8266用サンプルの中にあるHTTPクライアントをそのままパクればよい。
  • パーサは超いいかげんなつくりだが、HTTPレスポンスを1文字ずつ放り込むとメモリを消費せずに降水確率の数値だけを取り出すオートマトンとして作ってある。HTTPレスポンス全体をメモリに乗せなくてよいというのは重要。ESP8266のメモリだと気象庁の画面はたぶん乗り切らない。
  • 前回のデータ取得から一定時間経っていなければ前回のデータを使って表示だけ行う、というサーバに優しい設計。
  • 天気予報を取得する地域コード(天気予報ページのファイル名となっている整数)はカスタマイズ可能で、例によってHTTPリクエストで設定する。つまり、本アプリケーションは基本的にはHTTPクライアントであるが、内部ではHTTPサーバも立ち上がっており、これらの設定操作を受け付けるようになっている。設定はSPIFFSに永続化する。
  • 天気予報表示中は、CPUは8連LEDに対して高フレームレートで指示を出し続けており忙しい状態だが、HTTPサーバの処理が完全に止まらないようにyieldしている。実を言うと実装はちょっと苦し紛れなのだがまぁ動いている。
  • 例外状態はLEDの点滅で表示するようになっている。緑点滅=ネットワーク探索中、赤点滅=HTTPエラー、黄点滅=HTML解析エラー、みたいな。

電池の持ちやいかに…?

さて、このシステムを次のスマフォ用バッテリーで運用してみた。

Amazon.com: Anker Astro 6700mAh Ultra-Compact Premium Portable Charger (2nd Generation External Battery Power Bank)

10日くらいもってくれるかなと思っていたのだが、以外と短く、約5日毎にバッテリーがすっからかんになってしまった。

ESP8266がlight sleepモードで安定動作していると、下のグラフのような感じで約20mAをコンスタントに消費する。100mSごとに約90mAのスパイクが立っているのはおそらく100mSごとにdelayから復帰してHTTPサーバの処理を行っているからで、1500mSごとに90mAの帯が見えるのはWiFiのビーコンか何かだろうか。

f:id:tomoto335:20160622033224p:plain

これに加えて、LED Stickが何もしていなくても5mA程度消費するようなので、待機中に概ね30mAは流れていると考えられる。30mA x 24h x 5日 = 3600mAh とすると、まあそんなものかもしれない。

一日1~2回しか見ないものなのに、5日毎に充電するのはどうもつらい。ということで次回はこれの省電力化にトライしてみたい。