Включение и выключение с Arduino: Нажми — включи, отпусти — выключи

Нажми для включения, отпусти для выключения

Это руководство демонстрирует, как управлять светодиодом с помощью кнопки на Arduino. Когда кнопка нажата — светодиод включается; когда отпущена — выключается.

Схема подключения

Подключение пинов:

  • Пин D10: резистор 330 Ом + светодиод к GND

  • Пин D2: резистор 10 кОм к GND + кнопка к VCC

Макетная плата Схема подключения

Скетч: Очень простой — нажми для включения, отпусти для выключения

//  Sketch : Very simple press for on, release for off
//  www.martyncurrey.com
//
//  A very simple example of turning an LED on and off using a button switch
//
//  Pins
//  D10 to resister and LED
//  D2 to push button switch
//

// Define the pins being used
int pin_LED = 10;
int pin_switch = 2;

void setup()
{
    Serial.begin(9600);
    Serial.print("Sketch:   ");   Serial.println(__FILE__);
    Serial.print("Uploaded: ");   Serial.println(__DATE__);
    Serial.println(" ");

    pinMode(pin_LED, OUTPUT);
    digitalWrite(pin_LED,LOW);

    pinMode(pin_switch, INPUT);
}

void loop()
{
    if ( digitalRead(pin_switch) == HIGH)
    {
       digitalWrite(pin_LED, HIGH);
    }
    else
    {
       digitalWrite(pin_LED, LOW);
    }
}

Пояснение кода

Скетч использует осмысленные имена переменных для читаемости вместо «голых» номеров пинов:

int pin_LED = 10;
int pin_switch = 2;

Режимы пинов настраиваются в функции setup:

pinMode(pin_LED, OUTPUT);
pinMode(pin_switch, INPUT);

Пин светодиода инициализируется в состояние LOW — это хорошая практика.

В функции loop состояние кнопки непрерывно проверяется:

if ( digitalRead(pin_switch) == HIGH)
   digitalWrite(pin_LED, HIGH);
else
   digitalWrite(pin_LED, LOW);

Этот подход непрерывно опрашивает (poll) кнопку и обновляет состояние светодиода соответственно.

Нажми для включения, отпусти для выключения: Улучшенная версия

Более эффективная версия использует обнаружение изменения состояния, обновляя светодиод только при необходимости:

//  Sketch: Press for on, release for off. Slightly refined
//  www.martyncurrey.com
//
//  An  example of turning an LED on and off using a button switch
//
//  Pins
//  D10 to resister and LED
//  D2 to push button switch
//

// Define the pins being used
int pin_LED = 10;
int pin_switch = 2;

// variables to hold the new and old switch states
boolean oldSwitchState = LOW;
boolean newSwitchState = LOW;

void setup()
{
    Serial.begin(9600);
    Serial.print("Sketch:   ");   Serial.println(__FILE__);
    Serial.print("Uploaded: ");   Serial.println(__DATE__);
    Serial.println(" ");

    pinMode(pin_LED, OUTPUT);
    digitalWrite(pin_LED,LOW);

    pinMode(pin_switch, INPUT);
}

void loop()
{
    newSwitchState = digitalRead(pin_switch);

    if ( newSwitchState != oldSwitchState )
    {
       if ( newSwitchState == HIGH ) { digitalWrite(pin_LED, HIGH);  }
       else                          { digitalWrite(pin_LED, LOW);   }

       oldSwitchState = newSwitchState;
    }
}

Пояснение улучшенного кода

Эта версия добавляет две переменные состояния:

boolean oldSwitchState = LOW;
boolean newSwitchState = LOW;

Ключевое улучшение — сравнение текущего и предыдущего состояний:

if ( newSwitchState != oldSwitchState )
{
   if ( newSwitchState == HIGH ) { digitalWrite(pin_LED, HIGH);  }
   else                          { digitalWrite(pin_LED, LOW);   }

   oldSwitchState = newSwitchState;
}

Этот подход обновляет светодиод только тогда, когда состояние кнопки действительно изменилось, что делает код более эффективным, чем постоянная перезапись состояния пина.

Альтернатива: Без Arduino

Для базовой функциональности «нажми — включи, отпусти — выключи» можно подключить светодиод и кнопку напрямую последовательно, без Arduino:

Простая схема без Arduino

Это даёт идентичный результат без использования микроконтроллера.


Оригинал статьи: Martyn Currey — martyncurrey.com