3.01. Типы данных и переменные.md


Теперь, когда вы знаете базовую структуру программы для Рудирона, давайте научимся работать с её главным строительным материалом 0 данными. Представьте, что вы создаёте устройство, которое считает, сколько раз нажали кнопку, или показывает температуру в комнате. Для этого программе нужно где-то хранить эту информацию. Место для хранения данных называется переменной.

Переменные - ваши помощники в коде

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

Главное удобство переменных в том, что их содержимое можно изменять в любой момент. Если вам нужно, чтобы светодиод мигнул не 5, а 10 раз, вы просто меняете число в «коробке», а не переписываете всю программу.

Память микроконтроллера Рудирон ограничена. Представьте её как небольшой шкаф с полками. Каждая переменная занимает в этом шкафу определённое место. Чтобы использовать это пространство эффективно, для каждого типа данных существует своя «коробка» подходящего размера - тип данных.

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

Ядро Рудирона следует стандартам C++, предоставляя набор типов данных, адаптированных для программирования микроконтроллеров. Выбор правильного типа - это как выбор правильного контейнера: для хранения одного яблока не нужна огромная коробка.

Тип данных Назначение и диапазон Размер в памяти
bool Логические значения: true или false. 1 байт
byte Маленькие целые числа: от 0 до 255. 1 байт
char Один символ (например, ‘A’, ‘%’). 1 байт
int Целые числа: от -2,147,483,648 до 2,147,483,647. 4 байта
float Дробные числа (6-7 знаков после запятой). 4 байта
double Дробные числа повышенной точности (до 15 знаков). 8 байт
String Текстовые строки любой длины. Переменный
  • int. Идеально подходит для счётчиков (нажатия кнопок, шаги, обороты).
    Пример: int clickCount = 0;
  • float. Используется для хранения результатов измерений с датчиков, где важна дробная часть (температура, напряжение, расстояние).
    Пример: float temperature = 24.5;
  • double. Нужен для сложных научных или математических расчётов, где важна максимальная точность. В большинстве проектов достаточно float.
    Пример: double pi_precise = 3.1415926535;
  • char. Хранит один-единственный символ. Незаменим при работе с текстовыми протоколами, где нужно анализировать команды посимвольно.
    Пример: char command = 'A';
  • String. Удобный тип для работы с целыми текстовыми строками - например, для вывода сообщений в монитор порта.
    Пример: String message = "System OK";
  • bool. Основа всей логики. Хранит только два состояния: «да» (true) или «нет» (false). Идеален для переменных-флагов (например, isLightOn).
    Пример: bool isButtonPressed = false;
  • byte. Очень экономный тип. Используйте его вместо int для значений, которые точно не превысят 255 (например, яркость ШИМ или RGB-компонента цвета).
    Пример: byte pwmValue = 128;

Истина и ложь в C++

Тип bool напрямую хранит логические значения true и false. Они помогают вашей программе принимать решения, но в C++ понятие истины и лжи немного шире.

В C++ любое числовое значение может быть интерпретировано как логическое:

  • Ноль (0) всегда считается ложью (false).
  • Любое ненулевое значение (1, 42, -5) всегда считается истиной (true).

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

Пример:

void setup() {
  Serial.begin(9600);
  
  bool isReady = true;

  Serial.println(isReady); // Выведет: 1
  
  isReady = false;
  Serial.println(isReady); // Выведет: 0

  int sensorValue = 42;
  // Так как sensorValue не равен 0, он будет обработан как true
  Serial.println(sensorValue != 0); // Выведет: 1 (true)

  sensorValue = 0;
  // Так как sensorValue равен 0, он будет обработан как false
  Serial.println(sensorValue != 0); // Выведет: 0 (false)
}

void loop() {}

Примечание. Serial.println() при выводе bool печатает 1 для true и 0 для false. Это наглядно показывает, как микроконтроллер представляет эти значения внутри себя.

Квалификаторы типов: short, long и unsigned

