Arduino и массивы

Массив - это набор переменных, доступ к которым осуществляется через их индекс. В языке программирования C, на котором основан Arduino, массивы могут быть достаточно сложными.

Но использование простых массивов не таит в себе особых трудностей.

Создание (объявление) массива

Все методики, представленные ниже, подходят для создания (объявления) массива.

int myInts[6]; int myPins[] = {2, 4, 8, 3, 6}; int mySensVals[6] = {2, 4, -8, 3, 2}; char message[6] = "hello";

Вы можете объявить массив без его инициализации как myInts.

В myPins мы объявляем массив без непосредственного указания размера. Компилятор считает количество элементов и создает массив соответствующего размера.

Вы можете одновременно инициализировать и указать размер вашего массива, как, например, это сделано в mySensVals.

Обратите внимание, что при объявлении массива типа char, необходим еще один элемент для хранения обязательного null-символа.

Доступ к элементам массива

Индексация в массивах начинается с нуля. То есть, первый элемент массива будет иметь порядковый номер 0. Таким образом:

mySensVals[0] == 2, mySensVals[1] == 4

, и так далее

То есть, например, в массиве из десяти элементов, последний элемент будет иметь индекс девять. Например:

int myArray[10]={9,3,2,4,3,2,7,8,9,11}; // myArray[9] содержит 11 // myArray[10] некорректен и содержит случайную информацию (другой адрес памяти)

По этой причине надо быть аккуратным при доступе к массивам. Вызывая элемент массива, значение которого больше чем объявленный размер - 1 вы считвыете из памяти значение, которое предназначено для других задач. Считывание таких данных просто приведет к некорректным результатам работы вашей программы в дальнейшем. Также не очень хорошей идеей является запись данных в произвольные места. Кроме того, отследить эту ошибку при проверке кода тоже сложно.

В отличие от BASIC или JAVA, компилятор C не проверяет, получаем ли мы доступ к элементу массива в предварительно объявленых границах.

Чтобы добавить значение в массив:

mySensVals[0] = 10;

Чтобы получить значение из массива:

x = mySensVals[4];

Массивы и циклы FOR

Очень удобный метод работы с массивами - циклы. В этих случаях счетчик цикла используется для индексации каждого элемента массива. Например, для отображения в окне серийного монитора элементов массива, можно прописать что-то вроде:

int i; for (i = 0; i < 5; i = i + 1) { Serial.println(myPins[i]); }

Использование цикла For Loop в примере ниже поможет разъяснить как использовать массивы при работе с платами Arduino. Как мы уже упоминали выше, массив - это переменная, состоящая из множества частей или элементов.

Цикл For Loop дает возможность зажечь несколько светодиодов, которые подключены к пинам 2-7 на плате Arduino. Есть, прадв, некоторые ограничения, принятые в данном примере - пины должны нумероваться последовательно, а светодиоды подключены по параллельной схеме.

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

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

Метод расположения пинов в пределах массива очень удобен и позволяет переставлять их как угодно без переподключения светодиодов.

Оборудование для примера

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

Схема параллельного подключения светодиодов к Arduino

Arduino_LED_Array

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

Электросхема параллельного подключения светодиодов к Arduino

Параллельное подключение светодиодов

Программа для Arduino с пояснениями

/*

Arrays

Демонстрирует использование массива для хранения данных о номерах пинов. Последовательно зажигает светодиоды в одном и противоположном направлении.

Пины не обязательно должны располагаться в последовательном порядке.* светодиоды подключены к пинам 2-7 и к земле.*/

int timer = 100; // чем больше значение, тем медленнее отсчет времени.

int ledPins[] = {

2, 7, 4, 6, 5, 3 }; // массив данным с номерами пинов, к которым подключены светодиоды

int pinCount = 6; // количество пинов (то есть, длина массива)

void setup() {

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

// использование for loop для инициализации пинов как выходов

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);

}

}