[ESP32]IoTマイコンを動かしてみる10 -WebAPIで天気情報取得編‐

そんなわけでいよいよWebとやり取りしていきたい。

ベタだけど天気情報を取得して、前回動かせたLCDに表示してみたい。


OpenWeatherMap API

天気データの取得先はOpenWeatherMap。

­天気情報を提供しているサービスもたくさんあって困るのだけど、とりあえず情報が多そうなところを使ってみる。

公式のドキュメントが詳しいけど、下記を参考に試してみる。

利用までの手続きは

  1. アカウントを作成
  2. API keyの取得
  3. 所定の形式でHTTPリクエストを送ると、JSONやXMLでデータが取得できる

注意点はアカウント登録してからAPI keyがアクティベートされるまでa couple of hoursかかるらしいこと。10分に1回以上リクエストしてもデータが更新されないので意味ないらしいこと。

リクエストURLの形式は、現在の天気を取得する場合、

http://api.openweathermap.org/data/2.5/weather?id={City ID}&units=metric&APPID={APIKEY}

City IDは対象の都市のID(ここで調べられる)、APIKEYは自分のAPI keyを入力。unitsはmetricを指定しておくとセルシウス度で温度を取得できる。

5日間3時間ごとの予報を取得する場合は、weatherをforecastに変えて

http://api.openweathermap.org/data/2.5/forecast?id={City ID}&units=metric&APPID={APIKEY}

で取得できる。

ちなみにCity IDは上記リンクにあるJSONファイルから調べてもよいのだけど、都市名の有無で検索するのが大変なので、下記のAPIで指定した緯度経度周辺の都市情報が取得できるので、そこから調べるのがおすすめ。

http://api.openweathermap.org/data/2.5/find?lat={緯度}&lon={経度}&cnt=10&APPID={APIKEY}

JSON Parser

一番近所が狛江だったので取得してみたJSONデータが下記。

2.1℃か。。。それは寒い。ということが目で追っていってtempのところを参照すればわかるのだけど、そのままだとプログラム上で使いづらいのでパースする。

ちなみに返ってくるデータ上の日付はUTCなので(更に現在のデータに関してはunixtimeのみ)要注意。上記データだとdtのところがunixかつUTCのデータ。予報データだとdt_txtというフィールドに読みやすい形式(YYYY-MM-DD hh:mm:ss)で返ってくるがUTCなので必要に応じてJSTに変換すべし。

ArduinoJson

ParsorもいろいろあるけどメジャーっぽいArduinoJsonを使う。

使いたいjsonデータに合わせたサンプルコードが簡単にわかるツールが用意されていて便利。

使用するjsonデータを貼り付けると、確保すべきBufferサイズとパースするときのコードが表示される。

一旦Parseの話は置いておいて…

まずはデータの取得までをコーディング。HTTPクライアントのサンプルTFT LCDのサンプルを組み合わせる。

(1), (2): アクセスポイントのSSIDとパスワード、Open Weather MapのCityIDとApiKeyは各自の環境に合わせて入力。

(3): 予報データは何も指定しないと3時間ごとの5日間分のデータを取得するので計40個のデータになる。そんなに要らないので cnt=3とすることで3個のデータ(最大9時間後のデータまで)取得するよう指定している。

(4): WiFiがつながるまでディレイがあるようなのでwhile文で回している。いまいち挙動がわかってないので不要な処理かもしれない。

(5):ここでTFTに出力している。すぐ上でシリアルモニタにも出力しているのでTFT出力に問題があるか、そもそもデータを取得できていないか切り分けできる。

(6): 600000 msec = 10 min に一回データを取得する。

こまかいっ!

取得成功。デフォルトだと文字がとても細かい。

まとめ

中途半端だが、しばらく更新も空いてしまっているので今回はここまで。実は描画の方をどうしようか色々試行錯誤していて、それに時間がかかってしまっていた。無事データを取得できたので、次回はデータをパースして天気アイコンで表示するところまでいきたい。材料は揃っているので今週末にはできるはず。