Мигающий светодиод с двумя кнопками: одна для включения, одна для выключения
Это руководство представляет вариацию базового управления светодиодом с помощью кнопки, в котором используются две отдельные кнопки. Одна кнопка запускает мигание светодиода, а другая – останавливает его. Это простое расширение метода с одной кнопкой из предыдущих руководств.
Схема
Схема использует следующие подключения:
Пин D10 подключён через резистор 330 Ом к светодиоду и далее к GND
Пин D2 подключён к кнопке с подтягивающим резистором 10 кОм к GND
Пин D3 подключён к кнопке с подтягивающим резистором 10 кОм к GND
Скетч
В скетче переменные и функции дублируются для обработки второй кнопки. Вместо того чтобы создавать высокооптимизированное решение, автор отдаёт приоритет ясности и простоте будущих модификаций. Две отдельные функции проверяют состояние каждой кнопки независимо, повторяя логику из предыдущих руководств.
Функция loop() организует работу следующим образом: сначала проверяются обе кнопки и устанавливаются переменные, хранящие состояние кнопок. Затем проверяется, была ли нажата кнопка и нужно ли запустить или остановить мигание светодиода.
Переменная LEDisFlashing отслеживает, мигает ли светодиод в данный момент (TRUE) или остановлен (FALSE).
// Sketch: Using two push button switches to turn an LED on and off
// www.martyncurrey.com
//
// Pins
// D10 to 330 ohm resister and LED
// D2 to push button switch with 10K ohm pull down resistor
//
// Define the pins being used
int pin_LED = 10;
int pin_switch1 = 2;
int pin_switch2 = 3;
// variables
boolean oldOnSwitchState = LOW;
boolean oldOffSwitchState = LOW;
boolean onKeyPressed = false;
boolean offKeyPressed = false;
boolean LEDisFlashing = false;
boolean LEDstatus = LOW;
long timeNow = 0;
long timePrev = 0;
int LEDflashTime = 100;
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_switch1, INPUT);
pinMode(pin_switch2, INPUT);
}
void loop()
{
onKeyPressed = checkOnSwitch();
offKeyPressed = checkOffSwitch();
if ( onKeyPressed && !LEDisFlashing ) { startLEDFlashing(); }
if ( offKeyPressed && LEDisFlashing ) { stopLEDFlashing(); }
if ( LEDisFlashing ) { flashTheLED(); }
} // loop
boolean checkOnSwitch()
{
boolean switchStatus = false;
boolean newSwitchState1 = digitalRead(pin_switch1); delay(1);
boolean newSwitchState2 = digitalRead(pin_switch1); delay(1);
boolean newSwitchState3 = digitalRead(pin_switch1);
if ( (newSwitchState1==newSwitchState2) && (newSwitchState1==newSwitchState3) )
{
if ( newSwitchState1 != oldOnSwitchState )
{
if ( newSwitchState1 == HIGH ) { switchStatus = true; }
oldOnSwitchState = newSwitchState1;
}
}
return switchStatus;
}
boolean checkOffSwitch()
{
boolean switchStatus = false;
boolean newSwitchState1 = digitalRead(pin_switch2); delay(1);
boolean newSwitchState2 = digitalRead(pin_switch2); delay(1);
boolean newSwitchState3 = digitalRead(pin_switch2);
if ( (newSwitchState1==newSwitchState2) && (newSwitchState1==newSwitchState3) )
{
if ( newSwitchState1 != oldOffSwitchState )
{
if ( newSwitchState1 == HIGH ) { switchStatus = true; }
oldOffSwitchState = newSwitchState1;
}
}
return switchStatus;
}
void startLEDFlashing()
{
LEDisFlashing = true;
}
void stopLEDFlashing()
{
LEDisFlashing = false;
digitalWrite(pin_LED,LOW);
}
void flashTheLED()
{
timeNow = millis();
if (timeNow - timePrev >= LEDflashTime )
{
timePrev = timeNow;
if (LEDstatus == LOW) { LEDstatus = HIGH; } else { LEDstatus = LOW; }
digitalWrite(pin_LED, LEDstatus);
}
}
Пояснение к коду
Скетч использует модульные функции для ясности и удобства сопровождения. Вместо объединения кода автор намеренно разделяет похожие функции, что упрощает расширение программы и понимание её назначения при чтении основного цикла.
Основные моменты:
checkOnSwitch()– проверяет кнопку включения (пин D2) с простым дебаунсом (тройное чтение)checkOffSwitch()– проверяет кнопку выключения (пин D3) с аналогичным дебаунсомstartLEDFlashing()– устанавливает флаг миганияstopLEDFlashing()– сбрасывает флаг и выключает светодиодflashTheLED()– мигает светодиодом с использованиемmillis()вместоdelay()