Меню пользователя Arduino на практике

Процесс создания любого практического решения очень важен, ведь от корректности его составления непосредственно зависит польза в проектах, где он будет неотъемлемой частью системы (плата имеет все необходимые комплектующие, которые позволяют использовать её в процессе создания меню пользователя).

Меню пользователя Arduino на практике

Для организации длительного и продуктивного рабочего процесса, в первую очередь, необходимо иметь представление о полном процессе создании одноуровневого меню, которое запускает определённую функцию без необходимости раскрытия подменю. Существенно расширить возможности Arduino можно при помощи использования специальной платы расширения SHIELD-LCD16x2, которая имеет в своей конструкции:

  • двухстрочные модули ЖК-дисплея, где в каждой строке 16 знаков;
  • кнопки в количестве четыре штуки;
  • дополнение в виде линий GPIO в количестве восемь штук;
  • микроконтроллер PIС (обмен информации с Arduino UNO происходит по средствам интерфейса TWI);
  • библиотеки функций, значительно упрощающие весь рабочий процесс с модулем, что позволяет даже новичку в данном деле без труда разобраться как им пользоваться.

Arduino — принцип функционирования на практике примерного меню

Разобрав на примете то, как программа работает, даже неопытному пользователю всё станет предельно понятно. Предлагаемое решение оснащено несколькими уникальными функциями, которые также как и библиотеки Arduino могут без труда подстраиваться под свои потребности.

Несмотря на то, что в нашем примере применяется плата типа SHIELD-LCD16x2, которая полностью готова к использованию, введя некоторые корректировки можно подстроить меню таким образом, что возможно его применение с дисплеем символьного типа самого различного расширения. Такие расширение может представлять собой четыре строки, где каждая имеет двадцать знаков или одну строку с шестнадцатью знаками в каждой строке и много иных вариантов.

Рассматривая четырёх строчное меню, можно увидеть, что на сам ЖК-дисплей вмещается размещение только двух строк по шестнадцать знаков каждая. Управление при этом осуществляется посредством четырёх клавиш, нумерация которых начинается слева направо в такой последовательности: 1, 2, 3, 4, где:

  • первая кнопка: позволяет осуществить перемещение маркера строки меню по направлению вниз;
  • вторая кнопка: позволяет осуществить перемещение маркера по направлению вверх;
  • третья кнопка: данную кнопку приложение может применять или не применять, ведь чаще всего она применяется в меню многоуровневого типа;
  • четвёртая кнопка: первая с правой стороны. Ей подтверждается сделанный выбор, по функциональности она такая же, как кнопа Enter на клавиатуре ПК.

Во взятом за пример меню экран ЖК-модуля показывает 2 строки, где в каждой по 16 знаком, но согласно условий примера у нас 4 строки. Учитывая это, отобразить все строки меню полностью на таком экране невозможно. Это и является причиной его разделения на фрагменты по две строки каждый.

Перезагружая микроконтроллер или отключая от него подачу электроэнергии, предположительно на дисплее отображается 1-я и 2-я строчки меню, а маркер выбора будет стоять на верхней строке. Нажимая клавишу «вниз», маркер спустится на нижнюю, в данном случае 2-ю строку. Ещё одно нажатие кнопки не переместит маркер далее на иные строки, но при этом появится отображение строк меню под номером два и три, то есть маркер будет отображаться на третьей строке меню.

Повторное нажатие кнопки показывает отображение строк меню номер три и четыре, но положение маркера неизменно (строка 2), при этом указывая на четвёртый пункт меню. Для возврата в изначальное положение, необходимо нажать «вниз» ещё раз. Что касается кнопки «вверх», то принцип её функционирования такой же.

При этом движение маркера осуществляется в противоположном направлении. То есть, нажимая данную кнопку на начальных этапах функционирования программы, маркер перемещается на вторую строку дисплея, при этом отображается третья и четвёртая строки меню. Дальнейшее нажатие размещает маркер на первой строке меню, но отображаться будут всё те же строки. Ещё одно нажатие «вверх» не изменяет месторасположение маркера, но изменяет строки отображения на дисплее, теперь это вторая и третья строки.

Как уже было сказано выше, строка дисплея состоит из ряда последовательных знаков в количестве шестнадцать штук, где два из них это символы, обозначающие маркер, а именно «<» и «>». Это означает, что длина самой надписи может состоять только из 14 символов. Применение функции User_Menu реализуется при помощи нажатия на клавишу номер 4, нажатие на которую возвращает номер выбранного пункта или 0, в случае осуществления неверного выбора или его отсутствия.

Arduino — обозначение элементов меню

Начало примерной программы состоит из соответствующих определений и переменных, по которым и определяются все параметры ЖК-дисплея где отображается:

  • меню;
  • пункты;
  • информационные сообщения.

