Віримо в перемогу ЗСУ!
Працюємо з 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 размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Модуль підсилювача 2 х 3 Вт

Модуль підсилювача 2 х 3 Вт

Мініатюрний стерео підсилювач звукової частоти класу D на базі мікросхеми PAM8403Потужність 2 х 3 Вт..

28.01грн.

MOC3023 оптосимістор

MOC3023 оптосимістор

Оптопара з симісторним виходом для імпульсного управління потужним симістором від логічних сигналів ..

14.62грн.

Адаптер USB 2.0 в TTL UART

Адаптер USB 2.0 в TTL UART

Комунікаційний конвертер USB 2.0 в TTL UARTЗаснований на мікросхемі CP2102Містить самовідновлюв..

120.03грн.

AT24C02 EEPROM I2C

AT24C02 EEPROM I2C

Мікросхема постійної пам'яті EEPROMНапруга живлення 2,7 ... 5,5 ВОб'єм 256 БайтКоммунікація I2C..

4.36грн.

Кабель живлення 220В 2х0,75мм2

Кабель живлення 220В 2х0,75мм2

Мережевий кабель живлення 220ВПлоща перерізу дроту 0,75 мм2Довжина дроту 1,8 м..

34.19грн.