プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

タクトスイッチ一つで状態を切り替える

今日は、タクトスイッチで複数の状態を遷移する方法を考えます。

入力として、スイッチが押されたことを検知すると、状態0→状態1→状態2→状態0→ …
という風に変わることを実装します。
これができると、一つのタクトスイッチで、たとえばLEDのONとOFFを切り替えることができます。

回路は前回使ったものを流用しています。

f:id:s51517765:20170826172131j:plain

状態の表現として、sという文字を定義します。

 s = 0; //状態を格納

for(;;)で常にループさせて、タクトスイッチを監視し続けます。

if (digitalRead(7) == LOW) { //タクトスイッチが押されたことを検知
     s = s + 1; //状態を進める
     if (s > 2) //3水準なので0,1,2の次は0
       s = 0;
     delay(20);

ifで7pinを監視し、押されたことを検知したら、状態sを進めます。
s=3となったときは、0に戻すことで3水準が作れます。
2水準でよければ、s > 1とすればLEDのONとOFFを切り替えられますが、ここでは実験として、LEDを3段階に明るさを変化させるようにしました。
delayはチャタリング防止です。数値は適当ですので、環境によって最適化が必要です。

プログラムが複雑になってくると、初心者にはどこの状態にいるのか分からなくなるので、ポイントごとに適当な数字を表示させるなどするとバグ出しに便利です。
状態ごとに s の値(状態No)を表示させることを考えるのと、繰り返した回数が分かるように i を設定しました。

 Serial.print(i);
   Serial.print("s=");
   Serial.println(s);

タクトスイッチが押されたことを検知して

while (digitalRead(7) == LOW) {} 

ifでsの数値によって、3つの状態の動作に移ります。

if (s == 0) {}
if (s == 1) {}
if (s == 2) {}

3つの状態にできました。

//ボタンを押すごとにs=0~2の状態に遷移
 int s = 0;
 int i = 0;
 void setup()
 {  Serial.begin(1200); 
  pinMode(5, OUTPUT); 
} 

void loop() {
  s = 0;  for (int i = 0;; i++)  { //繰り返しの設定    
delay(400); //チャタリング防止    
if (digitalRead(7) == LOW) { //タクトスイッチが押されたことを検知      
s = s + 1; //状態を進める      
if (s > 2) //3水準なので0,1,2の次は0        
s = 0;      
delay(20);      
if (i > 30) //繰り返し動作の状態の確認        
i = 0;      
delay(20);     
 
while (digitalRead(7) == LOW) {} //タクトスイッチが押されたことを検知    
}

    if (s == 0) {      //第一の状態      
analogWrite(5, 1);    
}   

    if (s == 1) {      //第二の状態      
analogWrite(5, 50);    
}    

    if (s == 2) {      //第三の状態      
analogWrite(5, 250);    
}    

Serial.print(i);    
Serial.print("s=");    
Serial.println(s);  

} //forのend 
}