/* * 参考URL * * 意外と知られていない?INPUT_PULLUP スイッチサイエンス マガジン * http://mag.switch-science.com/2013/05/23/input_pullup/ * * Arduinoで物理ボタンを作る (目立つボタンで「ッターーン!」しよう) * http://qiita.com/ie4/items/7c6764469f3d41c93a19 * * Arduinoのスケッチだけでスイッチのチャタリングを回避する * http://jumbleat.com/2016/08/19/switch_without_chatter/ * * 続・プログラミングでチャタリング回避 * http://jumbleat.com/2016/12/01/revision_of_avoiding_chatter/ */ #define MAYBE_STABLE 1000 // Arduino UNOで実測した限りではループでのctが5000くらいだったのでそれより小さい値として1000くらいにした #define SW_NUM 3 // pin監視するスイッチの数 const int buttonON = LOW; // ボタンが押されているとピンの値はLOW const int buttonOFF = HIGH; // ボタンが押されていないとピンの値はHIGH const int buttonPin = 7; const int ledPin = 13; boolean sw_status_arr[SW_NUM] = {false,false,false}; // 最初はOFF const int btn_pin_arr[SW_NUM] = {5, 6, 7}; const int led_pin_arr[SW_NUM] = {13, 13, 13}; void setup() { // Arduinoの標準設定は、デフォルトは8bit、パリティなし、1ストップビット(SERIAL_8N1),通信相手も同じ条件にすること Serial.begin(9600); //pinMode(ledPin, OUTPUT); for ( int i=0; i < SW_NUM; i++ ) { pinMode(btn_pin_arr[i], INPUT_PULLUP); pinMode(led_pin_arr[i], OUTPUT); } } void loop(){ for ( int i=0; i < SW_NUM; i++ ) { detect_button(i); } } int detect_button(int idx){ int btn_pin=btn_pin_arr[idx]; int led_pin=led_pin_arr[idx]; boolean status=sw_status_arr[idx]; unsigned long ct=0; boolean detect_changed = false; int buttonState = 0; // on状態の変化を検出 buttonState = digitalRead(btn_pin); while (buttonState == buttonON) { ct++; if ( ct > MAYBE_STABLE ) { if ( ! status ) { status=!status; detect_changed=true; } else { // 既にON状態を識別済み } break; } buttonState = digitalRead(btn_pin); } // off状態の変化を検出 if ( ct == 0 ) { // buttonState = digitalRead(btn_pin); while (buttonState == buttonOFF) { ct++; if ( ct > MAYBE_STABLE ) { if ( status ) { status=!status; detect_changed=true; } else { // 既にOFF状態を識別済み } break; } buttonState = digitalRead(btn_pin); } } if ( detect_changed ) { Serial.print(btn_pin); if ( status ) { // シリアル Serial.println(",on"); } else { Serial.println(",off"); } } if (buttonState == buttonON) { // ボタンが押されていたら digitalWrite(led_pin, HIGH); } else { digitalWrite(led_pin, LOW); } sw_status_arr[idx]=status; return buttonState; }