В первую очередь задаётся количество пунктов меню, в данном примере оно имеет четыре строки, это говорит о том, что menuoptions будет равно четырём.

#define menuoptions 4

Далее особое внимание стоит уделить определённым параметрам языка «С», который является основой компилятора Arduino. В данном языке конец каждой строки из текста или символов представлен байтом равным нулю, который и подаёт на компилятор сигнал об окончании на данном участке последовательности и необходимости остановки производимых операцию. При создании сообщения размером в 14 символов оно определяется как char-сообщение[14].

Конец данного определения некоторые компиляторы дополняют «0», что позволяет завершить последовательность, иные не прибегают к такому методу, ведь они рассматривают такое определение не как надпись, а как строку чисел. Что касается компилятора Arduino, то он этого не делает, что означает, что в процессе резервирования места для string такой длины, нужно выбрать один из подходящих вариантов:

  • создать свою функцию, которая будет отображать конкретное число знаков, без необходимости при этом проверять имеется ли в конце нулевой байт;
  • подготовить больше на 1 символ, чем нужно.

Учитывая вышесказанное, показатель menuitemlen и max количество отображаемых знаков должно равняться, но отнимать при этом нужно один, а не два, ведь два знака уже заняты указателями маркера.

#define menuitemlen 15

Ещё оно определение, а именно lcd_lines — тривиальное. В данном случае нужно только определить количество строк дисплея, где отображается меню. По рассматриваемому дисплею, это будет выглядеть так:

#define lcd_lines 2

Следующим этапом является обозначение элемента меню, включающего в себя все свойства индивидуальной строки меню. Структура с полями представляет собой:

  • menu_message: длина не более 14 знаков, описывает строки меню;
  • whereisptr: постоянная величина, определяющая величину смещения указателя для отображения 2-х строк меню. Так как 1 и 2 строки полностью отображаются на дисплее, то их константа равна «0», далее её показатель возрастает на единицу для каждой последующей строки.
  • у0: предоставляет информацию посредством отображения на дисплее информации, о строке, где размещён маркер меню.

Каждые отдельные данные применяются для образования массива в пространстве const программы, который содержит полное определение меню. Такой массив имеет название menu_lines и состоит из элементов menuoptions, где каждый представляет из себя неотъемлемую часть структуры, позволяющая связать поля определений каждой отдельной строки меню. В разбираемом примере это будет выглядеть так:

const menuitem menu_lines[menuoptions]=

{{"First menu lin", 0, 1},

{"Second menu li", 0, lcd_lines},

{"Third menu lin", 1, lcd_lines},

{"Fourth menu li", 2, lcd_lines}};

Кроме того, есть необходимость в индивидуальном указателе, предназначенном для каждой отдельной структуры меню, номер действующей позиции в меню, переменной с возможностью выбора пользователя и номера кнопки:

menuitem*menu_lines_ptr;

signed char menu_position;

char user_choice;

int pressed;

Достаточно важным типом переменных является указатель, который значительно упрощает весь процесс программирования. Согласно примеру, при указании указателя на 1-й элемент массива добавляется один, в случае отсутствия необходимости подсчёта байтов и выявление свойств элемента, указывать он будет на вторую позицию в данном массиве.

Arduino — применение меню на практике

Ознакомившись со всем меню, далее можно начинать процесс по их функциональному отображению в программе. Первое, что следует сделать, так это присвоить функции void setup() исходный показатель переменной, которая определяет действующую позицию в меню (menu_position = 0) и также посредством функции Display_Menu() отобразить меню.

В функции void loop() считываем номер нажатой кнопки с помощью вызова: pressed = Number_of_Button();

В случае нажатия кнопки, отличной от «0» можно задействовать функцию User_Menu(pressed), тип действия которой непосредственно зависит от соответствующего номера кнопки (номер кнопки 1 — перемещают маркеры вниз, 2 — вверх, 4 — выбор пункта меню).

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

void loop()

{

pressed = Number_of_Button();

if (pressed > 0) user_choice = User_Menu(pressed);

switch (user_choice)

{

case 1:

//действие 1

break;

case 2:

//действие 2

break;

case 3:

//действие 3

break;

case 4:

//действие 4

break;

}

}

Arduino — дополнительные данные в помощь по созданию меню

Одна переменная может содержать адрес иной переменной и в данном случае речь идёт о указателе (pointer). Применение указателей на практике позволяет в результате поучить код, значительно эффективнее того, который получается посредством применения иных методов. Некорректное их применение может привести к ухудшению читаемости программы.

Основная тому причина — их хаотичное применение без каких-либо комментариев с обозначением переменных непонятного типа. Если рассматривать данную ситуацию с иной стороны, то наличие возможности прямо указывать на конкретную область памяти и управлять ими является неоспоримым преимуществом и самым мощным механизмом языка С. Обратим внимание на пример:

char x = 1, y = 2, z[5];

char* указатель;

