Привет друзья! Это уже второе видео о массивах. В первом я рассказал, что знаю об одномерных массивах в Arduino IDE. Вы узнали, что они позволяют во многих задачах программирования значительно уменьшить размер кода, улучшить его читаемость. С массивами удобно работать в циклах, перебирая последовательно каждую их ячейку и читая из неё данные или записывая туда новые данные.
Самое простое определение понятия массив в программировании – это группирование нескольких переменных одного типа. Например, у нас есть 10 переменных типа integer. Массив позволяет сгруппировать их как бы в одну переменную с индексом, по которому можно четко обращаться к одной из переменных группы. Массив с одним индексом называется одномерным. Если у него больше одного индекса, то это многомерный массив.
Чтобы хорошо усвоить материал, и вспомнить сведения о простых массивах мы рассмотрим тему многомерных массивов в сравнении с одномерными. Одномерный массив можно сравнить с рядом бочек пива.
Данными, хранящимися в ячейках этого ряда, например, будут уровни пива в каждой бочке. И мы всегда можем или замерять эти уровни, или изменить их отливая пиво или добавляя. То есть, у нас есть возможность, как считывать данные, хранящиеся в отдельных ячейках, так, и изменять их на новые значения. Здесь кстати, чтобы найти нужную бочку, нам достаточно знать её порядковый номер – индекс.
Двумерный массив можно изобразить в виде одноэтажного склада бочек с пивом. Здесь тоже в каждой бочке хранятся данные – уровень пива внутри. И чтобы найти конкретную бочку, нам нужно знать два порядковых номера – индекса. Первый индекс – это положение бочки слева на право, а второй – это номер ряда от ближнего к дальнему.
Трехмерный массив – это многоэтажный склад бочек пива. Здесь у каждой бочки должно быть свое четкое уникальное обозначение. Номер слева на право, номер ряда, а так же номер этажа. То есть у этого массива есть три индекса, по которым можно найти конкретную бочку, хранящую свой уровень пива.
Примером для реального использования двумерного массива может быть программа для управления адресной светодиодной лентой на 100 элементов и имеющей три цвета. Мы можем управлять интенсивностью свечения каждого из трёх цветов каждого из ста элементов.
И для программной работы с такой LED-лентой довольно удобно будет воспользоваться многомерным массивом 100х3. Это 100 ячеек, в каждой из которых будут храниться значения трех цветов. Отказавшись от массива, вам пришлось бы создавать 300 отдельных переменных со своими отдельными названиями для хранения всех цветов ленты.
И таких примеров по использованию многомерных массивов можно придумать еще много. Например, для управления LED-кубом 10х10х10 с трёхцветными светодиодами, для хранения всех цветов, удобно использовать массив 10х10х10х3. То есть четырехмерный массив на 3000 ячеек.
Использование массивов в программе Arduino начинается с их объявления. Так как же объявляются такие массивы? Одномерные, то есть массивы с одним индексом объявляются так.
int myInts[6];long myPins[10]; unsigned int mySensVals[3];char message[7];
Двумерные массивы объявляются так же, но добавляется второй индекс - второе измерение. Это объявление двумерного массива на 10 строк и 20 столбцов.
int my_var[10][20];
А для LED-ленты на 100 элементов массив будет объявлен так.
byte LED[100][3];
Каждый отдельный элемент двумерного массива однозначно определяется парой индексов. Этот массив состоит из 300 ячеек, в каждой из которых хранится значение типа byte. Первый индекс определяет номер светодиода в ленте, а второй – номер цвета светодиода. Например, индекс 0 – это красный цвет, 1 – это зелёный цвет и 2 – это синий цвет светодиода или элемента адресной ленты.
byte LED[100][3];
Для примера со светодиодным кубом, массив будет определён так. Это четырёхмерный массив. Первые три индекса определяют положение светодиода в пространстве, а четвертый индекс позволяет иметь доступ к определённому цве́ту свечения выбранного светодиода.
byte LED[10][10][10][3];
При объявлении массива, можно сразу его инициализировать – то есть задать начальные значения его ячеек. Но для больших массивов на сотни и тысячи ячеек такая инициализация будет слишком габаритной и нежелательной.
int my_var[3][2]={{3,1},{5,8},{2,6}};
Если во время объявления нам нужно обнулить ячейки массива, можно воспользоваться таким синтаксисом.
int my_var[30][25]={0};
Чтобы записать свои значения данных в массиве, просто присваиваем отдельной ячейке или число, или результат вычислений.
my_var[5][2] = 150;my_var[7][25] = a + b - 3;
Например, если нам нужно в адресной ленте зажечь красный цвет на 78-м элементе, то присваиваем такие значения.
my_var[78][0] = 254; //redmy_var[78][1] = 0; //greenmy_var[78][2] = 0; //blue
Не забываем, что индексы в массивах считаются с нуля. И для ленты из 100 светодиодов, у нас будут индексы от 0 до 99, а индексы цвета от 0 до 2.
LED[100][3]LEDs 0…99RGB 0…2
Для LED-куба, чтобы зажечь зелёным цветом светодиод с координатами 5, 3, 7, необходимо присвоить следующие значения ячейкам массива.
LED[5][3][7][0] = 0; //redLED[5][3][7][1] = 254; //greenLED[5][3][7][2] = 0; //blue
А, если стои́т обратная задача, прочитать значение цвета в отдельную переменную из ячейки массива, то сделать это тоже можно простым присваиванием. Например, мы хотим вывести в монитор порта Arduino IDE текущий цвет светодиода с координатами 4, 8, 3, для чего запишем в три переменные red, green, blue интенсивность свечения каждого из цветов. Это будут переменные типа byte. Вообще, обращение к ячейке массива в программе можно выполнять так же как и к простой переменной. Их можно использовать в вычислениях, в различных операндах.
byte red, green, blue;red = LED[4][8][3][0]; green = LED[4][8][3][1];blue = LED[4][8][3][2];
Так же, при обращении к ячейке массива, индексы могут задаваться при помощи целых переменных.
my_var[var1][var2][var3][var4] = 40;LED[x][y][z][color] = 145;
С большими массивами желательно работать, используя возможности циклических операторов. Чаще всего применяют циклы FOR.
int myvar[300];for (int i = 0; i < 300; i++) { myvar[i] = i + 2;}
Например, если нужно в адресной ленте выключить красный цвет во всех элементах, пишем программу так. Здесь хватило одного цикла FOR. Программа циклически переберёт все 100 ячеек массива, в которых хранятся значения красного цвета. Это ячейки с индексом ноль. И запишет в каждую нулевую интенсивность этого цвета.
byte LED[100][3];for (int i = 0; i < 100; i++) { LED[i][0] = 0;}
Но, если мы хотим автоматически включить все три цвета, то перебор всех ячеек массива можно выполнить двумя циклами FOR. Здесь один цикл помещён внутрь другого цикла. Первый цикл прокручивается 100 раз перебирая первый индекс массива при помощи переменной i и каждый раз активируя второй цикл. А второй цикл прокручивается три раза перебирая второй индекс массива при помощи переменной k. В результате выполнения этой части программы, всем 300 ячейкам массива присваивается число 254, что соответствует максимальной яркости цвета светодиода.
byte LED[100][3];for (int i = 0; i < 100; i++) { for (int k = 0; k < 3; k++) { LED[i][k] = 254; }}
Чем больше размерность массива, или чем больше индексов массива нам нужно пройти в программе, тем больше вложенных циклов прийдется использовать. Например, если нам нужно зажечь все светодиоды куба белым цветом максимальной яркости, то потребуются четыре вложенных цикла FOR один в другой.
byte LED[10][10][10][3];for (int a = 0; a < 10; a++) { for (int b = 0; b < 10; b++) { for (int c = 0; c < 10; c++) { for (int k = 0; k < 3; k++) { LED[a][b][c][k] = 254; } } }}
Ваша программа при этом примет изящный вид по сравнению с безмассивными методами с простыми переменными. Но массивы – это ещё не последний инструмент в Arduino IDE, чтобы придать элегантности и упорядоченности вашей программе. Ведь есть ещё такие инструменты как составные типы данных, а так же объектное программирование. Так что нам есть ещё, над чем разбираться, и есть куда совершенствоваться. И, когда выучите возможности этих инструментов, то сможете в различных задачах четко определять, где уместнее применить цикл, где функцию, где пользовательские типы данных, а где и объекты.
Позвольте на этом завершить тему массивов. Становитесь спонсорами канала прямо здесь нажав кнопку Спонсировать под видео и добро пожаловать в наш клуб инженеров Arduino. Прошу так же подписаться на канал, поставить лайк и поделиться ссылкой на видео с друзьями. Пишите в комментариях, какие темы вас интересуют. И до новых встреч!
Автоматическое управление озонатором воды на Arduino Nano
В этом проекте займемся чистой автоматикой. В данном случае озонатор будет очищать питьевую воду от ..
SIM800L GSM модуль
GSM GPRS модуль на основе специализированной микросхемы SIM800L Напряжение питания 3,7 - 4,2 В..
206.48грн.
AMS1117-3.3 микросхема стабилизатор напряжения
Микросхема - линейный регулятор напряжения применяется для получения стабилизированного напряжения 3..
5.77грн.
Серво мотор MG996R
Сильный сервопривод с металлическим редуктором (шестерёнками)Полный угол поворота 180 градусовВсе&nb..
194.88грн.