Menu
CoddyTech

Мигание и переключение кнопкой

Часть раздела Отсчёт времени без delay путешествия по Arduino на Coddy. Урок 5 из 18.

Скетч, который никогда не ждёт, может одновременно следить за кнопкой и выполнять мигание. Каждый цикл занимает несколько микросекунд, поэтому плата проверяет кнопку тысячи раз в секунду и замечает даже очень короткое нажатие.

Для мигания используется шаблон с millis(). Для кнопки — проверка фронта из раздела «Входы»: действуй, когда кнопка нажата сейчас, но не была нажата в предыдущем цикле. ! означает «не», поэтому !wasPressed читается как «не была нажата».

bool wasPressed = false;

void loop() {
  // мигание: if (now - previous >= 500) { ... }

  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed && !wasPressed) {
    // кнопку только что нажали
  }
  wasPressed = pressed;
}

Помести обе части в loop(), одну за другой, и не используй delay() ни в одной из них. Если бы мигание ждало 500 мс, нажатие, которое началось и закончилось во время ожидания, осталось бы незамеченным.

challenge icon

Задание

Средне

Пусть плата выполняет две задачи одновременно:

  • красный LED на выводе 13 переключается каждые 500 мс по таймеру millis()
  • каждое нажатие кнопки переключает жёлтый LED на выводе 12: включён, затем выключен, затем снова включён

Короткое нажатие должно срабатывать в любой момент, а удерживание кнопки переключает жёлтый LED только один раз. Нажми Run, коснись кнопки, затем нажми Check.

Попробуйте сами

const int redLed = 13;
const int yellowLed = 12;
const int buttonPin = 2;

void setup() {
  pinMode(redLed, OUTPUT);
  pinMode(yellowLed, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop() {
  // 1. переключайте красный светодиод каждые 500 мс с помощью millis()

  // 2. каждое нажатие кнопки включает или выключает жёлтый светодиод
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Отсчёт времени без delay

Потренируйтесь самостоятельно: Песочница Arduino