Привет, друзья! Рад вас всех видеть! Предлагаю ознакомиться со следующей
темой обучающего цикла - 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. А на
следующем уроке рассмотрим работу с многомерными массивами, которые тоже вам
должны встретиться при решении некоторых задач и чтении чужих готовых программ.
Теперь не забудьте проверить, что вы подпи́саны на канал, пиши́те комментарии и
дели́тесь ссылкой на видео с друзьями! На этом я прощаюсь и до новых встреч!
Модуль реле 4-канальный 5В 10А
4-канальный модуль реле для подключения напрямую к дискретному выходу контроллера. Светодиодная инди..
130.62грн.
Модуль 8-ми дискретных входов I2C
Модуль 8-ми полностью гальванически развязанных дискретных входов с I2C коммуникацией на основе микр..
167.35грн.
Преобразователь уровней 5В 3,3В 8-канальный
Модуль 8-канального преобразователя логических уровней на специализированной микросхеме TXS0108E.При..
34.05грн.
Шестерня для зубчатого ремня на 36 зубьев под ось 8 мм
Используется для передачи и редукции крутящего момента от двигателя до оси 8 ммКоличество зубьев 36 ..
86.42грн.
Мини выключатель 250 В 3 А
Прикольный маленький выключатель питания, для врезки в монтажную панель или в корпус электронного ус..
11.75грн.