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

Модуль расширения входов-выходов PCF8574A

Расширитель портов на основе специализированной микросхемы PCF8574AКоммуникационный интерфейс I..

82.27грн.

Понижающий преобразователь напряжения 4...35В в 1,23...30В

Понижающий преобразователь напряжения 4...35В в 1,23...30В

Подстраиваемый понижающий преобразователь напряжения постоянного тока.Держит стабильное заданное рез..

63.07грн.

Терминальный модуль для Arduino UNO

Терминальный модуль для Arduino UNO

Терминальный шилд под плату контроллера Arduino UNO для удобного монтажа кабелей периферийных датчик..

161.62грн.

Резисторы 0,250 Вт

Резисторы 0,250 Вт

Миниатюрные резисторы разных номиналов с точностью +-1%. Толщина выводов хорошо подходит под стандар..

0.82грн.

Регулирование температуры воздуха окном

Регулирование температуры воздуха окном

Как часто мы попадаем в ситуацию, когда засыпаем теплым летним вечером, а просыпаемся от ночного рез..