Віримо в перемогу ЗСУ!
Працюємо з 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”,”Razgon”,”Ostanov”};

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


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

<< Проекты << Все товары >> Статьи, уроки >>

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Модуль реле 4-канальный 5В 10А

Модуль реле 4-канальный 5В 10А

4-канальный модуль реле для подключения напрямую к дискретному выходу контроллера. Светодиодная инди..

130.62грн.

Модуль 8-ми дискретных входов I2C

Модуль 8-ми дискретных входов I2C

Модуль 8-ми полностью гальванически развязанных дискретных входов с I2C коммуникацией на основе микр..

167.35грн.

Преобразователь уровней 5В 3,3В 8-канальный

Преобразователь уровней 5В 3,3В 8-канальный

Модуль 8-канального преобразователя логических уровней на специализированной микросхеме TXS0108E.При..

34.05грн.

Шестерня для зубчатого ремня на 36 зубьев под ось 8 мм

Шестерня для зубчатого ремня на 36 зубьев под ось 8 мм

Используется для передачи и редукции крутящего момента от двигателя до оси 8 ммКоличество зубьев 36 ..

86.42грн.

Мини выключатель 250 В 3 А

Мини выключатель 250 В 3 А

Прикольный маленький выключатель питания, для врезки в монтажную панель или в корпус электронного ус..

11.75грн.