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