Привет, друзья! Рад вас всех видеть! Предлагаю ознакомиться со следующей
темой обучающего цикла - 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. А на
следующем уроке рассмотрим работу с многомерными массивами, которые тоже вам
должны встретиться при решении некоторых задач и чтении чужих готовых программ.
Теперь не забудьте проверить, что вы подпи́саны на канал, пиши́те комментарии и
дели́тесь ссылкой на видео с друзьями! На этом я прощаюсь и до новых встреч!
SMD светодиод 0603
SMD светодиоды видимого диапазона для поверхностного монтажа на плату Типоразмер 0603 Красный 619 ..
2.02грн.
Линейный шаговый двигатель - что это?
Линейный шаговый двигатель Привет, друзья! Мне выпала удачная возможность познакомить вас с, разр..
Радиатор для транзистора 21х15х10мм
Радиатор алюминиевый для пассивного охлаждения различных полупроводниковых силовых компонентов: тран..
13.03грн.
Стабилитроны 0,5Вт набор 3,3 ... 12В 100шт.
Набор стабилитронов 10 номиналов по 10шт.Номинальная мощность 0,5ВтРабочая температура -65°C ....
131.95грн.
Набор соединительных кабелей 70см для 3D-принтера, CNC RAMPS 1.4
Набор проводов с разъемами для системы RAMPS 1.4 , тоесть для шилдов управления 3D-принтером ил..
243.20грн.