Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right Управляющие конструкции chevron_right For Loop Iteration: управление несколькими светодиодами (эффект «Рыцаря дорог»)

For Loop Iteration: управление несколькими светодиодами (эффект «Рыцаря дорог»)

Используйте цикл for() для последовательного управления шестью светодиодами на цифровых выводах 2–7 — классический «бегущий огонь» в стиле машины KITT.

Часто возникает задача пройтись по набору пинов и выполнить с каждым из них одно и то же действие. Именно для этого существует цикл for() — он позволяет не писать однотипный код шесть раз, а описать действие один раз и повторить его нужное количество раз.

В этом уроке мы подключим 6 LEDs к Arduino и заставим их мигать по очереди, создавая эффект «бегущего огня». Для управления используются функции digitalWrite() и delay(), а сам перебор пинов организован через два цикла for() — один идёт от пина 2 к пину 7, второй возвращается обратно.

Этот пример также называют «Knight Rider» — в память о телесериале 80-х, где Дэвид Хассельхофф ездил на Pontiac с искусственным интеллектом по имени KITT. Автомобиль был буквально увешан LEDs, а на его панели красовался сканирующий дисплей, луч которого плавно скользил туда-обратно — как показано в этом культовом fight between KITT and KARR. Наш скетч воспроизводит именно этот эффект.

Необходимое оборудование

  • Arduino Board
  • 6 резисторов по 220 Ом
  • 6 LEDs
  • соединительные провода
  • макетная плата (breadboard)

Схема подключения

Подключите шесть светодиодов через резисторы 220 Ом к цифровым выводам 2–7 Arduino. Резистор включается последовательно с каждым светодиодом — это обязательно, иначе через светодиод пойдёт слишком большой ток и он быстро выйдет из строя.

Схема подключения: Arduino UNO соединён с макетной платой, на которой установлены шесть красных светодиодов с резисторами, подключённых к цифровым выводам 2–7.

Принципиальная схема

Принципиальная схема: Arduino UNO подключён к шести светодиодам через резисторы 220 Ом (220 Ω RESISTORS). Светодиоды (LEDs) соединены с цифровыми выводами 2–7.

Как это работает

В блоке setup() цикл for() проходит по пинам 2–7 и настраивает каждый из них как выход (OUTPUT). Это избавляет от необходимости писать шесть отдельных вызовов pinMode().

В loop() работают два цикла for():

  • первый увеличивает счётчик от 2 до 7 — светодиоды загораются по одному слева направо;
  • второй уменьшает счётчик от 7 до 2 — огонь «возвращается» обратно.

Каждый активный светодиод включается, выдерживается небольшая пауза, затем выключается — и управление переходит к следующему пину. Именно так создаётся плавный эффект бегущего огня.

Код

В начале скетча цикл for() задаёт цифровые пины 2–7 как выходы для шести LEDs.

В основном цикле два вложенных for() последовательно обходят LEDs: сначала от пина 2 к пину 7, затем в обратном направлении — от 7 к 2.

/*

  For Loop Iteration

  Демонстрация использования цикла for().

  Последовательно зажигает несколько светодиодов, затем в обратном порядке.

  Схема:

  - Светодиоды подключены от пинов 2–7 к GND

  создан в 2006 году

  автор David A. Mellis

  изменён 30 Aug 2011

  автор Tom Igoe

  Этот пример кода находится в общественном достоянии.

  https://www.arduino.cc/built-in-examples/ForLoopIteration

*/

int timer = 100;           // Чем больше число, тем медленнее темп.

void setup() {

  // Используем цикл for для инициализации каждого пина как выход:

  for (int thisPin = 2; thisPin < 8; thisPin++) {

    pinMode(thisPin, OUTPUT);

  }
}

void loop() {

  // Цикл от младшего пина к старшему:

  for (int thisPin = 2; thisPin < 8; thisPin++) {

    // Включаем пин:

    digitalWrite(thisPin, HIGH);

    delay(timer);

    // Выключаем пин:

    digitalWrite(thisPin, LOW);

  }

  // Цикл от старшего пина к младшему:

  for (int thisPin = 7; thisPin >= 2; thisPin--) {

    // Включаем пин:

    digitalWrite(thisPin, HIGH);

    delay(timer);

    // Выключаем пин:

    digitalWrite(thisPin, LOW);

  }
}

Типичные ошибки

  • Светодиод не светится — скорее всего, он вставлен в обратной полярности. Длинная ножка (анод) должна идти к пину Arduino через резистор, короткая (катод) — к GND.
  • Все светодиоды горят одновременно — проверьте, что в цикле вы выключаете (LOW) текущий светодиод перед тем, как включить следующий.
  • Забыт резистор — светодиод может работать, но перегреваться и быстро деградировать. Всегда используйте токоограничивающий резистор.
  • Пины перепутаны — убедитесь, что светодиоды подключены именно к пинам 2–7, а не, например, к 0 и 1 (они используются для UART и могут конфликтовать с загрузкой скетча).

Как проверить результат

После загрузки скетча светодиоды должны загораться по одному: сначала от первого к последнему, затем в обратном порядке — бесконечно. Если эффект выглядит именно так, всё работает правильно. Попробуйте изменить задержку в коде, чтобы ускорить или замедлить «бегущий огонь».

Где пригодится

Этот паттерн используется везде, где нужно управлять несколькими однотипными устройствами: RGB-лентами, сегментами дисплея, реле или моторами. Принцип одинаков — цикл for() и массив пинов.

Дополнительные материалы

Больше базовых примеров вы найдёте в разделе built-in examples.

Также рекомендуем изучить language reference — подробный справочник по языку программирования Arduino.

Последнее обновление: 29.07.2015, SM