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

Привіт друзі! Радий вас усіх бачити! Пропоную ознайомитись з наступною темою навчального циклу – Arduino уроки масиви. Без допомоги масивів, багато завдань і широко відомих алгоритмів було б неймовірно важко реалізувати в програмному коді. Це реально важлива частина, мабуть, кожної мови програмування. Масиви бувають одномірні та багатовимірні. Багатовимірні розглянемо на наступному уроці. Масиви допомагають оптимізувати код, значно зменшити кількість його рядків. Також крім користі, іноді масиви можуть нести і небезпеку зависання контролера. Перегляньте відео до кінця, і я розповім, як уникнути неприємних ситуацій з використанням масивів у програмі, які компілятор Arduino не в змозі виявити як помилку. А поки що, можете підписатися на канал і поділитися посиланням на відео з другом та продовжимо!


Масив – це тип даних, що є впорядкованим набором однотипних елементів, послідовно які у пам'яті контролера, які мають свій індекс чи ряд індексів. На відміну від звичайних змінних, що зберігають одне значення, масиви потрібні для зберігання цілого ряду однотипних значень. Однотипні – це означає, що мають один простий тип: byte або int або char або інші. Наприклад, якщо ви створили масив елементів типу byte, то в жодну комірку з нього не зможете записати ціле число менше 0 або більше 255. Масиви з одним індексом називають одновимірними, з двома - двовимірними, і так далі. Найчастіше програмісти користуються одновимірними та двовимірними масивами, рідше тривимірними.

Масив можна як таблиці значень будь-яких параметрів. Для одновимірного масиву, тобто масиву з одним індексом, це буде виглядати так. У першій таблиці представлення масиву елементів типу byte, а в другій масиву типу String. У першому стовпці індекси елементів масиву, а в другому самі значення елементів. Індекси в Arduino є тільки цілими і завжди починаються з нуля. Кількість індексів або елементів конкретного масиву задається в програмі один раз під час його оголошення.


Оголошується одномірний масив як і інші змінні, вказавши тип даних елементів та ім'я масиву, плюс квадратні дужки. Все, що стосується квадратних дужок, - це просте оголошення змінної. У дужках вказується максимальна кількість елементів. Проговоримо ще раз для розуміння та запам'ятовування: для визначення масиву в програмі Arduino IDE необхідно вказати тип його елементів, ім'я та максимальну кількість цих елементів. А максимальна кількість елементів – розмір масиву.

int myInts[7];

long myPins[11];

unsigned int mySensVals[7];

char message[11];

Вказати розмір масиву можна за допомогою літеральної константи – тобто цифри. Її ми вказуємо у квадратних дужках.


Також розмір масиву можна вказати з допомогою іменованої константи. Це зручно, якщо у вас багато масивів одного розміру. Тоді їх розмір можна задавати і змінювати в процесі налагодження програми просто заміною однієї цифри, що надається літеральній константі на початку скетчу.


const num1 = 7;
#define num2 = 11;


int myInts[num1];

long myPins[num2];

unsigned int mySensVals[num1];

char message[num2];

У третьому варіанті на прикладі показано, що розмір квадратних дужках можна як вказувати, так і не вказувати, якщо ви відразу ініціалізуєте або привласнюєте початкові значення всім елементам масиву. Тоді компілятор автоматично визначить розмір масиву та пам'яті, необхідної для його зберігання. Тут два варіанти будуть рівноцінно оброблені компілятор Arduino IDE.


int myInts[7] = {40,15,1,18,34,3,84};

long myPins[] = {4450,5,11500,7,13,16500,200};

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


int myInts[4] = {40,15,1,18};


int myInts[] = {40,15,1,18};


int myInts[4];
myInts[0]=40;
myInts[1]=15;
myInts[2]=1;
myInts[3]=18;


У глобальних масивів, які оголошені на початку скетчу перед функцією setup, розмірність у квадратних дужках може задаватися лише константою. А у локальних масивів, тобто тих, що використовуються лише всередині функції, розмірність можна задавати і змінною. Це має бути цілісна змінна.




А що ж буде, якщо розмірність масиву в квадратних дужках буде більшою за задані початкові значення? Правильно, створиться масив із кількістю елементів, визначеним у квадратних дужках. Але в останні не встановлені останні осередки запишеться нульове значення. Запам'ятаємо, що значення осередків масивів не заповнюються нулями автоматично.


Щоб це сталося, потрібно заповнити хоча б один елемент. Наприклад, якщо від початку потрібно записати нулі в усі осередки масиву, слід оголосити їх у програмі з одним нулем у фігурних дужках.


