H35H0

        О способах инвазии:

        Чтобы пользоваться технологиями, следует включить мозг.
        Лучше всего получится, если думать так, как автор, эту 
        технологию создавший. В фильме "День независимости II" 
        люди вовсю используют "Alien technologies". 
        Так как там думал автор?

Arduino UNO. Простой вексель
----------------------------

  void setup()
  {
    pinMode( 13, OUTPUT);
    pinMode( 3, INPUT_PULLUP);
  }

  void loop()
  {
    if ( !digitalRead( 3)) digitalWrite( 13, HIGH);
  }

Автоматическое отключение подсветки
-----------------------------------

Примечание: UnoArduSim не компилирует C.
            Вы должны поменять конструкцию возле ...."HIGH),"..

  const long lightOff = 5000;
  unsigned long lightOn;

  void setup()
  {
    pinMode( 13, OUTPUT);
    pinMode( 3, INPUT_PULLUP);
    lightOn = millis();
  }

  void loop()
  {
    if ( !digitalRead( 3))
      digitalWrite( 13, HIGH), lightOn = millis();
    if ((unsigned long)(millis() - lightOn) > lightOff)
      digitalWrite( 13, LOW);
  }

On-Off с той же кнопки. Не работает на реальных устройствах
-----------------------------------------------------------

Реальная кнопка имеет много НИЗКИХ ВЫСОКИХ фронтов при однократном нажатии. Это называется «подпрыгивая». Необходим аппаратный или программный debouncer. ".., delay(100) .." здесь играет роль бедного человека-дебонсора (честно говоря, это ужасно плохое решение)

  volatile byte state = LOW;
  volatile byte was3 = HIGH; 
  
  void setup()
  {
    pinMode( 13, OUTPUT);
    pinMode( 3, INPUT_PULLUP);
  }

  void loop()
  {
    byte is3 = digitalRead( 3);
    if ( was3 == HIGH && is3 == LOW)
      digitalWrite( 13, state = !state), delay( 100);
    was3 = is3;
  }
  
Arduino UNO. Кнопки на 0, 2, 3. Прерывания
------------------------------------------

Существуют и другие способы игры с тремя кнопками и прерываниями:

1. Используйте прерывания PCINT. Они реагируют медленнее, поэтому меньше проблем с обрезкой.

2. Кнопка «0» - INT0 (Pin2-GND), кнопка «1» - INT1 (Pin3-GND),
   Кнопка «Ввод» (Pin2-GND + Pin3-GND, диоды на провода «И»).

ПРИМЕЧАНИЕ: прерывания таймера имеют более низкий приоритет, чем INT0 или INT1, поэтому millis(), delay() и т.д. заморожены во время ISR (процедура обслуживания прерывания). Кроме того, это плохой стиль ожидания внутри ISR, delayMicroseconds не использует прерывания, поэтому его можно использовать (дурная привычка, опять же).

3. Решение от Многофункционального щита Arduino [8].
   
4. Использование прерывания последовательного интерфейса. Протестировано на UnoArduSim и реальном устройстве Uno
 
  const int debounce = 50;
  volatile byte s0 = 0;
  volatile byte s2 = 0;
  volatile byte s3 = 0;
  volatile unsigned long m = 0;

  void serialEvent() {
    while (Serial.available()) Serial.read();
    s0 = !s0;
    digitalWrite( 11, s0);
  }

  void int0() {
    unsigned long vm =  millis();
    if ((unsigned long)(vm - m) > debounce) {
      s3 = !s3;
      digitalWrite( 12, s3);
    }
    m = vm;
  }

  void int1() {
    unsigned long vm =  millis();
    if ((unsigned long)(vm - m) > debounce) {
      s2 = !s2;
      digitalWrite( 13, s2);
    }
    m = vm;
  }

  void setup()
  {
    pinMode( 13, OUTPUT);
    pinMode( 12, OUTPUT);
    pinMode( 11, OUTPUT);
    pinMode( 3, INPUT_PULLUP);
    pinMode( 2, INPUT_PULLUP);
    pinMode( 0, INPUT_PULLUP);
    Serial.begin(9600); // intSerial
    attachInterrupt(0, int0, FALLING);
    attachInterrupt(1, int1, FALLING);
  }

  void loop()
  {
  }

------------------------------------------------------------------------

lastUP. +Кнопка 4 как сброс
---------------------------

  const int debounce = 50;
  volatile unsigned long m = 0;

  void allDown() {
    for (int p=11; p<=13; p++) digitalWrite( p, LOW);
  }
  
  void lastUp( int apin) {
    allDown();
    digitalWrite( apin, HIGH);
  }
  
  void serialEvent() {
    while (Serial.available()) Serial.read();
    lastUp( 11);
  }
  
  void int0() {
    unsigned long vm =  millis();
    if ((unsigned long)(vm - m) > debounce) {
      lastUp( 12);
    }
    m = vm;
  }
  
  void int1() {
    unsigned long vm =  millis();
    if ((unsigned long)(vm - m) > debounce) {
      lastUp( 13);
    }
    m = vm;
  }
  
  void setup()
  {
    pinMode( 13, OUTPUT);
    pinMode( 12, OUTPUT);
    pinMode( 11, OUTPUT);
    pinMode( 4, INPUT_PULLUP);
    pinMode( 3, INPUT_PULLUP);
    pinMode( 2, INPUT_PULLUP);
    pinMode( 0, INPUT_PULLUP);
    Serial.begin(9600); // intSerial
    attachInterrupt(0, int0, FALLING);
    attachInterrupt(1, int1, FALLING);
  }
  
  void loop()
  {
    if( !digitalRead( 4)) allDown();
  }

------------------------------------------------------------------------

Ссылки
------

1. Nick Gammon Arduino Uno interrupts post.

  http://gammon.com.au/interrupts
  
2. Debouncing a Button with Arduino. Limor Fried code.

  https://programmingelectronics.com
        /tutorial-19-debouncing-a-button-with-arduino-old-version/

3. Отличие INT и PCINT

  http://arduino.ru/forum/apparatnye-voprosy/otlichie-int-i-pcint
  
4. Arduino: How do you reset millis()? by James Lewis

  https://www.baldengineer.com/arduino-how-do-you-reset-millis.html
  
5. Simple Pin Change Interrupt on all pins (Официальный)

  http://playground.arduino.cc/Main/PinChangeInterrupt
  
6. Pin-change interrupts on Arduino (Лучшая статья, я верю)

  http://www.geertlangereis.nl/Electronics
        /Pin_Change_Interrupts/PinChange_en.html
        
7. ATMega 328 PCINT Example. by Wollw. 
   (frankensteinXOXO commented on Mar 1, 2016: great)

  https://gist.github.com/Wollw/2598827
  
8. 原理图.pdf (Arduino Multifunctional Shield)

  http://www.baaqii.com/promanage/manual/A1010.zip