読者です 読者をやめる 読者になる 読者になる

プログラミング素人のArduino

技術屋の末端。プログラミングは専門外。 電気回路も専門外です。 コードに間違いなど見つけられたら、気軽にコメントください。 VC#始めました。

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

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

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

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



状態の表現として、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つの状態にできました。

■ソース
http://www.zg.em-net.ne.jp/~sn123456789/151108.html