ゆるく楽しむプログラミング

Seeeduino XIAOで「学校のチャイム」をタイマー制御してみる:ボタン操作

時刻合わせやチャイムの設定などで外部からの操作を行えるようにする必要があります。
ボタン状態の読み取り方法は素直に考えればデジタル入力でON/OFFを検知すれば良いのですが、後々の事を考えて(?)
ATTinyGameの回路を参考にしました。

こんな感じで、ピンにかかる電圧をアナログ入力で読み取って
どのボタンが押されているのかを電圧の変化で検出します。

抵抗値は手元にあったモノを適当に使いました。
何も押してない/S1を押してる/S2を押してる/S1とS1を同時に押してる
で各々Arduinoピンにかかる電圧が変われば何でも良いです。
各々の電圧値が近すぎると誤差の範囲で値が重なって誤動作するので程度に違う電圧値になるのが理想。

※抵抗が小さすぎると無駄に電流が流れるので10KΩ以上はあった方が良いと思う。


前回の回路にボタンを付け足してます。
若干、窮屈になってますが上のボタン回路を2セット組み込んでます。

各ボタンを押したときのアナログ値は後で使いますのでメモしておきます。
私が組んだ状態では
S1 - 616~618
S2 - 824~826
S1+S2 - 537~539
となりました。

ザックリ
アナログ値÷100 で計算して
6 = S1が押されてる
8 = S2が押されている
5 = S1とS2が押されている
と判定できます。

各ボタン値の読み取り確認

アナログで読み込んだ時の値を確認してボタン状態の判定のデータを取ります。
-- 本文 -- -- LIST --

#include 
#include 

// ボタン
#define BTN0_PIN 7
#define BTN1_PIN 8

int button0Stat ; // ボタン1・2の状態
int button1Stat ; // ボタン3・4の状態

// 表示用Buffer
char dispStr[20] ;

void setup(){
  // マスタとしてI2Cバスに接続する
  Wire.begin();
  // OLEDの初期表示
  oled.init();                      // Initialze SSD1306 OLED display
  oled.clearDisplay();              // Clear screen
  oled.setTextXY(0,2);              // Set cursor position, start of line 0
  oled.putString("-----------");
  oled.setTextXY(1,2);              // Set cursor position, start of line 1
  oled.putString("Hello World");
  oled.setTextXY(2,2);              // Set cursor position, start of line 2
  oled.putString("-----------");
}

void loop() {
  button0Stat = analogRead(BTN0_PIN) ; // S1/S2の状態:アナログ値
  button1Stat = analogRead(BTN1_PIN) ; // S3/S4の状態:アナログ値

  sprintf(dispStr,"STAT1:%04d",button0Stat) ;
  oled.setTextXY(4,2); 
  oled.putString(dispStr);	// S1/S2のアナログ値表示

  sprintf(dispStr,"STAT2:%04d",button1Stat) ;
  oled.setTextXY(5,2); 
  oled.putString(dispStr);	// S1/S2のアナログ値表示

  delay(100) ;
}



※サンハヤトの穴数が1列多いブレドボード(SAD-101 ニューブレッドボード)を使っているので図面とチョット違います。