![見出し画像](https://assets.st-note.com/production/uploads/images/58674047/rectangle_large_type_2_dc75f0b0e7ceac5b3183de6c50f55902.png?width=1200)
M5StickC Plus とUIFlowでプログラミング(6) - 分岐
最後は、「分岐」処理です。プログラムにおいて(4)や(5)でやった「順次」「反復」に加えて「分岐」の3要素が基本になります。この3要素で世の中にある全てのプログラムが実現できます。
(2024/3/23)ブロックを変更して似た記事を上げました。以下にリンクします。この記事の代わりにこちらの記事でも構いません。この記事だけM5StickC Plus2を使用していますが、M5StickC Plusでも同じブロックがあります。
充電状態の表示
「Power」の中に、 「Get charge state」というブロックがあります。
現在、このブロックは「充電状態」というブロックに翻訳されていて、「Power」は「電源」になっています。
(2024/03/20)
![画像1](https://assets.st-note.com/production/uploads/images/58566823/picture_pc_08047ae1f84eb427452ad82dbfa78a80.png)
これが充電状態を取得するブロックです。早速、このブロックを表示してみましょう。
(2024/3/20追記ここから)======================
M5SticKC Plus2ではどうかな、と思って確かめたところ、M5SticKC Plus2のUIFlow1.0には、このブロックはありません。
USB Type-Cの抜き差しで、多少の電圧の変動があるので、この記事と同じことをしようとしたら「バッテリー」の中の、Get device battery voltage(V)が使用できると思います。
![](https://assets.st-note.com/img/1710939143483-y1nXAQZXNp.png?width=1200)
バッテリ電圧を表示させ、抜き差しで変動する値を確認して、
![](https://assets.st-note.com/img/1710932230750-BRYNQ9935f.png)
「Get charge state」のブロックの部分を、代わりにこのブロックの組み合わせに入れ替えることで、似た動作ができますが、充電状態でしきい値が変わり、満充電付近だと4.05近辺?ですが、電圧が低下しているともっと低い値がしきい値になるようなので、これで代わりのブロックにするには、ちょっと無理がある気がします。素直に、冒頭の代替記事を参照してもらったほうがよいかもしれません。M5SticKC Plus2の人は、以降の文章は、「そんなもんかー」と思ってもらえればよいと思います。
(追記ここまで)======================
(5)のプログラムを流用します。
![画像2](https://assets.st-note.com/production/uploads/images/58566939/picture_pc_6bd6840e82a9b2e1e9f07a68a138200d.png)
上のように、変更することで、充電状態を表示することができます。また、前回は「10秒停止」でしたが、10秒では長すぎるので、2秒程度にしておくとよいでしょう。(別に10秒でも構いません)
すると、USBケーブルを抜き差しする度に、「True」と「False」が表示されると思います。
![画像3](https://assets.st-note.com/production/uploads/images/58567038/picture_pc_a2bf64d3c417cb4e433dafaa014130f7.png)
「True」は「真」、「False」は「偽」を表し、ある条件に当てはまっているときは「True(真)」、当てはまっていないときは「False(偽)」になります。
この変化を利用して処理を分岐させてみましょう。
充電状態を分岐の条件とする
![画像4](https://assets.st-note.com/production/uploads/images/58567142/picture_pc_9be40dd02e511aec7dff9c562c0b107c.png)
「論理」の中に、分岐用のブロックがあります。①が基本のブロックです。
「もし(条件)であれば(処理)」の
「もし(条件)」の「(条件)」の部分に条件が入ります。
「であれば(処理)」の「(処理)」の部分にその「条件」を満たしたとき(Trueのとき)の処理が入ります。
![条件・処理](https://assets.st-note.com/production/uploads/images/58582987/picture_pc_be9c59c8cd344f49ff2314c933450cd3.png)
②、 が条件用のブロックです。
右辺と左辺を比較して正しければ「True」を、違っていれば「 False」を返します。
例えば、今回の条件であれば、③ と組み合わせて、
![画像16](https://assets.st-note.com/production/uploads/images/58583134/picture_pc_337a6adbb0193ef5ccc8337aa42d9b02.png)
のように使います。「Get charge state」 と「true」を比較して同じ(「=」)のとき、「true」が返され、処理が行われます。
処理は、何でもよいのですが、ここでは「LED ON」ブロックを使ってみます。「LED」の中に「LED ON」ブロックがあります。これらを組み合わせてバッテリーが充電状態ならM5StickC Plusに内蔵されたLEDを点灯させるようにしてみましょう。
条件分岐と組み合わせて充電状態にあればLEDを点灯させるようにしたプログラムは次のとおりです。
![画像6](https://assets.st-note.com/production/uploads/images/58568187/picture_pc_f9f11dfb1bf15b9d31cfc356cee43344.png)
この状態で書き込んでみると、確かに充電状態にあればLEDが点灯します。しかし、充電状態ではなくなった場合は「False」と表示されるものの、LEDは点灯したままになってしまっています。これは、条件に「充電状態の場合」しかないためです。充電状態でなくなった場合にLEDを消灯するためには「充電状態でない場合」についても書かなくてはいけません。
一番簡単なのは、「もし~」ブロックをもう1つ作ることです。このパターンは2つ考えられ、1つは、1つ目の「もし」ブロックの条件が「=true」2つ目の「もし」ブロックの条件を「=false」にするパターンで、
![画像7](https://assets.st-note.com/production/uploads/images/58568383/picture_pc_200ed61f2a719bd02dcfae3b2c46d82b.png)
もう1つのパターンは、2つ目の「もし」ブロックの条件を「≠ true」にするパターンです。「= false」と「≠true」では、多少論理的な意味は違いますが動作としては同じになります。
![画像8](https://assets.st-note.com/production/uploads/images/58568440/picture_pc_42621cdc16bffe625345cca57417eaf7.png)
「≠」は、「ノットイコール」と呼ばれ、「同じではない」という条件です。「≠」は条件用ブロックの「=」の部分をクリックすることでリストから選べます。
![画像9](https://assets.st-note.com/production/uploads/images/58568534/picture_pc_494c40468a624a8dd66ed31f90881202.png)
また、「もし」ブロックの左の「歯車」マークを押すことで出るウインドウから、「もし」ブロックの種類を変えられます。標準は「もし」(if)ブロックのみですが、「でなければもし」(else if)、「そうでなければ」(else)と、1つの「もし」ブロックに複数条件を設定することができます。ちなみに、ここはなぜか日本語化されていません。
![画像16](https://assets.st-note.com/production/uploads/images/59770000/picture_pc_5dc5c98514b3f178f562ebe8904e6c08.gif)
「もし」ブロックの種類を変えて、「if - else if」のタイプのブロックにしたもので、上のプログラムと同等に書くと、このようになります。
もちろん、「そうでなくもし」の条件は「≠ true」のパターンも考えられます。そして、これらは書き方は違いますが、プログラム的には(ほぼ)等価です。
![画像12](https://assets.st-note.com/production/uploads/images/58568934/picture_pc_a6029fa8a5ac039e5762c70c657b6311.png)
さらに、「if - else」タイプでも同じ動作は実現できます。
![画像13](https://assets.st-note.com/production/uploads/images/58569433/picture_pc_7afd092edeb27cb829d67c617b266e8c.png)
ちょっと高度な話
もっというと、そもそも、「もし」ブロックは(条件)がtrueだったら(処理)をするというブロックです。この(条件)に「Get charge state = true」を当てはめました。つまり「Get charge state = true」全体が「もし」ブロックに対して「True」を返します。「Get charge state」は充電状態なら「True」、非充電状態なら「False」を返すので、条件に直接「Get charge state」を当てはめても同じことになります。
![画像14](https://assets.st-note.com/production/uploads/images/58571564/picture_pc_c3daf1e71f752e877d6c3d552b9520c3.png)
このように、同じ機能を実現するにしても、書き方はいろいろあります。したがって、動きが同じでも、プログラムを書く人によって書き方は違ってきたりします。「この書き方が妥当かなぁ」というのはあっても、「この書き方が正解!」というものはないのです。
ちなみに、個人的には一番最後のパターンがプログラム的にはすっきりしていてよいかなぁと思います。あくまで個人的には、ですが。
どの書き方でもよいので、プログラムを転送すると、USBで充電されているときにはLEDが点灯し、USBのプラグが抜かれて充電状態でなくなるとLEDが消灯すると思います。
あ、そうそう。充電が完了して100%になるとM5StickC Plusのバッテリ管理用IC(PMIC)がバッテリ保護のために充電をやめて、充電状態ではなくなります。USBケーブルを指していても「False」を返すようになりますので、「あれ?ケーブルを指してるのにFalseだぞ?」となりかねないので、注意してください。