Переменная в 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.
