Итерация цикла с помощью For и пример использования массивов (Array)

Управление несколькими светодиодами с использованием цикла for.

Часто вам нужно перебирать ряд пинов и выполнять над ними какие-то действия. Например, в этом примере 6 светодиодов, подключенных к Arduino, мигают с использованием цикла for(), который перемещается вперед и назад через цифровые пины с 2 по 7. Светодиоды включаются и выключаются последовательно с использованием функций digitalWrite() и delay().

Этот пример также называется “Knight Rider” в память о телесериале из 80-х годов, в котором Дэвид Хассельхоф имел искусственный интеллект по имени KITT, управляющий его Pontiac. В машину было установлено множество светодиодов разных размеров, выполняющих разные эффекты. В частности, у него был дисплей, сканирующийся вперед и назад по линии, как показано в этой захватывающей схватке между KITT и KARR. Этот пример воссоздает дисплей KITT.

Требуемое оборудование

  • Плата Arduino
  • 6 светодиодов
  • 6 резисторов 220 Ом
  • Провода для подключения
  • Макетная плата

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


Подключите шесть светодиодов, с резисторами 220 Ом в последовательности, к цифровым пинам 2-7 на вашей плате.

Код
Код ниже начинает с использования цикла for() для определения цифровых пинов с 2 по 7 в качестве выходов для используемых 6 светодиодов.

В основном цикле кода используются два цикла for(), чтобы последовательно перебирать светодиоды, по одному, начиная с пина 2 и заканчивая пином 7. Как только пин 7 включается, процесс разворачивается, и светодиоды поочередно выключаются, двигаясь в обратном направлении от пина 7 к пину 2.


/*
  Итерация с использованием цикла For
  Демонстрирует использование цикла for().
  Зажигает несколько светодиодов последовательно, а затем в обратном порядке.

  Создано в 2006 году
  Дэвидом А. Меллисом
  Изменено 30 августа 2011 года
  Томом Айго
  https://www.arduino.cc/built-in-examples/ForLoopIteration
*/
int timer = 100;           // Чем выше число, тем медленнее тайминг.

void setup() {
  // Используем цикл for для инициализации каждого пина как выхода:
  for (byte thisPin = 2; thisPin < 8; thisPin++) {
    pinMode(thisPin, OUTPUT);
  }
}

void loop() {
  // Цикл от самого низкого пина к самому высокому:
  for (byte thisPin = 2; thisPin < 8; thisPin++) {

    // Включаем пин:
    digitalWrite(thisPin, HIGH);
    delay(timer);

    // Выключаем пин:
    digitalWrite(thisPin, LOW);
  }

  // Цикл от самого высокого пина к самому низкому:
  for (byte thisPin = 7; thisPin >= 2; thisPin--) {
    // Включаем пин:
    digitalWrite(thisPin, HIGH);
    delay(timer);

    // Выключаем пин:
    digitalWrite(thisPin, LOW);
  }
}

Вариация с использованием массива

Этот пример показывает, как можно включить последовательность пинов, номера которых не обязательно идут подряд. Для этого можно поместить номера пинов в массив, а затем использовать циклы for для итерации по массиву.

В этом примере используются 6 светодиодов, подключенных к пинам 2-7 на плате с использованием резисторов 220 Ом, так же, как и в случае с циклом For Loop. Однако здесь порядок светодиодов определяется их порядком в массиве, а не их физическим порядком.

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


int timer = 100;           // Чем выше число, тем медленнее тайминг.
byte ledPins[] = { 2, 7, 4, 6, 5, 3};       // массив номеров пинов, к которым подключены светодиоды
byte pinCount = 6;           // количество пинов (длина массива)

void setup() {

  // элементы массива нумеруются от 0 до (pinCount - 1).

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

  for (byte pinIndex = 0; pinIndex < pinCount; pinIndex++) {

    pinMode(ledPins[pinIndex], OUTPUT);

  }
}

void loop() {

  // цикл от самого низкого пина к самому высокому:

  for (byte pinIndex = 0; pinIndex < pinCount; pinIndex++) {

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

    digitalWrite(ledPins[pinIndex], HIGH);

    delay(timer);

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

    digitalWrite(ledPins[pinIndex], LOW);

  }

  // цикл от самого высокого пина к самому низкому:

  for (byte pinIndex = pinCount - 1; pinIndex >= 0; pinIndex--) {

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

    digitalWrite(ledPins[pinIndex], HIGH);

    delay(timer);

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

    digitalWrite(ledPins[pinIndex], LOW);

  }
}

Длину массива лучше писать через sizeof(ledPins), тогда не будет необходимости в pinCount.

2 лайка