Урок 5. Монитор порта — Serial.begin и Serial.println
У Arduino нет экрана, но есть связь с компьютером через тот же USB-кабель, которым загружают скетч. По нему плата может отправлять текст — значения датчиков, сообщения «кнопка нажата», — а Serial Monitor (монитор порта) в Arduino IDE показывает этот текст. Это главный способ понять, что происходит внутри скетча.
Первое сообщение
void setup() {
Serial.begin(9600); // запустить связь на скорости 9600
Serial.println("Привет! Плата запущена.");
}
void loop() {
Serial.print("Прошло секунд: ");
Serial.println(millis() / 1000); // время с запуска, в секундах
delay(1000);
}Загрузите скетч и откройте монитор: кнопка в правом верхнем углу окна IDE или Tools → Serial Monitor (Ctrl+Shift+M). Монитор открывается внизу окна. Проверьте, что справа в нём выбрана скорость 9600 baud — та же, что в Serial.begin. Каждую секунду будет появляться новая строка — начало выглядит так:
Привет! Плата запущена.
Прошло секунд: 0
Прошло секунд: 1
Прошло секунд: 2Что здесь происходит
Serial.begin(скорость) запускает последовательный порт. Скорость — сколько бит в секунду передаётся (бод, baud). 9600 — привычное значение из примеров, 115200 — в 12 раз быстрее. Важно одно: в скетче и в мониторе скорость должна совпадать. Если не совпадает, вместо текста видны «кракозябры» — подробнее в справке Непонятные символы в мониторе порта.
Serial.print(…) отправляет текст или число и остаётся на той же строке. Serial.println(…) делает то же и переходит на новую строку. Обычно строку собирают из нескольких print и завершают одним println.
millis() — время в миллисекундах с момента запуска платы; поделив на 1000, получают секунды. Подробно о ней — в уроке millis вместо delay.
Обратите внимание: при открытии монитора Arduino Uno и Nano перезапускаются, и скетч начинается сначала. Поэтому приветствие из setup видно даже если монитор открыт позже загрузки.
Числа
print и println печатают числа сами, без преобразований:
- целое:
Serial.println(42);→42; - дробное — по умолчанию с двумя знаками после точки:
Serial.println(3.14159);→3.14; - нужное число знаков — вторым аргументом:
Serial.println(3.14159, 4);→3.1416; - в другой системе счисления:
Serial.println(255, HEX);→FF,Serial.println(5, BIN);→101.
На Uno и Nano функция sprintf не умеет печатать дробные числа через %f — вместо числа выйдет ?. Печатайте дробные числа через Serial.print.
Команды с компьютера
В мониторе есть строка ввода: текст из неё отправляется в плату. В скетче его читают двумя функциями:
Serial.available()— сколько байт пришло и ждёт чтения (0 — ничего);Serial.read()— забрать один байт (символ).
Скетч, который включает и выключает светодиод на плате по командам:
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
Serial.println("Отправьте 1 — включить, 0 — выключить");
}
void loop() {
if (Serial.available() > 0) { // пришёл хотя бы один символ
char c = Serial.read(); // забрать его
if (c == '1') {
digitalWrite(LED_BUILTIN, HIGH);
Serial.println("Светодиод включён");
} else if (c == '0') {
digitalWrite(LED_BUILTIN, LOW);
Serial.println("Светодиод выключен");
}
}
}Наберите в строке ввода 1 и нажмите Enter — светодиод загорится, в мониторе появится ответ. Рядом со скоростью в мониторе есть список окончания строки (No Line Ending, New Line и другие): монитор может дописывать к каждой отправке символ перевода строки. В этом скетче он ни на что не влияет — символ не равен ни '1', ни '0'.
Символ в одинарных кавычках '1' — это один знак, строка в двойных "1" — текст. Serial.read() возвращает именно знак, поэтому сравнивают с '1'.
Графики: Serial Plotter
Если скетч печатает в каждой строке только число, его можно увидеть графиком: Tools → Serial Plotter. Например, показания потенциометра на входе A0 (о нём — в уроке Аналоговые входы и ШИМ):
void setup() {
Serial.begin(9600);
}
void loop() {
int value = analogRead(A0); // число от 0 до 1023
Serial.println(value);
delay(20);
}Несколько чисел в одной строке через пробел плоттер рисует несколькими линиями.
Отладка выводом
Когда скетч ведёт себя странно, добавьте Serial.println в подозрительные места: «дошли до сюда», значение переменной, результат условия. Это самый простой и самый частый способ найти ошибку на Arduino.
Две тонкости:
- Длинные постоянные строки занимают оперативную память, а её у Uno всего 2 КБ. Макрос
F()оставляет строку во флеш-памяти:Serial.println(F("Датчик не найден"));. - Выводы 0 и 1 заняты портом. Если к ним что-то подключено, монитор и загрузка могут работать с ошибками.
Коротко
Serial.begin(9600)вsetupзапускает связь; скорость в мониторе должна совпадать.print— без перевода строки,println— с ним; дробные числа печатаются с двумя знаками.- Монитор — кнопка в правом верхнем углу IDE или
Ctrl+Shift+M, график — Tools → Serial Plotter. Serial.available()говорит, есть ли данные,Serial.read()забирает один символ.F("…")бережёт оперативную память, выводы 0 и 1 занимает порт.