Переменные в Arduino: основы и практика

Переменная в Arduino — это именованная ячейка памяти, где хранятся данные определённого типа. В скетчах на Arduino (язык на базе C/C++) переменные нужно объявлять с указанием типа.


Как объявить переменную

Синтаксис:

тип имя_переменной = значение;

Примеры:

int ledPin = 13;          // целое число
float temperature = 25.5; // число с плавающей точкой
bool isOn = true;         // логическое значение
char letter = 'A';        // один символ
String message = "Hello"; // строка (осторожно с памятью)

Можно объявить без начального значения:

int counter;
counter = 0;

Основные типы данных в Arduino

Тип Размер Диапазон / особенности Когда использовать
bool 1 байт true / false Флаги, состояния (включено/выключено)
byte 1 байт 0–255 Компактное хранение небольших чисел
int 2 байта −32 768…32 767 Счётчики, пины, базовые числа
unsigned int 2 байта 0–65 535 Только положительные числа
long 4 байта Большие целые числа Длительные счётчики времени
float 4 байта Числа с дробной частью Измерения, вычисления
char 1 байт Один символ (ASCII) Отдельные символы
String переменный Текстовые строки Удобнее, но расходует больше памяти и может фрагментировать кучу

Для проектов на Arduino часто лучше избегать String и использовать массивы char[], если важна стабильность и экономия памяти.


Область видимости: глобальные и локальные переменные

Глобальные — объявляются вне функций (до setup()), видны везде, существуют всё время работы программы:

int globalCounter = 0;
 
void setup() {
  Serial.begin(9600);
}
 
void loop() {
  globalCounter++;
  Serial.println(globalCounter);
}

Локальные — объявляются внутри функции или блока, видны только там, исчезают после выхода из блока:

void loop() {
  int localCounter = 0; // существует только внутри loop()
  localCounter++;
}

Если попробовать обратиться к локальной переменной снаружи, компилятор выдаст ошибку: error: 'localCounter' was not declared in this scope.


Константы (const) и макросы (#define)

Когда значение не должно меняться, используйте const:

const int LED_PIN = 13;
const float PI = 3.14159;

Попытка изменить const-переменную вызовет ошибку компиляции — это помогает избежать случайных ошибок.

Альтернатива — #define (подстановка текста на этапе компиляции):

#define LED_PIN 13

const предпочтительнее, потому что у него есть тип и область видимости, а #define — просто текстовая замена.


Пример: мигание светодиода с переменными

const int ledPin = 13;      // константа: пин светодиода
int blinkCount = 0;         // глобальный счётчик миганий
unsigned long lastBlink = 0;// время последнего мигания
const long interval = 500;  // интервал в мс
 
void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}
 
void loop() {
  unsigned long currentMillis = millis();
 
  if (currentMillis - lastBlink >= interval) {
    lastBlink = currentMillis;
    digitalWrite(ledPin, !digitalRead(ledPin)); // инвертировать состояние
    blinkCount++;
    Serial.print("Миганий: ");
    Serial.println(blinkCount);
  }
}

Важные нюансы для Arduino

  • Память ограничена. На Arduino Uno всего 2 КБ SRAM. Избыток глобальных переменных, особенно String, может привести к сбоям и «странному» поведению.
  • Переполнение типов. Например, byte x = 255; x++; даст 0. Всегда учитывайте диапазоны типов.
  • Инициализация. Лучше явно задавать начальные значения, чтобы не зависеть от неопределённого состояния памяти.
  • Именование. Используйте понятные имена: sensorValue, buttonState. Для констант — верхний регистр: MAX_TEMP.

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