Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right Управляющие конструкции chevron_right Работа с массивами (Arrays) в Arduino

Работа с массивами (Arrays) в Arduino

Узнайте, как использовать массивы в Arduino для управления несколькими светодиодами в произвольном порядке — расширение примера For Loop.

Этот урок — развитие примера For Loop Iteration, в котором мы разберёмся, как использовать array (массив). Если переменная — это стакан, в котором хранится одно значение, то массив — это лоток для льда: несколько ячеек, каждая из которых держит своё значение того же типа.

Пример For Loop Iteration показывает, как зажигать LEDs на пинах 2–7 последовательно. Но там есть ограничения: пины должны идти подряд, а порядок включения фиксирован.

В этом уроке мы снимаем оба ограничения. Пины перечисляются в массиве, а циклы for перебирают элементы этого массива. Благодаря такому подходу порядок включения светодиодов определяется не физическим расположением пинов, а тем, как вы записали числа в массив. Хотите пустить волну в обратном направлении или вразнобой — просто поменяйте порядок элементов.

Что нам понадобится

  • Arduino Board
  • 6 LEDs
  • 6 резисторов по 220 Ом
  • провода для соединений
  • макетная плата

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

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

Схема подключения: Arduino UNO соединён с макетной платой, на которой установлены 6 светодиодов и токоограничивающие резисторы. Катоды светодиодов — к GND, аноды — через резисторы к пинам 2–7.

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

Принципиальная схема: Arduino UNO управляет шестью светодиодами (Светодиоды) через резисторы 220 Ом (РЕЗИСТОРЫ 220 Ом), подключённые к цифровым выводам 2–7.

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

В начале скетча объявляется массив пинов. Например:

int ledPins[] = {2, 7, 4, 6, 5, 3};

Здесь пины идут не по порядку — и это нормально. Цикл for проходит по индексам массива от 0 до 5, поочерёдно обращаясь к каждому элементу: ledPins[0], ledPins[1] и так далее. Именно этот порядок и задаёт последовательность мигания светодиодов.

Чтобы пустить «волну» в обратном направлении, достаточно пройти по массиву от последнего элемента к первому — менять схему подключения не нужно.

Код

/*

  Arrays

  Демонстрирует использование массива для хранения номеров пинов с целью

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

  затем в обратном порядке.

  В отличие от примера с циклом For, где пины должны идти подряд, здесь

  пины могут быть в любом произвольном порядке.

  Схема:

  - светодиоды подключены от пинов 2 до 7 к земле

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

  автор David A. Mellis

  изменён 30 Aug 2011

  автор Tom Igoe

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

  https://www.arduino.cc/en/Tutorial/Array

*/

int timer = 100;           // Чем больше значение, тем медленнее работа.
int ledPins[] = {

  2, 7, 4, 6, 5, 3
};       // Массив номеров пинов, к которым подключены светодиоды
int pinCount = 6;           // Количество пинов (т.е. длина массива)

void setup() {

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

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

  for (int thisPin = 0; thisPin < pinCount; thisPin++) {

    pinMode(ledPins[thisPin], OUTPUT);

  }
}

void loop() {

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

  for (int thisPin = 0; thisPin < pinCount; thisPin++) {

    // Включить пин:

    digitalWrite(ledPins[thisPin], HIGH);

    delay(timer);

    // Выключить пин:

    digitalWrite(ledPins[thisPin], LOW);

  }

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

  for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) {

    // Включить пин:

    digitalWrite(ledPins[thisPin], HIGH);

    delay(timer);

    // Выключить пин:

    digitalWrite(ledPins[thisPin], LOW);

  }
}

Практические замечания

  • Размер массива удобно вычислять автоматически: int arraySize = sizeof(ledPins) / sizeof(ledPins[0]);. Тогда при добавлении нового пина в массив не придётся обновлять счётчик вручную.
  • Инициализация пинов в setup() тоже делается циклом по массиву — это чище, чем шесть отдельных вызовов pinMode().
  • Массив хранится в оперативной памяти (SRAM). Для маленьких плат вроде Arduino Uno (2 КБ SRAM) это некритично, но при работе с большими массивами стоит следить за расходом памяти.

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

  • Выход за границы массива. Если в массиве 6 элементов, допустимые индексы — от 0 до 5. Обращение к ledPins[6] не вызовет ошибки компиляции, но приведёт к непредсказуемому поведению во время выполнения.
  • Забытый pinMode. Каждый пин из массива нужно объявить как OUTPUT в setup(). Пропустите хотя бы один — соответствующий светодиод не будет работать.
  • Перепутанный порядок элементов. Если светодиоды мигают не так, как ожидалось, проверьте соответствие порядка пинов в массиве и физического подключения на макетной плате.

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

Загрузите скетч и наблюдайте за светодиодами: они должны зажигаться и гаситься в том порядке, в каком пины записаны в массиве. Попробуйте изменить порядок элементов в массиве прямо в коде и перезагрузить скетч — последовательность мигания изменится без каких-либо переключений проводов.

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

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

Подробное описание всех функций языка Arduino доступно в language reference.

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