Мигающий светодиод с двумя кнопками: одна для включения, одна для выключения

Демонстрация мигающего светодиода с двумя кнопками

Это руководство представляет вариацию базового управления светодиодом с помощью кнопки, в котором используются две отдельные кнопки. Одна кнопка запускает мигание светодиода, а другая – останавливает его. Это простое расширение метода с одной кнопкой из предыдущих руководств.

Схема

Схема использует следующие подключения:

  • Пин 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()