Cambiare codice da pulsante normale ad interruttore on/off

Salve a tutti,
sempre per il mio progetto cockpit per flight simulator vorrei chiedere delle delucidazioni sull'uso di un interruttore on/off.

Attualmente nel progetto ho i classici bottoni a rilascio.

Per esempio ho un bottone che comanda da Leonardo, con funzione Keyboard, l'accensione e lo spegnimento del motore dell'aereo.
Default motore su pista spento. Se premo il pulsante si accende tramite comando tastiera "e" e si accende il led verde per un attimo, se lo ripremo il motore si spegne e si accende il led rosso per un attimo con comando tastiera "r"

Ora, io nella costruzione del cruscotto, vorrei sostituire il pulsante con un comune interruttore on/off a due pin, negativo e positivo.

Come devo adattare il codice?. Ho provato a scrivere qualche modifica. Ma praticamente, se l'interruttore è on continua in loop a premere il tasto keyboard corrispondente e ad accendersi il led verde e così al contrario quando è off.
Cioè vorrei che seleziono uno dei due stati dell'interruttore ed esegua il comando una sola volta.

Qui vi riporto il codice, ma con l'uso del bottone...come lo riadatto per l'interruttore?.

#define Engines_OnOff 4
#define Buzzer 11
#define led_red 12
#define led_green 13

String eng_stateOn = " On";
String eng_stateOff = "Off";
int stato_engines = 0;

void setup() {
  lcd.init();  //setup iniziale lcd
  lcd.backlight();
  pinMode(Engines_OnOff, INPUT);   
  pinMode(Buzzer, OUTPUT);         
  pinMode(led_red, OUTPUT);        
  pinMode(led_green, OUTPUT);       
  schermata_default();
}
void loop() {
  pulsanteEngine();
}

void pulsanteEngine() {
  int varlettura_pulsante_engine = digitalRead(Engines_OnOff);
  if (varlettura_pulsante_engine == 1) {
    stato_engines++;
    tone(Buzzer, toneBuzzer, durBuzzer);
    if (stato_engines == 1) {
      Keyboard.begin();
      Keyboard.press('e');
      Keyboard.println(" Engine On");
      digitalWrite(led_green, HIGH);
      delay(200);
      digitalWrite(led_green, LOW);
      Keyboard.releaseAll();
      lcd.setCursor(5, 1);
      lcd.print(eng_stateOn);
      delay(400);
    } else if (stato_engines > 1) {
      stato_engines = 0;
      Keyboard.press('r');
      Keyboard.println("Engine Off");
      digitalWrite(led_red, HIGH);
      delay(200);
      digitalWrite(led_red, LOW);
      lcd.setCursor(5, 1);
      lcd.print(eng_stateOff);
      delay(400);
    }
  }
}

void schermata_default() {
    //cornice schermo
    lcd.setCursor(0, 0);
    lcd.print(cornice_simbolo);
    lcd.setCursor(1, 0);
    lcd.print(cornice_simbolo);
    lcd.setCursor(2, 0);
    lcd.print(cornice_simbolo);
    lcd.setCursor(3, 0);
    lcd.print(cornice_simbolo);
    lcd.setCursor(4, 0);
    lcd.print(cornice_simbolo);
    lcd.setCursor(5, 0);
    lcd.print(cornice_simbolo);
    lcd.setCursor(6, 0);
    lcd.print(cornice_simbolo);
    lcd.setCursor(8, 0);
    //fine cornice
    lcd.print("INFO");
    lcd.setCursor(13, 0);
    lcd.print(cornice_simbolo);
    lcd.setCursor(14, 0);
    lcd.print(cornice_simbolo);
    lcd.setCursor(15, 0);
    lcd.print(cornice_simbolo);
    lcd.setCursor(16, 0);
    lcd.print(cornice_simbolo);
    lcd.setCursor(17, 0);
    lcd.print(cornice_simbolo);
    lcd.setCursor(18, 0);
    lcd.print(cornice_simbolo);
    lcd.setCursor(18, 0);
    lcd.print(cornice_simbolo);
    lcd.setCursor(19, 0);
    lcd.print(cornice_simbolo);
    lcd.setCursor(9, 1);
    lcd.print(cornice_simbolo);
    lcd.setCursor(9, 2);
    lcd.print(cornice_simbolo);
    lcd.setCursor(9, 3);
    lcd.print(cornice_simbolo);
    lcd.setCursor(10, 1);
    lcd.print(cornice_simbolo);
    lcd.setCursor(10, 2);
    lcd.print(cornice_simbolo);
    lcd.setCursor(10, 3);
    lcd.print(cornice_simbolo);
    //fine cornice
    //quadrante
    lcd.setCursor(0, 1);
    lcd.print("Eng ");
    lcd.setCursor(5, 1);
    lcd.print(eng_stateOff);
    lcd.setCursor(12, 1);
    lcd.print("Flap ");
    lcd.setCursor(18, 1);
    lcd.print(potFlapsVal / 10 % 10);
    lcd.print(potFlapsVal % 10);
    lcd.setCursor(0, 2);
    lcd.print("Gear ");
    lcd.setCursor(5, 2);
    lcd.print(Landing_GearOn);
    lcd.setCursor(12, 2);
    lcd.print("Trim ");
    lcd.setCursor(17, 2);
    lcd.print(" 00");
     lcd.setCursor(17, 3);
    lcd.print(" 00");
    lcd.setCursor(0, 3);
    lcd.print("APil ");
    lcd.setCursor(5, 3);
    lcd.print(Autopilot_stateOff);
  }

Bisogna aggiungere una variabile lettura_precedente. Se la nuova lettura attuale è uguale alla precedente non si fa niente. Se è diversa si fa quello che serve, e si aggiorna la variabile lettura precedente alla lettura attuale. Si chiama "edge detect", riconoscimento dei fronti.

Sintetizzato:

bool a = digitalRead(PIN);
if (a != b)
{
    b = a;
    ....fai cose....
}

Dove 'b' deve essere una variabile che mantiene il valore, quindi o globale esterna alla funzione, oppure di tipo static se dichiarata all'interno della funzione.