【ESP8266】天気予報API Weather HacksをハックしてOLEDに天気情報を表示させる

Arduino

天気APIのJsonデータをOLEDに表示させる

こんにちは、くろべこです。

ArduinoJsonを知ってから公開APIを漁る日々が続いています。やっぱり、ESP8266は手軽にWifiに接続できるしArduinoで開発できるからライブラリも豊富なので離れられません(笑)。最近は公開APIの種類もかなり豊富なので、IoTをやるにはいい時代になりました、、、

そんな公開APIの中でも超有名な天気予報API【Weather Hacks】について取り上げていきたいと思います。(フォーマットはもちろんJsonです)

リンク:Weather Hacks

目標はHttpClientでWeather HacksのJsonデータをGETして、ArduinoJsonによりデシアライズします。そして、オブジェクト化されたデータから値を抽出し、OLEDに表示させる。といった魂胆になります。

HttpClientの使い方だったり、ArduinoJsonによるデシリアライズのやり方については過去の記事にまとめてありますので参考にどうぞ。

【Arduino/ESP8266】HttpClientを使ってHTTPSをGETする
前回に引き続きHttpClient記事になります。今回はHTTPSのウェブページにアクセスしてデータをGETしていくのですが、基本的な作法はHTTPと変わりません。変わるのがフィンガープリントという認証が必要なってくるんですね。本記事では認証の方法解説と実際のコードを交えて説明していきたいと思います。
【Arduino】Arduino環境下でJSONをパース(逆シリアル化)して値を取り出してみる
本記事ではJsonフォーマットからの逆シリアル変換(Deserialization)方法を取り上げています。ArduinoJsonのバージョンはV6を対象にしていますのでお気を付けください。逆シリアル変換することで特定の文字列を取り出すことが可能になります。

一回使い方さえ慣れてしまえば、Jsonデータの扱いはどのAPIでも同じなのでどんどん情報をGETしてIoTが捗りますよ~


環境準備

今回使用する材料と環境の紹介です

  • ESP8266
  • OLED(128×64)
  • Arduino 1.8.10
  • ArduinoJson(verson 6)

※ArduinoJsonはバージョン違いの場合は動かない場合がありますのでご注意ください。

今回のコードは非常に長くなっております。ざっくりコードのブロックを紹介すると

  1. ヘッダ/定数/変数定義
  2. 天気データトリミング関数
  3. HttpClientのGET関数
  4. Jsonのデシリアライズ関数+OLED表示
  5. セットアップ(Wifi, OLED, シリアル)
  6. メインループ

ポイントは2.天気データトリミング関数です。この関数ではUnicodeで表されている天気情報を条件分岐させてアルファベットの天気文字列に変換しています。もしも、条件に合わない文字列が出た場合はUnicodeの文字列をそのまま表示させるようにしています。(ちなみにスペース“¥”“のち”を表すUnicodeは除去しています。)

Weather Hacksでは晴れ時々曇とか曇のち晴れなど、天気の組み合わせは多岐にわたるので、その都度条件は更新していこうかなと思います。

お天気情報を常に収集しているのでメモリリーク対策が必要です。Jsonオブジェクトの開放は忘れずに行いましょう。コードでいうと【doc.clear()】ですね。

リンク:JsonDocument :: clear()

メモリリークプログラミングにおけるバグの一種。プログラムが確保したメモリの一部、または全部を解放するのを忘れ、確保したままになってしまうことを言う。プログラマによる単純なミスやプログラムの論理的欠陥によって発生することが多い(Wiki)。
特にC言語では参照されなくなったメモリを開放するような機能は盛り込まれていないので、コード中に適宜メモリ開放処理を作成する必要があります。この処理を怠ると、じわじわメモリを食いつぶされ動作停止になり再起動するほか手がなくなります。

回路接続 / 動作確認

回路はESP8266とOLEDを接続するだけです。OLEDはI2Cタイプを使用しました。

描画スピードが速い場合はSPIが必須ですが、今回は更新頻度が遅いのでI2Cで問題ありません。

ESP8266 OLED
3V3 => VCC
GND => GND
D1 => SDA
D2 => SCL
それでは、プログラムを書き込んで動作確認してみましょー
上側が今日の天気を表して、下側が明日の天気を表しています。ちなみに、天気は略して記述しています。
  • CNY:曇り
  • RNY:雨
  • SNY:晴れ

※天気の条件分岐が合わないときは、Unicodeがそのまま表示されます。なので、その時に応じて条件分岐(WtrTrim)の中に追加してください。

という事で、天気予報API【Weather Hacks】をハックしてOLEDに天気情報を表示することが出来ました。

今回はこんなとこで失礼します!

 

コメント

タイトルとURLをコピーしました