Работа с массивами (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