プッシュスイッチでLEDをONにしたままにする

プッシュスイッチでLEDをONにしたままにする

X-Plane コクピットの自作に挑戦!

Hightのときに単純にLEDを点灯する方法は色々記述したサイトは多いが、プッシュボタンのように一度押して離すとOnからOffになる、Offになっっても、そのままLEDを点灯させる方法が仲々見つからなかったがありました。

ここを参考にしました。ありがとうございます。

プッシュスッチによるtoggle動作のプログラム

これは、2つのピンが必要になる。入力ピン(プッシュボタン)と出力ピン(LED等)。
時々、やはりチャタリングが起きているのか、押しても点灯しないなど反応しないときもあります。

// Filename:SW03
 
const int led=7;      //LEDピン
const int sw=15;      //プッシュボタンのピン
int currentState, previousState=LOW; //現在の状態、以前の状態
int ledState=LOW;     //最初のLEDの状態
 
void setup(){
  pinMode(led, OUTPUT);    //LEDは出力
  pinMode(sw, INPUT);    //スイッチは入力
}
 
void loop(){
   currentState=digitalRead(sw);
   if(currentState != previousState){ //エッジ検出
       previousState=currentState;
      if(currentState == HIGH) {
          ledState = !ledState;    // トグルアクション
          digitalWrite(led, ledState);
      }
    
 }
}

LED点灯をトグルにする方法がもう一つあります。これも時々反応しないときがあり、押し直しが必要なときがあるが、大体トグルで点灯、消灯を行うことができます。

//Example 03A: ボタンを押すとLEDが点灯し、 
//ボタンを離したあとも点いたままにする。 
//バウンジングを解消する簡単な方法を取り入れた改良版 
#define LED 11
#define BUTTON 10
int val = 0; //入力ピンの状態がこの変数(val)に記憶される 
int old_val = 0; //valの前の値を保存しておく変数 
int state = 0; //LEDの状態(0ならオフ、1ならオン) 
 
void setup() { 
  pinMode(LED, OUTPUT); //ArduinoにLEDが出力であると伝える 
  pinMode(BUTTON, INPUT); //BUTTONは入力に設定 
} 
 
void loop() { 
  val = digitalRead(BUTTON); //入力を読み取りvalに格納 
//入力がHIGH(ボタンが押されている)なら状態(state)を変更 
  if((val == LOW) && (old_val == HIGH)) { //LOW、HIGHを逆にすると押上たときに点灯するようになる
    state = 1 - state; 
    delay(10); //この位がチャタリングが起きない(10だと時々起きる)
  } 
   
  old_val = val; //valはもう古くなったので保持しておく 
  if(state ==1){ 
    digitalWrite(LED, HIGH);   //最初をHIGHにすると最初から点灯する
  } 
  else { 
    digitalWrite(LED, LOW); 
  } 
}

実際のX-Planeの場合です
例としてB747-400のF/Dスイッチでやってみました。プッシュボタンでは、一般的なスケッチでいくとON-OFFになってしまって、ONの状態OFFの状態を保持できませんが、下のスケッチでそれが実現できます。1回押したらON、もう一回押したらOFFになります。

const int sw=10;     //プッシュボタンのピン      //LEDピン(X-Planeに出力)
 
int currentState, previousState=LOW; //現在の状態、以前の状態
     //最初のLEDの状態(X-Planeに出力の状態)
FlightSimInteger AutothrottleEngage;
 
void setup(){
  pinMode(sw, INPUT); 
  AutothrottleEngage = XPlaneRef("sim/cockpit/autopilot/autopilot_mode");
}
 
void loop(){
  FlightSim.update();
  currentState=digitalRead(sw);
  if(currentState != previousState){ //エッジ検出
    previousState=currentState;
    if(currentState == HIGH) {
        AutothrottleEngage = !AutothrottleEngage;  // ここがトグルアクション
         digitalWrite(sw, AutothrottleEngage);
     }
  }
}