さて、問題は何となくわかりましたが、どうすれば修正できるでしょうか?
1. の問題は、スイッチの状態を確認した後、少し待つ(ディレイ)を入れることで解決できそう。
2. の問題は、前の状態を格納する変数を使い、それと現在の状況を比較することで解決ができそうです。
はい。コードを修正したのが下記のスケッチです。
// 7番ピンに接続したスイッチが押されている間、12番ピンに接続した LED を点灯する const int LED = 12; // LED が接続されているピン const int BUTTON = 7; // スイッチが接続されているピン int val = 0; // 入力ピンの状態を val に格納する int old_val = 0; // 入力ピンの直前の状態を格納する int status = 0; // LED の状態を示す (0 = OFF / 1 = ON) void setup() { pinMode(LED,OUTPUT); // 12番のピンは出力 pinMode(BUTTON,INPUT); // 7 番のピンは入力 } void loop() { val = digitalRead(BUTTON); // 入力を読み取り val に格納 // 7番ピンの状態が HIGH (ボタンが押されたら)になったら、状態 status を変更する if ((val == HIGH) && (old_val == LOW)) { status = 1 - status; delay(10); } old_val = val ; // 現在の状態を old_val に格納 if (status == 1) { digitalWrite(LED,HIGH); // LED を点ける } else { digitalWrite(LED,LOW); // LED を消す } }
電子機器が大好きです。
プログラムを書くのをお仕事としていたこともあるので、両方できる PIC や Arduino を使って、いろいろな(役にあんまり立たない)ものを作っています。
実は UNIX 関連のお仕事も長かったので、Raspberry Pi もお手の物なのですけれど、これから触る機会が多くなるのかなぁ。
ボチボチ行きますが、お付き合いください。
若いころの写真なので、現時点では、まだ髪の毛は黒くてありますが、お髭は真っ白になりました。
愛車の国鉄特急カラーのカスタムしたリトルカブで、時々、秋月電子通商の八潮店に出没します。