String Addition Operator — конкатенация строк в Arduino
Разбираем оператор + для объектов String в Arduino: как склеивать строки, числа и символы, и каких ошибок при этом избегать.
Строки в Arduino можно соединять самыми разными способами. Такое объединение называется конкатенацией: результирующая строка становится длиннее на величину добавляемого фрагмента. Оператор + позволяет объединить объект String с другим String, с массивом символов (char[]), с ASCII-представлением числовой константы или переменной, а также с отдельным символом (char).
// добавление константного целого числа к строке:
stringThree = stringOne + 123;
// добавление константного длинного целого числа к строке:
stringThree = stringOne + 123456789;
// добавление константного символа к строке:
stringThree = stringOne + 'A';
// добавление константной строки к строке:
stringThree = stringOne + "abc";
// сложение двух String:
stringThree = stringOne + stringTwo;
Как это работает
Конкатенация — это не просто синтаксический сахар. Каждый раз, когда вы «складываете» строки, Arduino выделяет новую область памяти под результат. Если делать это в цикле без контроля, память фрагментируется и рано или поздно заканчивается. Поэтому конкатенацию лучше применять там, где она действительно нужна — например, для формирования сообщений перед отправкой.
Оператор + также работает с возвращаемыми значениями функций, если тип возвращаемого значения совместим со String. Например:
stringThree = stringOne + millis();
Это допустимо, потому что функция millis() возвращает long, который можно добавить к строке. Аналогично работает и такой вариант:
stringThree = stringOne + analogRead(A0);
здесь analogRead() возвращает int. Конкатенация строк особенно удобна, когда нужно собрать в одну строку несколько значений с описаниями — для вывода через Serial, на LCD-дисплей, через Ethernet или в любом другом месте, где работают строки.
Типичные ошибки и предупреждения
Будьте осторожны при конкатенации нескольких разных типов данных в одной строке — результат может оказаться неожиданным. Например:
int sensorValue = analogRead(A0);
String stringOne = "Sensor value: ";
String stringThree = stringOne + sensorValue;
Serial.println(stringThree);
даёт корректный результат вроде "Sensor Value: 402" (или другое число, которое вернул analogRead()), а вот:
int sensorValue = analogRead(A0);
String stringThree = "Sensor value: " + sensorValue;
Serial.println(stringThree);
даёт непредсказуемый результат, потому что stringThree не получил начального значения до того, как вы начали добавлять к нему разные типы данных.
Вот ещё один пример с неправильной инициализацией:
Serial.println("I want " + analogRead(A0) + " donuts");
Этот код вообще не скомпилируется — компилятор неправильно обработает приоритет операторов. А следующий вариант скомпилируется, но работать будет не так, как ожидается:
int sensorValue = analogRead(A0);
String stringThree = "I want " + sensorValue;
Serial.println(stringThree + " donuts");
Причина та же: stringThree не имеет начального значения, и добавление к нему разных типов приводит к неопределённому поведению.
Главное правило: всегда инициализируйте объекты String перед конкатенацией. Это избавит вас от трудноуловимых багов.
Где пригодится
- Формирование сообщений для Serial Monitor с метками и значениями датчиков.
- Сборка строк для отправки по UART, Bluetooth или Wi-Fi.
- Вывод составных надписей на LCD или OLED-дисплей.
- Логирование данных с временными метками.
Необходимое оборудование
Схема подключения
Дополнительные компоненты для этого примера не нужны. Достаточно подключить плату к компьютеру через USB и открыть Serial Monitor в Arduino IDE.

Плата Arduino UNO — дополнительные компоненты для этого примера не требуются.
Код
Ниже приведён рабочий пример с несколькими вариантами конкатенации:
/*
Сложение строк
Примеры того, как складывать строки вместе
Также можно добавлять к String значения разных типов данных, как показано здесь:
created 27 Jul 2010
modified 2 Apr 2012
by Tom Igoe
Данный пример кода находится в открытом доступе.
https://www.arduino.cc/en/Tutorial/StringAdditionOperator
*/
// объявление трёх String:
String stringOne, stringTwo, stringThree;
void setup() {
// инициализация serial и ожидание открытия порта:
Serial.begin(9600);
while (!Serial) {
; // ожидание подключения serial-порта. Нужно только для native USB порта
}
stringOne = String("You added ");
stringTwo = String("this string");
stringThree = String();
// отправка вступительного сообщения:
Serial.println("\n\nAdding Strings together (concatenation):");
Serial.println();
}
void loop() {
// добавление константного целого числа к String:
stringThree = stringOne + 123;
Serial.println(stringThree); // выводит «You added 123»
// добавление константного длинного целого числа к String:
stringThree = stringOne + 123456789;
Serial.println(stringThree); // выводит «You added 123456789»
// добавление константного символа к String:
stringThree = stringOne + 'A';
Serial.println(stringThree); // выводит «You added A»
// добавление константной строки к String:
stringThree = stringOne + "abc";
Serial.println(stringThree); // выводит «You added abc»
stringThree = stringOne + stringTwo;
Serial.println(stringThree); // выводит «You added this string»
// добавление переменного целого числа к String:
int sensorValue = analogRead(A0);
stringOne = "Sensor value: ";
stringThree = stringOne + sensorValue;
Serial.println(stringThree); // выводит «Sensor Value: 401» или любое другое значение analogRead(A0)
// добавление переменного длинного целого числа к String:
stringOne = "millis() value: ";
stringThree = stringOne + millis();
Serial.println(stringThree); // выводит «The millis: 345345» или любое другое значение millis()
// бесконечное ожидание:
while (true);
}
Как проверить результат
- Загрузите скетч на плату.
- Откройте Serial Monitor (Ctrl+Shift+M) и убедитесь, что скорость порта совпадает с той, что задана в
Serial.begin(). - В мониторе должны появляться строки, собранные из разных типов данных — текста, чисел и символов.
- Если строки выглядят «мусорно» или пусты — проверьте инициализацию переменных типа
Stringперед использованием оператора+.
Подробнее
Больше базовых уроков вы найдёте в разделе built-in examples.
Также изучите language reference — подробный справочник языка программирования Arduino.
Последнее обновление: 30.07.2015, SM