日記

日本語の勉強のためのブログ

M5Stack core2で能登地方の強震モニタを表示する

余震が続いているのもあり、Vivaldiのウェブパネルに強震モニタを表示しているが、常時表示しておくのが面倒なのでM5Stack core2にやらせたい。
全国版の強震モニタについてはM5Stack(core2ではない)で作成された方がいらっしゃる↓ため、これをcore2に移植しつつ、能登地方バージョンに改変する。

www.ria-lab.com

作成した能登地方バージョンはGitHubに置いた。

github.com

以下、移植時の改変点などを記載する。

ボード情報やライブラリの変更

ボード情報やライブラリ名をcore2用に書き換える必要がある。書き換え後は以下の通り。

main.cpp<M5Stack.h><M5Core2.h>に置換)

#include <AnimatedGIF.h>
#include <Arduino.h>
#include <HTTPClient.h>
#include <M5Core2.h>
#include <WiFi.h>
#include <WiFiMulti.h>
(後略)

platformio.ini

[env:m5stack-core2]
platform = espressif32
board = m5stack-core2
framework = arduino
monitor_speed = 115200
lib_deps = 
    bitbank2/AnimatedGIF@^1.3.2
    paulstoffregen/Time@^1.6
    mbed-kazushi2008/HTTPClient@0.0.0+sha.cf5d7427a9ec
    m5stack/M5Core2@^0.1.8

※なお、monitor_speedについてはシリアルモニタの文字化け防止*1に記載したもので、必須ではない。

音声をバイブに変更

core2では音の鳴らし方が変更されたようで、移植にあたり対応が必要となる。 しかし対応が難しいと感じたため、バイブレーションで代用することにした。

具体的には、main.cppに次のような関数

void vibrate(unsigned int vibLength = 500) {
  M5.Axp.SetLDOEnable(3, true);
  delay(vibLength);
  M5.Axp.SetLDOEnable(3, false);
}

を定義して、M5.Speakerの関数が使われている部分をすべてvibrate()で置換した。

能登地方を表示する

強震モニタの画像のURLに_notoを付け加えることで、能登地方のマップを表示させることができる*2

具体的にはmain.cpp内のURLを以下のように変更すればよい。

http://www.kmoni.bosai.go.jp/data/map_img/CommonImg/
-> http://www.kmoni.bosai.go.jp/data/map_img/CommonImg_noto/
http://www.kmoni.bosai.go.jp/data/map_img/EstShindoImg/
-> http://www.kmoni.bosai.go.jp/data/map_img/EstShindoImg_noto/
http://www.kmoni.bosai.go.jp/data/map_img/PSWaveImg/
-> http://www.kmoni.bosai.go.jp/data/map_img/PSWaveImg_noto/
http://www.kmoni.bosai.go.jp/data/map_img/RealTimeImg/
-> http://www.kmoni.bosai.go.jp/data/map_img/RealTimeImg_noto/

しかし、強震モニタ背景に表示される日本地図の画像CommonImg/base_map_w.gifが16.4kBなのに対し、能登地方の地図画像を指すCommonImg_noto/base_map_w.gifは50.9kBと非常に大きい。そのため次のように画像ダウンロード用のバッファ容量を増やしておく必要がある点に注意。

main.cpp

(前略)
unsigned long file_buffer_size;    // ダウンロードしたサイズ
unsigned char file_buffer[51000];  // ダウンロード用のバッファ
(後略)

(2024/11/30追記) 結局圧縮した画像を自分のリポジトリでホストすることにした。これなら30kBほどで十分足りる。