Yahoo知恵袋で、ちょっと面白いプログラム問題を見つけました。
Arduinoのプログラムについて質問です。スイッチA,BとLEDがあり... - Yahoo!知恵袋
あー。これなー。
引っ掛けポイントがてんこ盛りです。Arduinoで、と書いてあるのがこれまた。
学校の課題か何かですかね。
という訳で、作ってみました。
マイコンボードは手元のESP32とArduino IDE、
LEDとボタンは、内蔵LED、BOOTボタンで代用します。
まず、スイッチAとスイッチBは、よく読むと同じ機能なので、ボタン1個と考えます。
LEDを自動点滅しながら、ボタンを読み取りON/OFFスイッチを実現するため、
リアルタイムっぽい処理が必要です。
押す人がボタンを何ミリ秒押すか分からないので、
ボタンを押し続けても繰り返し反応しない処理や、チャタリング防止処理も必要です。
(慣れないとたぶん一番手間取る)
自分の作った回答が、こちら。
乱暴な書き方の部分もありますが、ご容赦を。
点滅は0.5秒間隔、ボタン検出間隔は10ミリ秒、チャタリング防止50ミリ秒。
条件を満たして、ちゃんと動きます。作成時間は20分程でした。
現実的なボタン検出間隔delay()をさっさと決めて、for()で回しちゃうのがポイントで
正攻法で作ると、ドツボにはまるかもしれません。
なおボタンを5900時間押し続けるとオーバーフローしますが、補正は省略しています。
追記:
Yahoo知恵袋に寄せられた回答を見ると、似て非なる物でした・・・何故に。
点滅はmillis()%500と時間を引っ張ってきている人もいて、なるほどと思いました。
追記2:
試しにチャタリング防止を削って、点滅をmillis()で測ったら、
メインが2行になりました。
いいか悪いかは別として、ちゃんと動きます。
最低限の処理ならば、この辺りが正解に近いのかもしれません。