Иногда стандартные типы данных нужно немного «модифицировать» - сделать их диапазон больше, меньше или убрать отрицательные числа. Для этого существуют квалификаторы.

  • short. Уменьшает int до 2 байт (диапазон от -32,768 до 32,767). Полезно для экономии памяти, когда вы уверены, что число не будет большим.
    Пример: short smallCounter = 500;
  • long. На некоторых платформах увеличивает размер int, но на Рудироне (32-битная архитектура) long int занимает те же 4 байта, что и int. Однако существует long long, который занимает 8 байт и позволяет хранить огромные числа.
    Пример: long long veryBigNumber = 10000000000;
  • unsigned. Этот квалификатор убирает знак у числового типа, делая его только положительным. Это удваивает его верхний предел. Например, unsigned int хранит значения от 0 до 4,294,967,295 (4 байта).
    Пример: unsigned int timerMillis = 3600000; // Хранит время в мс, оно не бывает отрицательным

Работа с символами и таблица ASCII

Тип char хранит не просто букву, а её числовой код из таблицы ASCII. Это стандарт, который сопоставляет каждому символу (букве, цифре, знаку препинания) уникальное число от 0 до 127. Например, символ 'A' — это на самом деле число 65, а символ '0' — это число 48.

Ниже приведена часть таблицы ASCII для справки:

Код Символ Код Символ Код Символ Код Символ Код Символ Код Символ
32 (пробел) 48 0 64 @ 80 P 96 ` 112 p
33 ! 49 1 65 A 81 Q 97 a 113 q
34 " 50 2 66 B 82 R 98 b 114 r
35 # 51 3 67 C 83 S 99 c 115 s
36 $ 52 4 68 D 84 T 100 d 116 t
37 % 53 5 69 E 85 U 101 e 117 u
38 & 54 6 70 F 86 V 102 f 118 v
39 55 7 71 G 87 W 103 g 119 w
40 ( 56 8 72 H 88 X 104 h 120 x
41 ) 57 9 73 I 89 Y 105 i 121 y
42 * 58 : 74 J 90 Z 106 j 122 z
43 + 59 ; 75 K 91 [ 107 k 123 {
44 , 60 < 76 L 92 \ 108 l 124 |
45 - 61 = 77 M 93 ] 109 m 125 }
46 . 62 > 78 N 94 ^ 110 n 126 ~
47 / 63 ? 79 O 95 _ 111 o

Как создать переменную?

Объявление переменной - это первый шаг в написании почти любой программы.
1. Выберите тип данных (int, float и т.д.).
2. Дайте переменной понятное имя, отражающее её назначение (например, speed для скорости). Имя должно следовать правилам:

  • Может содержать только латинские буквы, цифры и знак _.
  • Не может начинаться с цифры.
  • Чувствительно к регистру (speed и Speed - это разные переменные).
  • Не может совпадать с зарезервированными словами (int, void, for и т.д.).
  1. При необходимости укажите начальное значение с помощью знака =.

Пример:

int clicks = 10; // Переменная clicks хранит количество нажатий

Рис. 1. Анатомия переменной

Проверка работы через Serial

Как узнать, что происходит внутри программы и какие значения хранят ваши переменные? Рудирон позволяет отправлять сообщения на компьютер через последовательный порт (Serial).

Для использования Serial нужно: 1. Инициализировать его в setup(): Serial.begin(9600); 2. Отправлять данные: Serial.print() (вывод без переноса строки) или Serial.println() (вывод с переносом на новую строку). 3. Смотреть результат в Мониторе порта в Arduino IDE (Tools → Serial Monitor). Не забудьте выставить ту же скорость (9600) в окне монитора.

Пример:

void setup() {
  Serial.begin(9600); // Начать связь с компьютером
  int counter = 42;
  delay(2000);
  Serial.print("Initial value: ");
  Serial.println(counter); // Отправить значение на компьютер
}

void loop() {}

Загрузив этот код и открыв монитор порта, вы увидите сообщение «Initial value: 42». Это подтвердит, что ваша переменная создана и имеет правильное значение.

Рис. 2. Монитор порта

Зачем это нужно?

Переменные и типы данных - это основа ваших программ. Они позволяют хранить состояния, результаты измерений и счётчики. Правильный выбор типа данных делает вашу программу эффективной и экономит драгоценную память микроконтроллера. А Serial - это ваше «окно» во внутренний мир Рудирона, незаменимый помощник в поиске ошибок и отладке.


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