Arduinoで遊んでいて、スイッチを使い始めました。
スイッチを押すと、状態反転させたいのですが、チャタリングが起きてうまいこと動作しません。
delayを使うと画面表示等が止まってしまうためなにか方法はないかと思い、検索してみたが、殆どdelayやwhileでフックするスケッチしかなかったので、自分なりに考えて書いてみました。
カップリングコンデンサも必要ありません。
スイッチのチャタリングが20ms以内に終わって安定するならほぼ確実に動作するはずです。
INPUT_PULLUPしているので、スイッチは7番ピンとGNDを繋ぐだけです。
スイッチがなければ、7番ピンに繋いだワイヤーをGNDとチョンチョンさせれば動作確認できます。
LEDは適当に200~300Ωくらいの抵抗を5番ピンの出力にかましてください。
#define LED_PIN 5
#define SW_PIN 7
#define READ_INTERVAL 20//ms
void setup() {
pinMode(LED_PIN, OUTPUT);//LED出力
pinMode(SW_PIN, INPUT_PULLUP);//入力
}
unsigned long timer, old_timer;
bool states, value, old_value;
void loop() {
//READ_INTERVAL[ms]毎にスイッチの読取り
timer = millis();
if ( (timer - old_timer) >= READ_INTERVAL) {
old_timer = timer;
value = !(digitalRead(SW_PIN));//SW (ON=1 / OFF=0)
}
//スイッチの状態を取得
int sw_states = 0;
if (value == HIGH && old_value == LOW) {
sw_states = 1;//スイッチが押された瞬間
} else if (value == LOW && old_value == HIGH) {
sw_states = 2;//スイッチを離した瞬間
} else if (value == HIGH && old_value == HIGH) {
sw_states = 3;//スイッチが押されている
} else {
sw_states = 0;//スイッチが押されていない
}
old_value = value;
//スイッチの状態に応じて動作を変更
switch (sw_states) {
case 0://スイッチが押されていない
//states = LOW;
break;
case 1://スイッチが押された瞬間
states = !states;
break;
case 2://スイッチを離した瞬間
//states = !states;
break;
case 3://スイッチが押されている
//states = HIGH;
break;
}
//LEDにステータス反映
digitalWrite(LED_PIN, states);
}
ブログ一覧 |
Arduino | パソコン/インターネット
Posted at
2022/02/20 22:03:55