Віримо в перемогу ЗСУ!
Працюємо з 09:00 до 18:00 Пн-Пт

Привіт друзі! Це вже друге відео про масиви. У першому я розповів, що знаю про одновимірні масиви в 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; //red

my_var[78][1] = 0;   //green

my_var[78][2] = 0;   //blue

Не забуваймо, що індекси в масивах зважають на нуль. І для стрічки зі 100 світлодіодів, у нас будуть індекси від 0 до 99, а індекси кольору від 0 до 2.

LED[100][3]

LEDs 0…99

RGB 0…2

Для LED-куба, щоб запалити зеленим кольором світлодіод з координатами 5, 3, 7, необхідно надати наступні значення коміркам масиву.

LED[5][3][7][0] = 0;   //red

LED[5][3][7][1] = 254; //green

LED[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. Прошу також підписатися на канал, поставити лайк і поділитися посиланням на відео з друзями. Пишіть у коментарях, які теми вас цікавлять. І до нових зустрічей!


<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Модуль датчика відстані TCRT5000

Модуль датчика відстані TCRT5000

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

25.83грн.

Кінцевий вимикач або кінцевик

Кінцевий вимикач або кінцевик

Має одну групу перемикаючих контактів. На кінчику ричага встановлений рухомий ролік.Максимальний стр..

21.52грн.

Радіатор для транзистора 21х15х10мм

Радіатор для транзистора 21х15х10мм

Радіатор алюмінієвий для пасивного охолодження різноманітних напівпровідникових силових компонентів:..

12.39грн.

Регулятор обертів двигуна 20А 10-60В постійного струму

Регулятор обертів двигуна 20А 10-60В постійного струму

Регулятор швидкості обертання двигуна постійного струму. Швидкість задається змінним резистором. ..

234.61грн.

HTTP запит через GSM GPRS модуль NEOWAY M590

HTTP запит через GSM GPRS модуль NEOWAY M590

Постановка задачі. В цьому проекті подивимося на практичний приклад відправлення http get запиту за..