. Arduinoでボタン入力 – Rephtone
Arduinoでボタン入力 – Rephtone
Arduinoでボタン入力 – Rephtone

Arduinoでボタン入力

ここで、これで良いと思って実際にコンパイルと書き込みを行なっても、きちんと思ったような動作が起きないです。なぜかというと、 loop() が繰り返し実行されるからで、Arduinoの実行速度(クロック数)が人の動きよりもずっと早く、スイッチを押している間もこのloop()関数がひたすら周り続けているためです。そのためボタンを押している間ひたすらに state は1と0を切り替えてしまう、というわけですね。そこで、ボタンを押したら必ず1回だけstateの状態を入れ替える、というようにしないといけません。

コードの修正 (Toggle その2) //Gate Switch int const LED = 13; int button = 7; int val; int valOld; boolean state; void setup() < pinMode(LED, OUTPUT); pinMode(button, INPUT); >void loop() < val = digitalRead(button); if((val == HIGH)&&(valOld == LOW))< state = !state; >valOld = val; if(state == HIGH)< digitalWrite(LED,HIGH); >else < digitalWrite(LED,LOW); >>

ここで、新しい変数 valOld が出てきました。ボタンを押した一周目は val == HIGH で valOld == LOW なので (val == HIGH)&&(valOld == LOW) は真になります。if文の処理ののちに valOld = val となるので、ボタンを押した2周目以降は valOld == HIGH なのでif文は実行されなくなります。

チャタリング対策はmsレベルの delay() を加えることで解決します。

/Gate Switch int const LED = 13; int button = 7; int val; int valOld; boolean state; void setup() < pinMode(LED, OUTPUT); pinMode(button, INPUT); >void loop() < val = digitalRead(button); if((val == HIGH)&&(valOld == LOW))< state = !state; >valOld = val; if(state == HIGH)< digitalWrite(LED,HIGH); >else < digitalWrite(LED,LOW); >delay(10); >

ただし、 delay() 関数は極力使わない方が良いということは覚えておいてください。そのため、スイッチのチャタリング対策はハード面・ソフト面において様々な方法で行われています。

まとめ

Add your Biographical Information. Edit your Profile now.

ArduinoでHello World ArduinoでPWM Related Posts KiCADで回路設計 MiniMadとRaspberry Pi WeAct STM32F411CE (Black Pill) の書き込み (備忘録)

You May Have Missed

NewsBlogger - Magazine & Blog WordPress テーマ 2026 | Powered By SpiceThemes

📎📎📎📎📎📎📎📎📎📎