указатель =&x; //переменная указатель указывает на x

y =*указатель; //теперь переменная y имеет значение 1

*указатель = 0; //теперь переменная x имеет значение 0

указатель = &z[0] //переменная указатель указывает на первый элемент массива z

При объявлении указателя в обязательном порядке применяется символ «*», представляющий собой оператор косвенной адресации. Данный оператор языка «С», что применяется к указателю, позволяет получить наполнение конкретного объекта.

Использование языка «С» предоставляет возможность также воспользоваться ещё одним методом присвоения указателей определённой переменной. Одноаргументный оператор & применяется для объектов, занимающих память переменных и массивов. Основное их предназначение — возврат адреса переменной.

Указатели упрощают и ускоряют работу программы, что отражается на причине их столь широкого применения современными пользователями. В комплексе с рядом иных преимуществ указатели пользуются большим спросом, неотъемлемой частью современных систем, что мотивирует ведущих разработчиков отрасли неустанно трудиться над удовлетворением стремительно растущих потребностей пользователей.

Все параметры вызова функций передаются по значению в языке «С», в конечном итоге такая функция не имеет прямого доступа к аргументам, которые принадлежат подпрограмме, вызывающей её. Только один из способов может позволить осуществить все операции с передающимися из иной подпрограммы переменными, который заключается в передаче указателей на данные переменные в роли аргументов вызова функций.

void Замена (int*Tx, int *Ty)

{

int temp;

temp =*Tx;

*Tx = *Ty;

*Ty = temp;

}

 

void main(void)

{

int A = 10, B = 20;

Замена (&A,&B); //замена значений переменных A и B

}

Рассматривая вышеприведённый пример, можно увидеть, что все действия внутри функций осуществляются прямо над переменными главной программы, без применения при этом каких-либо «посредников» (переменные не размещаются в стеке в памяти и иное). Каждая операция посредством применения указателя автоматически приводит к параметрам указываемых объектов. При этом правила арифметики указателей достаточно просты.

При указании указателем Т на начало массива элемента типа int и при этом его тип так же *int, операция Т=Т+1 тут же передвинет указатель на последующий элемент массива. К самому адресу указателя не добавляется 1 или 2, а связано это с тем, что длина переменной типа int равна 2 байта. На сегодняшний день только определённые операции можно реализовать с помощью указателя, ведь все иные будут недействительны. К ним относятся:

  • присвоение указателей объектам с таким же типом;
  • «+» и «-» указателя и целого числа;
  • два указателя с элементами одинакового массива могут сравниваться и вычитаться;
  • возможность приравнивания указателя к значению «0»;
  • указателю можно присвоит значение равное «0».

Недопустимо осуществлять сложение, умножение, деление, перемещение вправо-влево, добавлять числа с плавающей запятой, осуществлять логические операции двух указателей, если они даже относятся к одному типу. К запрещённым процессам также относится присвоение указателю на объект одного типа без преобразования указателя на объект иного типа.

В разбираемом примере указатель указывает на массив, который содержит структуры данных. Каждому отдельному полю структуры присвоено своё имя, на которые можно ссылаться напрямую. Нет необходимости указывать на смещение конкретного элемента структуры. При необходимости указания на поле с определённым именем имеется оператор со стрелкой «>».

typedef struct параметры

{

int x;

int y;

int высота;

}

параметры*указатель;

указатель->x; обеспечивает обращение к полю x

указатель->высота; обеспечивает обращение к полю высота

обеспечивает обращение к полю x-указатель->высота; обеспечивает обращение к полю высота

Создавая массив посредством применения структуры параметров, это непосредственно отразится на указателе, который изменится на количество байтов, которое будет равно размеру 1-го элемента массива, при этом указывая на отдельные элементы. Вычислять при этом количество байтов не будет необходимости.

параметры массив_параметров[10]; //определение массива-списка параметров

параметры*указатель = &tablica_parametrów[0]; //теперь указатель указывает

//на начало массива

(указатель+5)->x; //укажет на поле x пятого элемента массива

//позволяя получение или изменение переменной;

На самом деле указатели в языке «С» представляют собой достаточно серьезную тему.

В случае возникновения интереса и необходимости в расширении уже имеющихся знаний, приобретения практических навыков использования указателей уместным будет прочитать книгу по языку «С» и иные учебники, которые доступны в Интернете в неограниченном количестве.

AKX00004 Обучающий набор Arduino; 5÷12ВDC; ABX00004,ASX00002,ASX00003

ASX00003 Дочерняя плата; контроллер сервомеханизмов; Arduino Pro; 3,3ВDC

Другие новости

Пневматика является важнейшей частью автоматических устройств. Компактные размеры и высокие технические характеристики современных...
Имя Belden у профессионалов своего дела ассоциируется с высочайшим качеством кабельной продукции и оборудования для обработки и...
Регистрация