Директива #define Arduino IDE

СОДЕРЖАНИЕ ►
Директива #define в Arduino IDE позволяет задавать имена значениям (константам), которые делают скетч более понятным. Т.е. можно в начале программы один раз определить имя константы или фрагмента кода, а затем использовать в скетче только это название. Рассмотрим на примерах с описанием правильные варианты использования функции #define в языке программирования Arduino IDE.
Arduino define описание директивы
Константы, которые определены через директиву #define, не занимают места в памяти микроконтроллера, так как Arduino IDE подставит значения вместо имен при компиляции скетча. Работу директивы можно сравнить с операцией НАЙТИ и ЗАМЕНИТЬ в текстовом редакторе. При компиляции скетча Arduino IDE находит в программе часть кода <что меняем> и заменяет ее на кусок кода <на что меняем>.
Синтаксис директивы:
#define <что меняем> <на что меняем>
При использовании директивы дефайн следует избегать использования имени другой переменной, константы или команды Ардуино, иначе оно оно будет заменено при компиляции. И обратите внимание, что в строчке не ставится точка с запятой и знак равенства, как это происходит при объявлении переменной, иначе компилятор выдаст ошибку. Рассмотрим использование #define на примере с подробным описанием.
Пример директивы: Arduino define pin
#define RED 11 // присваиваем имя RED для пина 11 #define GRN 12 // присваиваем имя GRN для пина 12 #define BLU 13 // присваиваем имя BLU для пина 13 void setup() { pinMode(RED, OUTPUT); // используем Pin11 для вывода pinMode(GRN, OUTPUT); // используем Pin12 для вывода pinMode(BLU, OUTPUT); // используем Pin13 для вывода }
Это часть кода, от примера с мигающим трехцветным светодиодом. В данном примере мы присвоили имена для пинов 11, 12 и 13, к которым подключен светодиод. При написании кода нам удобнее использовать имена вместо номеров, чтобы каждый раз не вспоминать какой цвет к какому пину подключен. А программа автоматически будет заменять имена RED, GRN, BLU на соответствующие значения при компиляции.
Команды #ifdef, #ifndef и #endif в скетче
Инструкция #ifdef Arduino IDE проверят, было ли встречено в программе данное определение ранее, если было, то ставится блок кода с последующей строки и до #endif. В примере проверяется был ли ранее в #define определен признак отладки, если да, то код (вывод сообщения на монитор порта Arduino IDE) будет выполнен, если признак не определен, то сообщение на мониторе выводиться не будет.
#ifdef OTLADKA Serial.println ("Message"); #endif
Инструкции #ifndef проверят, было ли встречено в программе данное определение ранее и, если не было, то ставится блок кода с последующей строки и до #endif. В следующем простом примере мы объявляем новую константу, если только не объявляли ее в скетче ранее. Если дефайн с таким именем уже использовался, то программа проигнорирует строчки внутри конструкции #ifndef … #endif.
#ifndef RED #define RED 11 #endif
Замена функций с помощью define Arduino
Кроме использования дефайн в программе для объявления констант, можно заменять целые фрагменты кода с помощью директивы #define. Это более сложный, но интересный вариант использования define, который позволяет создать много разных упрощающих инструкций в скетче. Например, мы можем в первом примере заменить функцию pinMode() на конструкцию с дефайн с заданными параметрами.
#define out(pin) pinMode(pin, OUTPUT) // обратите внимание, что точка-запятая не ставится void setup() { out(11); out(12); out(13); }
В примере мы закодировали команду pinMode() одним словом «out». Теперь, где в скетче встретится слово «out», компилятор подставит строку pinMode(pin, OUTPUT) с заданным параметром pin. Таким же образом можно заменить команды digitalWrite() и delay(). Используя RGB светодиод или три обычных светодиода с Ардуино вы можете проверить работу следующего примера скетча с директивой дефайн.
#define out(pin) pinMode(pin, OUTPUT) #define on(pin, del) digitalWrite(pin, HIGH); delay(del) #define off(pin, del) digitalWrite(pin, LOW); delay(del) void setup() { out(11); out(12); out(13); } void loop() { on(11, 500); off(11, 500); on(12, 500); off(12, 500); on(13, 500); off(13, 500); }
Обратите внимание, что on(11, 500) и другие строчки не являются функциями, конструкция просто подставляет в код нужный текст. В более сложных программах есть риск создать самому ошибки, так как в скетче могут быть десятки подключаемых библиотек, где дефайн может что-то незаметно поменять. При этом будут возникать ошибки компиляции или ошибки во время исполнения программы.
Arduino define или const, что выбрать
Иногда бывает не удобно применять директиву #define для создания констант, в этом случае используют ключевое слово const. В отличие от глобальных переменных, значение const должно быть определено сразу при объявлении константы. Помните, что при использовании #define имена следует делать максимально уникальными, чтобы не было совпадений с командами из подключаемых библиотек.
const int RED = 11; // присваиваем имя RED для пина 11 const int GRN = 12; // присваиваем имя GRN для пина 12 const int BLU = 13; // присваиваем имя BLU для пина 13 void setup() { pinMode(RED, OUTPUT); // используем Pin11 для вывода pinMode(GRN, OUTPUT); // используем Pin12 для вывода pinMode(BLU, OUTPUT); // используем Pin13 для вывода }
Если использовать константу вместо дефайн в скетче из первого примера, то результат будет одинаковый – в коде вместо переменной RED будет подставляться цифра 11. На константы в программе действуют общие правила области видимости глобальных и локальных переменных. Кроме того, использованием #define или const не дает никаких преимуществ, с точки зрения экономии объема памяти микроконтроллера.
Подборка на тему: Директива #define Arduino IDE
- Энкодер управление меню на дисплее
- Включение светодиода кнопкой Ардуино
- Диплом по программированию Ардуино
- RobotDyn UNO: распиновка, описание
Добавить комментарий