#はじめに
以前、以下のような記事を投稿しました。
-
M5StickCで天気通知システムを作る
それからかなり間が空いてしまったのですが、軽微な機能追加と、バグ修正、ソースコードのリファクタリングを行ったので本記事を投稿することにしました。
ソースコード全体は下記リンクで公開しています。
https://github.com/issi8131/public/tree/master/M5StickC_WeatherAlert
#変更点
1. 最低・最高気温の表示
本ガジェットで使用している天気取得APIWeather Hacks お天気Webサービス(※PCからアクセスが必要)ですが、リンク先の仕様に記載があるように、レスポンスJSONデータ内にtemperatureというプロパティがあり、最低気温と最高気温が取得できます。そこで、これらの情報もディスプレイに表示できるようにしました。
ただし、取得タイミングによっては気温の値がNullで返ってくることもあるため、その場合は表示用の内部変数を更新しない仕様としました。
2. 天気表示の日付先送り
天気取得APIからのレスポンスには、2日先までの天気情報が含まれています。M5StickCのAボタン(ディスプレイ横のデカいボタン)を押すと、2日先までの天気を表示できるようにしました。
3. バグ修正
前回のコードでは、電源を入れて2~3日ほどすると天気取得に失敗するようになるバグがありました。おそらくメモリリーク系でやらかしているのでは、と考え、使用しているArduinoJSONライブラリのリファレンスを注意して読んでみました。
https://arduinojson.org/v6/api/dynamicjsondocument
そして、DynamicJsonDocument
オブジェクト(APIからのレスポンスJSONを格納する領域をヒープ領域に確保する)を利用している部分で、都度メモリ解放するよう修正したところ安定動作するようになりました。
DynamicJsonDocument jsonDoc(10000);//レスポンスデータのJSONオブジェクトを格納する領域を確保(レスポンスデータの想定最大サイズに合わせて大きめ)
deserializeJson(jsonDoc, payload); //HTTPのレスポンス文字列をJSONオブジェクトに変換
JsonVariant jvToday = jsonDoc["forecasts"][gDaySelector];//forecastsプロパティの0番目の要素が今日の天気に関するプロパティ
//~~中略~~
jsonDoc.clear();//JSONオブジェクトの領域をメモリから解放
4. コードリファクタリング
最近、O'Reillyのリーダブルコードという本を読んでいることもあり、前回のソースコードから読みやすさを向上させました。変数名や制御文の記載等を修正修正しています。