Arduino

технологии

Переменные

Переменная - это способ сохранения и дальнейшего использование данных в программе. Значение переменной может быть многократно изменено, в отличии от констант.

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

int a; // создаем переменную с именем a и типом int (целое число)
byte byte_var01 = 174; // создаем переменную с именем byte_var01, типом однобайтового целого и инициализируем ее значением 173

Имена переменных могут состоять из латинских букв, цифр и знака подчеркивания "_", но не могу совпадать с ключевыми словами языка (false, else, long и тд). При этом заглавные и строчные буквы различаются.

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

long numberOfServo;
byte current_hours;

Первый вариант обычно используют при объектно-ориентированном подходе, а второй - при процедурном.

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

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

  • глобальные
  • локальные

Глобальные переменные объявляются вне функций, обычно перед функцией setup(). Доступ к таким переменным возможен из любой функции файла.

int globalVar;

void setup()
{
  globalVar = 10;
}

void loop()
{
  globalVar++;
}

Локальные переменные - это переменные, объявленные в функции или в теле блоков if, for, while и др. Доступ к таким переменные возможен только из тоже же функции/блока, где они объявлены.

void setup()
{
  int localVar1 = 10;
}

void loop()
{
  int localVar2 = 100;

  localVar1++; // вызовет ошибку на стадии компиляции (обращение к локальной переменной, объявленной в другой функции)
  
  for (int i = 10; i < 10; i++) {
    int localVar1; // ошибки нет, локальная переменная с именем localVar1 может быть объявлена повторно  
    localVar2--;
  }
  
  localVar1 = 87; // также ошибка при компиляции (локальная переменная объявлена в блоке for и здесь не доступна)
}

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

static

Ключевое слово static используется для объявление локальных переменных, значение которых будет сохраняться между вызовами функции. Этим они отличаются от обычных локальных переменных, которые создаются при каждом вызове функции и уничтожаются при ее завершении.

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  static int a = 10;
  a++;
  Serial.println(a);
}

В этом примере переменная a будет создана только при первом запуске функции loop(). После этого при каждом вызове функции ее значением будет увеличено на единицу и мы увидим следующий вывод:

11
12
13
14
15
...

Обратите внимание, что значением 10 будет также присвоено переменной только при ее инициализации.

volatile

Ключевое слово volatile используется для переменных, значение которых может быть изменено чем-то, находящимся вне секции кода. Например параллельным потоком. При использовании ключевого слова volatile компилятор будет брать значение переменной из ОЗУ, а не из регистра (временной ячейки памяти).

При программировании Arduino использовать volatile следует только в том случае, если вы используете прерывания. Причем, если переменная занимает больше 8 бит, при чтении ее значения прерывания должны быть отключены. Это связано с тем, что в arduino используется 8-ми битный микроконтроллер и он может за раз считать только 8 бит, а при чтении другая часть переменной уже может измениться.