📖

ESP32で気温・降水確率&時計

2022/11/12に公開

その日の最低・最高気温と降水確率を確認してから会社に向かうのに毎日スマートスピーカーに聞くのが面倒なのでESP32で8x8LEDに表示させることにしました。

環境

https://zenn.dev/technicarium/articles/3390fc560340cb

仕様

  • 出勤時点の気温を表示、出勤後以外はdeepsleepを使用して休止状態にする
  • その日の最低・最高気温を表示
  • その日の降水確率を表示
  • 時刻は出勤時刻直前に休止状態から復帰した時だけインターネットから取得
  • 基本は時刻を表示させておき定期的に気温と降水確率を表示
  • LEDの文字数は4文字なのでスクロール表示させる

時刻取得

ESP32の内部時計の精度が分からないためntptime.settime()でNTPを使用して時計を設定するようにしました。
ただ、ntptime.settime()はUTCで設定されてしまうので設定後今度はtime.localtime()で+9:00加算して差設定するようにしました。

休止

出勤中はLEDを表示させても無駄なのでmachine.deepsleep()で休止状態に、ただ復帰後の挙動がどうも安定せず復帰後machine.soft_reset()でソフトリセットするようにしました。

気温・降水確率情報の取得先について

象庁防災情報XMLフォーマット形式電文の公開(PULL型)

https://xml.kishou.go.jp/xmlpull.html
XMLフォーマットなので処理するためにxml.etree.ElementTreeを使用することにしました
ちなみに長期フィードの定時をfromstring()で読み込んでみたところメモリ不足が発生してしまいました。

res = requests.get('https://www.data.jma.go.jp/developer/xml/feed/regular_l.xml')
>>> root = ET.fromstring(res.text)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "urequests.py", line 28, in text
  File "urequests.py", line 20, in content
MemoryError: memory allocation failed, allocating 2376704 bytes

気象庁防災情報は4時、10時、16時台にデータが更新されるようですが当日の1日分の情報は前日16時時点のデータしかないようでちょっと鮮度が古いような。
また当日朝時点の気温の情報が見つけられず結局象庁防災情報を使用するのはやめました。
ちなみに気象庁のホームページからデータを取得できないかとソースを確認してみたのですがhtml内に情報が直接埋め込まれておらずjavascriptで表示されているようなのでrequests.get()では取得できず諦めました。

OpenWeather

https://openweathermap.org
アクセス頻度やデータによっては無料でりようできるようなのでこちらのデータを使用することにしました。
実際使用してみて

  • One Call API 3.0は無料枠を使用するにしてもアカウントを作成後サブスクリプションの登録が必要のようです(今回使用せず)
  • サブスクリプション登録が不要な現時点の情報と3時間毎の5日分情報を使用することにしました
  • https://openweathermap.org/current
  • https://openweathermap.org/forecast5
  • データはJSON形式を使用することでjsonモジュールで簡単に処理できました。
  • 他のサイトの予報と比べると気温も降水確率も違いがあり精度についてはあくまでも参考程度と考えた方がよさそうです。

実行結果

Discussion