Мигание и переключение кнопкой
Часть раздела Отсчёт времени без 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 мс, нажатие, которое началось и закончилось во время ожидания, осталось бы незамеченным.
Задание
СреднеПусть плата выполняет две задачи одновременно:
- красный 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. каждое нажатие кнопки включает или выключает жёлтый светодиод
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Отсчёт времени без delay
1millis()
Часы на millis()Время в unsigned longМигание без задержкиДва светодиода, две скоростиМигание и переключение кнопкойСвет по таймеру4Точное измерение времени
Измерение с помощью micros()Когда millis() переполняетсяСекундомер с кнопкойПотренируйтесь самостоятельно: Песочница Arduino