
M5StickC Plus とUIFlowでプログラミング(15) - UIFlow更新(v1.10.2)とEEPROM
ちょっと前にUIFlowがv1.10に更新されました。現時点(2022/08/10)のバージョンはv.1.10.2です。
それによってEspNowのブロックが変更されました。日本語化もされていません。M5StickC Plusの持っているEspNowの機能自体は変わらないので、UIFlowから扱うEspNowのブロックが変更になったということです。

じゃぁ、今まで作成したプログラムはどうなるの?というと、現時点では、古いm5fファイルを読み込むと古いEspNowのブロックを読みます(日本語化されているやつ)。

おそらくは、互換性のためにUIFlowを提供しているサーバー上には古いブロックも保持しているのだと思いますが、新規でEspNowのブロックを配置するときには古いブロックは表示されないので、配置できません。
そして、古いブロックの保持もいつまで続くか分かりません。
ということで、新しいブロックを使用したものに差し替えようとしたのですが、ブロードキャスト通信のブロックがなくなっていました。
※2023/07/19追記
正確には相手のアドレスを「FFFFFFFFFFFF」にすれば、ブロードキャスト扱いになります。また、v1.12.0でブロードキャストブロックが再び追加になっていますが、init(初期化)ブロックではMacアドレスを指定しないといけないっぽいです。


そこで、Macアドレスを指定した通信に切り替える必要が出てきたのですが、それには、通信相手のMacアドレスを事前に把握しておかなければなりません。
ということで、M5StickC PlusのEEPROMに手持ちのM5StickC PlusのMacアドレスを覚えさせることにしました。
EEPROMとは、M5StickC Plusの電源を切っても情報が失われない領域で、M5StickC Plusの中で動いているUIFlowのファームウェアや「ダウンロード」で保存したプログラムなんかはそこに記録されています。また、Wi-FiのSSIDやパスワードも電源を切っても覚えていますよね。そういう領域です。
このEEPROM、ユーザーが自由に使え、UIFlowにも読み書きをするブロックがあるので、EEPROMのユーザー領域にMacアドレスを書きこんでおくことにします。
ちなみに、書き換え可能な回数は普通10万~100万回くらいなので、あまり頻繁すぎる書き換えはしない方が無難です。
例えば、センサの計測データなんかをミリ秒で書き込み続けるような使い方だとすぐにダメになると思います。
EEPROMのブロックは「ハードウェア」の中にあります。「key」として名前をつけて「value」の値を保存するような使い方になります。

EspNowのブロックの中に、自分のMacアドレスを取得するブロックがあるので、それで自分のMacアドレスを取得できます。

それで、手持ちのM5StickC PlusのMacアドレスを確認し、EEPROMに書き込みます。
ちなみに、手元には検証用に個人のものが4台、授業用に30台あり、個人の方はA~D、授業用は1~30で各個体を判別できるようラベリングしてあります。今回は、このラベルを「key」に、Macアドレスを「value」として保存します。

簡単な書き込みプログラムを用意して、書き込みを行いました。一度書き込んでしまえば電源を落としても保持されます。
正常に書き込まれているかを確認するプログラムも書きました。

ボタンAを押すたびに「key」をA~Dに切り替えてEEPROMに「key」で保存された「value」を表示するプログラムです。
これで、Macアドレスが保存されたので、A~Dの個体を指定してあげれば、個別のアドレスを特に意識することなく通信できます。
通信テストも行いました。

EspNowの中の、このブロックを使用します。

「peer」でMacアドレスを、「id」で「1~10」の任意の数字を指定します。通信先を10個まで登録しておけるようですね。まぁ、ただ、テストプログラムでは、ボタンを押すたびに、id「1」の値を書き換えるようなプログラムにしています。
実際の通信はこの「id」を使用します。

この例では、ボタンAを押したら「1234」を文字列として指定したid「1」に送信します。
受信ブロックは、recieve callbackです。「mac」には送信してきた相手のMacアドレスが、「data」には送信してきたデータが入ってきます。
ちなみに、今回はブロードキャスト通信ではないので、登録がない相手から届いたデータは無視されます。