Теперь поговорим о выводе данных в последовательный порт. В языке Ардуино для этого есть стандартный инструмент, которым мы уже воспользовались. Давайте вновь посмотрим в пример analogRead Serial и обратим внимание на вот эту строчку в разделе setup, Serial.begin(9600). Что это за Serial, подсвеченное жирным оранжевым шрифтом? Это так называемый объект. Объект, который нам предоставляет библиотека Ардуино. Мы не будем сильно останавливаться в нашем курсе на том, что такое объекты. Вы об этом можете почитать дополнительно. Давайте к нему просто относиться как к некоему чёрному ящику, о котором нам известно, что мы можем от него получить. Что мы ему можем дать на вход, и что мы можем взять от него на выходе. Так вот этот чёрный ящик — объект serial — предназначен для обмена данными через последовательный порт. Физически этот обмен данными происходит либо через порт usb, через который у нас плата подключается к компьютеру, или одновременно через нулевой и первый пины платы. Если вы посмотрите на неё повнимательнее, вы увидите там надписи rx и tx. Они предназначены также для обмена данными. Именно поэтому, когда вы собираете ваше устройство, старайтесь использовать эти пины в последнюю очередь. Через них также происходит обмен данными. Когда мы загружаем скетч, он проходит через эти же линии. Именно поэтому, когда вы собираете своё устройство, старайтесь использовать нулевой и первый пины в последнюю очередь. Потому что, когда вы будете загружать скетч и там будет подключено что-то, это может воспрепятствовать корректной работе. Теперь посмотрим, что у нас происходит с этим объектом serial. Вы видите, что после точки написано слово begin и параметр (9600) передан ему? На самом деле, это практически есть вызов функции так же, как мы, например, вызывали analogRead или digtalWrite в первой неделе. Только в применении к объектам их обычно называют методами. То есть у объекта Serial есть метод begin. Он предназначен для того, чтобы установить связь со вторым устройством, в нашем случае — с компьютером. Поэтому он вызывается в setup, происходит это один раз в начале работы контроллера, а (9600), — параметр, который мы передаём, — это скорость обмена данными в бод, — это такие единицы, которые в цифровом обмене данными эквиваленты битам в секунду. 9600 бит в секунду — это не так много, но для того, чтобы передавать наши небольшие объёмы данных вполне достаточно. При желании вы можете увеличивать эту скорость, там, до значения, например, 115200, но, скорее всего, вам это не пригодится. Теперь посмотрим, где мы обращаемся к объекту Serial далее. Это уже происходит в loop, и мы вызываем другой метод println, которому передаём параметр (sensorValue) — переменная, в которую мы сохранили данные, полученные с аналогового входа (A0). Можно догадаться, что println отвечает за вывод строки в последовательный порт и важно обратить внимание на то, что он в конец строки добавляет символ перевода строки. То есть есть ещё один метод print, который выведет ваши данные и не будет переводить строку, тогда следующие данные выведутся сразу же за вашими данными. Сейчас мы проведём с вами маленький эксперимент. Просто сделаем какой-то вывод в последовательный порт и посмотрим, как это выглядит. Я подготовил экспериментальный скетч. Давайте посмотрим, что я сюда написал. У нас также устанавливается соединение на той же скорости, а затем прямо в setup выводится одна строчка: ("Privet"), написанное транслитом. Общение кириллицей вряд ли у вас получится, поэтому ограничимся выводом латинских букв. Итак, у нас в начале скетча будет выводиться слово ("Privet"), а затем в loop мы будем выводить с помощью метода print некое значение. Здесь мы мимоходом знакомимся с одной маленькой полезной функцией, входящей в язык Ардуино. Функция millis. Она возвращает количество миллисекунд, прошедших с запуска контроллера. Это вам может пригодиться очень часто, и вы уже сейчас можете посмотреть, как это выглядит. Посмотрите, у нас будет выводиться количество миллисекунд, прошедших с запуска контроллера, затем будет выводиться без перевода строки вот такая вещь: ("\t"). Подчеркну особенно. Это так называемая escape-последовательность, которая не будет выводиться в том виде, как мы её написали. Когда монитор порта получит \, он догадается о том, что это начало определённой escape-последовательности и выведет какой-то символ, который мы не могли бы написать вручную. Это символ табуляции. С помощью него вы можете довольно аккуратно форматировать ваш вывод в последовательный порт. То есть у нас будет выводиться число миллисекунд, а затем символ табуляции, то есть как будто бы несколько пробелов. Затем я сделал задержку полсекунды, чтобы у нас не слишком быстро всё это бегало, и вновь loop начинается и выводит новое значение, которое возвращает millis. Давайте посмотрим на то, как это будет выглядеть. Я запущу монитор порта. Privet! 0, 499, 999, и мы видим вывод через каждые 500 миллисекунд. Иногда это число увеличивается на 1 миллисекунду, потому что все действия, которые выполняет контроллер, тоже занимают немного времени. Поэтому иногда лишняя миллисекунда накапливается и добавляется к выводимому числу. Итак, теперь вы понимаете, каким образом можете осуществлять вывод в последовательный порт. О том, как читать данные, отправляемые из компьютера, мы поговорим позже на этой неделе. Пока что мы просто разобрались с тем, как работал наш эксперимент, с которым мы возились всё это время. Теперь я закрою монитор порта, и вы также не забывайте это делать после того, как вы удовлетворились его чтением. Потому что потом в процессе загрузки нового скетча вам открытый монитор может помешать.