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
Подключите параллельно 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);
}
}