Включение и выключение с 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:
Это даёт идентичный результат без использования микроконтроллера.
Оригинал статьи: Martyn Currey — martyncurrey.com