Після оголошення масиву, далі в програмі можна змінювати значення осередків простим привласненням. Так як і зі звичайною змінною, але із зазначенням індексу у квадратних дужках.



Нумерація індексів масиву починається з нуля, і це не завжди зручно. Якщо вам не хочеться в програмі рахувати якісь елементи вашого алгоритму з нуля, використовуючи масиви, і у контролера досить вільної пам'яті, то ви просто можете створювати масиви розмірністю на одиницю більше, ніж потрібно і починати рахунок з одиничного індексу. А нульовий елемент масиву просто не буде задіяний у програмі.



Зчитувати значення осередків масиву можна так само як і у простих змінних, але із зазначенням індексу в квадратних дужках.



Також в окремих елементів масиву індекси можна ставити змінними. Тут, до речі, ховаються часті проблеми при налагодженні програм Arduino. Адже, якщо в змінну, що задає індекс елемента, запишеться число, більше розмірності масиву, то швидше за все контролер глючить і навіть зависати. У мене таке часто траплялося. При цьому компілятор не побачить вашої помилки, і глючну програму можна спокійно завантажувати в контролер. Потім відстежити глюк дуже складно. Так що з індексами масивів тримайте вухо гостро.



Виведення значень осередків масиву в монітор порту теж мало відрізняється від простих змінних. Для виведення всіх осередків в монітор порту, стандартних функцій Arduino IDE немає, але ви можете створити свою.



Масиви у платформі Arduino використовують у багатьох завданнях. Наприклад, для циклічного перебору рядів або таблиць даних. Таким чином, вони застосовуються у пошукових та інших алгоритмах. Тут у прикладі за допомогою циклу for перебираються всі 5 елементів масиву і один за одним їх значення роздруковуються на монітор порту.


int myvar[5] = {44,55,33,66,12};


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

Також масиви застосовують для примітивної роботи з однотипними об'єктами. Наприклад, якщо потрібно створювати змінні для програмної роботи із трьома функціонально однаковими двигунами. Масив i тут зберігає струми через три двигуни. Масив w зберігає обороти кожного із трьох двигунів. Таке представлення даних дозволяє обчислювати ці струми в циклі, полегшити налагодження та скоротити розмір програми.


float i[3] = {0}; //струм
unsigned int w[3] = {0}; //оберти

i[0] = 15.4; //motor0
i[1] = 3.7; //motor1
i[2] = 8.2; //motor2

w[0] = 1200; //motor0
w[1] = 952; //motor1
w[2] = 2410; //motor2

Ще цикли чудово підходять для нумерованого угруповання текстових даних. Наприклад, при обробці меню користувача, зручно створити та використовувати у програмі масив з елементів типу String. А потім викликати назви пунктів меню у програмі, за допомогою елементів масиву, за цілими індексами.

String menu[4] = {“Stop”,”Start”,”Rozgin”,”Zupinka”};

      Serial.println(menu[ 1 ]); //Start


На цьому уроці ми добре прокачали знання з одновимірних масивів у платформі Arduino. А на наступному уроці розглянемо роботу з багатовимірними масивами, які теж вам мають зустрітися під час вирішення деяких завдань та читання чужих готових програм. Тепер не забудьте перевірити, що ви підписані на канал, пишіть коментарі та ділитеся посиланням на відео з друзями! На цьому я прощаюсь і до нових зустрічей!

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

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

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

LM317 лінійний регулятор напруги

Популярна мікросхема - регульований регулятор напругиВихідна напруга 1,25 ... 37 ВВихідний струм до ..

13.89грн.

Подвійна шестерня для зубчатого ременю на 20 зубів під вісь 8 мм

Подвійна шестерня для зубчатого ременю на 20 зубів під вісь 8 мм

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

75.37грн.

Arduino Nano I2C зв'язок між контролерами

Arduino Nano I2C зв'язок між контролерами

Давайте розберемося щодо найзручнішої комунікації фізично закладеної в контролери Arduino I2C це по..

Arduino UNO R3 + USB кабель

Arduino UNO R3 + USB кабель

Плата контролера Arduino UNO R3 14 дискретних входів/виходів, 6 з яких підтримують апаратну ШІМ ..

480.62грн.

Реле 5В 2А з двома групами перемикаючих контактів

Реле 5В 2А з двома групами перемикаючих контактів

Електромагнітне реле з двома групами перемикаючих контактів. Робоча напруга на котушці: 5ВНаван..

52.13грн.