Arduino: вывод смешанных данных в Serial.print()
Небольшая подсказка-хитрость для начинающих программировать для Arduino и заодно ответ на вопросы новичков. Пригодится, если вам нужно вывести в одной строке текст и числа.
В программах для Arduino нам часто приходится выводить в терминал или на дисплей смешанные данные, состоящие из чисел и текста. Например, это могут быть результаты измерений и подписи к ним. У начинающих программистов вызывает затруднение вывод смешанных числовых и строковых данных в одной команде Serial.print(). В любом форуме про программирование в Arduino IDE найдется хотя бы один вопрос про вывод смешанных данных.
Допустим, у нас есть две целочисленные переменные, a=250 и b=20. Нам нужно вывести в терминал строку вида “а=250 b=20”.
Проблема
Если мы выводим значения одного типа, то прямо внутри print() можем использовать оператор “+”. Для чисел это будет математическое сложение, для строк – конкатенация (склеивание в одну строку). Но в случае вывода смешанных данных оператор “+” применять нельзя, потому что компилятор не понимает, что нужно сделать с разнородными данными. Команда вида Serial.print(“a=” + a + ” b=” + b) вызовет ошибку компиляции.
Решение
Самый примитивный способ – использовать четыре команды вывода:
Serial.print("a=");
Serial.print(a);
Serial.print("b=");
Serial.println(b);
Такой подход допустим при небольшом количестве переменных, но при составлении сложной строки данных мы получаем громоздкий и плохо читаемый фрагмент кода.
Обычно знатоки языка С предлагают воспользоваться очень мощной и гибкой функцией вывода printf(). Да, она прекрасно работает в коде Arduino, однако исходный код сложной команды printf() иногда выглядит, как абракадабра из символов % и &, которая читается еще хуже, чем многострочный вывод.
При этом есть способ настолько простой и очевидный, что удивительно, почему им редко пользуются. Вспомним про явное приведение типов. Это значит, что мы можем взять данные одного типа (например, целое число) и явно сказать компилятору, чтобы он преобразовал эти данные в другой тип (например, строку). В таком случае вывод данных выглядит очень просто:
Serial.println("a=" + (String)a + " b=" + (String)b);
Декларация (String), стоящая перед числовым объектом, заставит компилятор преобразовать число в строку, поэтому конкатенация строк успешно сработает, и в терминал уйдет строка текста.
Вот пример кода для большей наглядности:
void setup() {
Serial.begin(9600);
int a = 250;
int b = 20;
Serial.print("a=" + (String)a + " b=" + (String)b);
}
void loop() {
}
В терминал будет выведена строка, которую мы хотели получить:
a=250 b=20