点滅LEDとボタンのプログラム問題(ESP32、Arduino IDE) | a24a24a24のブログ

a24a24a24のブログ

アメピグ残党。
釣り、温泉、お出かけ、パソコン。最近、電子工作。

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行になりました。

いいか悪いかは別として、ちゃんと動きます。

 

 

 

最低限の処理ならば、この辺りが正解に近いのかもしれません。