Использование переменных в скетчах

Что такое переменные и как можно использовать их в скетче.

Последнее обновление: 28.11.2022


Переменная — это место для хранения данных. У неё есть имя, значение и тип. Например, следующая инструкция (называемая объявлением):

int pin = 13;

создаёт переменную с именем pin, значением 13 и типом int.

В дальнейшем в программе на эту переменную можно ссылаться по её имени — в этот момент её значение будет найдено и использовано. Например, в инструкции:

pinMode(pin, OUTPUT);

в функцию pinMode() будет передано значение pin (то есть 13). В данном случае переменная на самом деле не является необходимостью — следующая инструкция работала бы точно так же:

pinMode(13, OUTPUT);

Преимущество переменной в этом случае состоит в том, что реальный номер вывода нужно указать только один раз, но использовать его можно многократно. Поэтому если впоследствии вы решите перейти с вывода 13 на вывод 12, достаточно изменить одно место в коде. Кроме того, переменной можно дать описательное имя, чтобы сразу было понятно её назначение (например, программа, управляющая RGB-светодиодом, может содержать переменные redPin, greenPin и bluePin).

Присваивание значений

У переменной есть и другие преимущества по сравнению с числовым значением. Что важнее всего — значение переменной можно изменить с помощью присваивания (обозначается знаком равенства). Например:

pin = 12;

изменит значение переменной на 12. Обратите внимание, что тип переменной здесь не указывается: присваивание его не меняет. Иными словами, имя переменной навсегда связано с её типом — меняется только значение. [1]

Примечание

Переменную необходимо объявить до того, как ей можно будет присвоить значение. Если включить предыдущую инструкцию в программу без первой инструкции, приведённой выше, вы получите сообщение наподобие: error: pin was not declared in this scope («ошибка: pin не объявлен в данной области видимости»).

Когда вы присваиваете одну переменную другой, вы делаете копию её значения и сохраняете эту копию в области памяти, связанной с другой переменной. Изменение одной переменной не влияет на другую. Например, после выполнения:

int pin = 13;
int pin2 = pin;
pin = 12;

только pin имеет значение 12; pin2 по-прежнему равно 13.

Область видимости

Вы, наверное, задаётесь вопросом: что означало слово «scope» («область видимости») в том сообщении об ошибке? Оно обозначает ту часть программы, в которой переменную можно использовать. Это определяется тем, где именно вы её объявляете.

Глобальные переменные

Если вы хотите иметь возможность использовать переменную в любом месте программы, объявите её в начале кода. Такая переменная называется глобальной; вот пример:

int pin = 13;
void setup()
{
  pinMode(pin, OUTPUT);
}
void loop()
{
  digitalWrite(pin, HIGH);
}

Как видите, pin используется и в функции setup(), и в функции loop(). Обе функции обращаются к одной и той же переменной, поэтому изменение её в одной функции влияет на её значение в другой, как в следующем примере:

int pin = 13;
void setup()
{
  pin = 12;
  pinMode(pin, OUTPUT);
}
void loop()
{
  digitalWrite(pin, HIGH);
}

Здесь функция digitalWrite(), вызываемая из loop(), получит значение 12, поскольку именно это значение было присвоено переменной в функции setup().

Локальные переменные

Если переменная нужна только в одной функции, её можно объявить там же — в таком случае её область видимости будет ограничена этой функцией. Например:

void setup()
{
  int pin = 13;
  pinMode(pin, OUTPUT);
  digitalWrite(pin, HIGH);
}

В данном случае переменная pin может использоваться только внутри функции setup(). Если попробовать сделать что-то подобное:

void loop()
{
  digitalWrite(pin, LOW); // ошибка: pin не находится в области видимости здесь.
}

вы получите то же сообщение, что и раньше: error: 'pin' was not declared in this scope. То есть, даже если переменная pin объявлена где-то в программе, вы пытаетесь использовать её за пределами её области видимости.

Почему не делать все переменные глобальными?

Вы, возможно, задаётесь вопросом: зачем вообще ограничивать область видимости переменной? Ведь если неизвестно, где она может понадобиться, почему бы не использовать глобальную переменную?

Совет

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


Примечания

[1] В некоторых языках программирования, например в Python®, типы связаны со значениями, а не с именами переменных, и переменной можно присвоить значение любого типа. Это называется динамической типизацией.