Перейти к содержанию

Функция define в Ардуино описание, как работает

Функция define в Ардуино описание

Инструкция #define в Arduino IDE позволяет называть значения (константы), которые делают программу более понятной. Можно определить имя константы или фрагмента кода один раз в начале программы, а затем использовать только это имя в коде для Arduino Uno. Давайте рассмотрим правильные способы использования функции #define в языке программирования Arduino IDE с подробным описанием и примерами скетчей.

Необходимые компоненты:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • светодиоды и резисторы
  • макетная плата
  • коннекторы

Дополнительные материалы на эту тему:

  1. Описание функции pinMode в Ардуино
  2. Что такое внешние прерывания в Ардуино
  3. Справочник по языку программирования Ардуино

Константы, определенные с помощью директивы #define, не занимают места в памяти, поскольку Arduino IDE подставляет значения вместо имен при компиляции скетча. Действие этой директивы можно сравнить с ‘СРАВНИТЬ’ и ‘ЗАМЕНИТЬ’. Во время компиляции Arduino IDE находит в программе фрагмент кода <который нужно изменить> и заменяет его на фрагмент кода <который нужно вставить> в программу.

#define в Ардуино что это значит, описание

Функция define в Ардуино описание

Вот пример программы с мигающими светодиодами. С помощью директивы #define мы дали имена портам 13 и 12, к которым подключены светодиоды. В программе удобнее использовать имена, а не цифры, чтобы не вспоминать каждый раз, какой цвет к какому выводу подключен. Утилита Arduino IDE автоматически заменит названия RED и BLU на соответствующие числовые значения во время компиляции программы.


#define RED 13
#define BLU 12
 
void setup() {
  pinMode(RED, OUTPUT);
  pinMode(BLU, OUTPUT);
}

void loop() {
  digitalWrite(RED, HIGH);
  delay(1000);
 
  digitalWrite(RED, LOW);
  delay(1000);
 
  digitalWrite(BLU, HIGH);
  delay(1000);
 
  digitalWrite(BLU, LOW);
  delay(1000);
}

Функции #ifdef, #ifndef и #endif в Arduino IDE

#ifdef Arduino IDE проверяет, встречалось ли это определение ранее в программе; если да, то блок кода размещается со следующей строки по #endif. В следующем небольшом примере проверяется, был ли знак отладки ранее определен в #define, если да, то код будет выполнен (вывод сообщения на монитор порта — serial monitor Arduino IDE), если знак не определен, то сообщение не будет выведено на монитор порта.

#ifdef A PROPOS DE
  Serial.println ("Message");
#endif

#ifndef Arduino IDE проверит, встречалось ли уже это определение в программе, и, если нет, поместит блок кода из следующей строки в #endif. В следующем простом примере программы мы объявляем новую константу, если только мы уже не объявляли константу ранее в скетче. Если определение с таким именем уже использовалось, то программа будет игнорировать строки внутри конструкции #ifndef … #endif.

#ifndef RED
  #define RED 13
#endif

Замена функций с помощью define в Arduino IDE

Мигалка на Ардуино: мигание двумя светодиодами

Кроме использования define в программе для объявления констант, можно заменять целые фрагменты кода с помощью директивы #define. Это более сложный, но интересный вариант использования команды define в Ардуино, который позволяет создать много разных упрощающих инструкций в скетче. Например, мы можем в первом примере заменить функцию pinMode() на конструкцию с дефайн с заданными параметрами.

#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(13);
  out(12);
}

void loop() {
  on(13, 1000);
  off(13, 1000);
  on(12, 1000);
  off(12, 1000);
}

Обратите внимание, что on(13, 500) и другие строчки не являются функциями, конструкция просто подставляет в код нужный фрагмент кода. В более сложных программах есть риск создать самому ошибки, так как в скетче могут быть десятки подключаемых библиотек, где инструкция дефайн может что-то незаметно для вас поменять. При этом будут возникать ошибки компиляции или ошибки во время исполнения программы.

Arduino #define или const, что лучше использовать

Иногда бывает не удобно применять директиву #define для создания констант, в этом случае используют ключевое слово const. В отличие от глобальных переменных, значение const должно быть определено сразу при объявлении константы. Помните, что при использовании #define имена следует делать уникальными, чтобы не было совпадений с командами или функциями, которые используются в подключаемых библиотеках.

const int RED = 13;
const int BLU = 12;
 
void setup() {
  pinMode(RED, OUTPUT);
  pinMode(BLU, OUTPUT);
}

void loop() {
  digitalWrite(RED, HIGH);
  delay(1000);
 
  digitalWrite(RED, LOW);
  delay(1000);
 
  digitalWrite(BLU, HIGH);
  delay(1000);
 
  digitalWrite(BLU, LOW);
  delay(1000);
}

Заключение. Если использовать константу вместо дефайн из последнего примера, то результат будет одинаковый – в коде вместо переменной RED будет автоматически подставляться цифра 13. На константы в программе действуют общие правила области видимости глобальных и локальных переменных. Кроме того, использование #define Arduino или const не дает никаких преимуществ, с точки зрения экономии объема памяти.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

newzaym
➜