Menu
CoddyTech

Два светодиода, две скорости

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

С delay() две мигающие с разной скоростью LED — это головоломка: каждое ожидание задерживает другой LED. С millis() всё просто, потому что ничего не ждёт.

Дай каждой задаче собственные переменные: своё время последнего срабатывания и своё состояние. Затем добавь каждой задаче свой if в loop(). На каждой итерации цикла каждая задача проверяет собственные часы и выполняет действие, только когда приходит её время:

unsigned long redPrevious = 0;
unsigned long greenPrevious = 0;

void loop() {
  unsigned long now = millis();
  if (now - redPrevious >= 500) {
    redPrevious = now;
    // переключить красный светодиод
  }
  if (now - greenPrevious >= 200) {
    greenPrevious = now;
    // переключить зелёный светодиод
  }
}

Эти две задачи никогда не мешают друг другу. Точно так же можно добавить третью и четвёртую: по одному набору переменных и по одному if для каждой.

Никогда не используй одну переменную времени последнего срабатывания для двух задач. Более быстрая задача сбрасывает её так часто, что более медленная никогда не достигает своего интервала.

challenge icon

Задание

Легко

Красный светодиод на выводе 13 уже переключается каждые 500 мс. Сделай так, чтобы зелёный светодиод на выводе 12 переключался каждые 200 мс одновременно с ним:

  • добавь переменные greenPrevious и greenState
  • добавь второй if в loop() для зелёного светодиода

Нажми Run и посмотри, как мигают оба светодиода, затем нажми Check.

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

const int redLed = 13;
const int greenLed = 12;

unsigned long redPrevious = 0;
int redState = LOW;

// добавьте здесь две переменные для зелёного светодиода

void setup() {
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
}

void loop() {
  unsigned long now = millis();

  // красный светодиод переключается каждые 500 ms
  if (now - redPrevious >= 500) {
    redPrevious = now;
    if (redState == LOW) {
      redState = HIGH;
    } else {
      redState = LOW;
    }
    digitalWrite(redLed, redState);
  }

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

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

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

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