Использование переменных в скетчах
Что такое переменные и как можно использовать их в скетче.
Последнее обновление: 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®, типы связаны со значениями, а не с именами переменных, и переменной можно присвоить значение любого типа. Это называется динамической типизацией.