Top.Mail.Ru

Arduino. Функции Serial.print() и delay(). Описание и примеры.

Что же, друзья, сегодняшней статьей запустим практическую часть курса, посвященного программированию Arduino и только Arduino! Без лишних слов переходим к делу, как уже понятно из названия статьи речь пойдет о двух важных функциях, Serial.print() и delay(), использоваться которые будут повсеместно.

Функция Serial.print().

Начинаем с функции Serial.print(), которая позволяет нам выводить на экран любую информацию, какую только потребуется. Выглядит вызов функции так: Serial.print(data), где data - аргумент (параметр) функции. При этом функция сама форматирует свой вывод в зависимости от переданного в нее аргумента. Например:

Вызов функции Результирующий вывод
Serial.print("Hello world!"); Hello world!
Serial.print('H'); H
Serial.print(77); 77
Serial.print(2.71); 2.71
Serial.print(3.14159265); 3.14

Обратите внимание, что по умолчанию выводятся два знака после запятой в дробных числах, чуть ниже мы разберем, как изменить эту ситуацию. Результат же работы функции можно увидеть в мониторе порта ("Tools > Serial Monitor"):

Arduino Serial Monitor.

В этом окне настроить нужно только скорость передачи данных, поставим для примера 115200 baud:

Установка Baudrate.

Оставляем окно монитора порта открытым и возвращаемся к скетчу. Для того, чтобы использовать функцию Serial.print(), необходима одна дополнительная операция, а именно вызов функции:

Serial.begin(speed)

В данном случае в качестве аргумента в функцию передается скорость обмена данными. Та самая, которую мы задали в окне монитора, соответственно, значение в окне и в скетче должны совпадать:

Serial.begin(115200)

Кроме того, возможна передача конфигурационного параметра вторым аргументом функции, но сегодня не будем в это углубляться, оставим для будущей статьи по работе с последовательным портом и коммуникацией с внешними устройствами. По умолчанию настройки будут такие:

Параметр Значение
Кол-во битов в байте данных 8
Проверка четности Отсутствует
Кол-во стоп-битов 1

С теорией здесь все понятно, испробуем на практике )

Как вы помните, скетч состоит из двух базовых функций - setup() и loop(). При этом первая из них вызывается однократно при запуске платы. В нее и поместим код, который позволит вывести текстовую строку в консоль. При этом не забываем о Serial.begin():

void setup() {
  Serial.begin(115200);
  Serial.print("setup() function is working");
}

void loop() {

}

С подключением платы к Arduino IDE мы уже разобрались ранее, поэтому сейчас просто компилируем скетч и прошиваем в контроллер, это можно осуществить одной кнопкой:

Программирование Arduino.

А теперь разворачиваем Serial Monitor и анализируем увиденное (если монитор был открыт после того, как функция setup() отработала, то можно перезапустить плату кнопкой Reset):

Пример работы скетча с Serial.print().

А увиденное в данном случае четко соответствует задуманному, то есть при запуске скетча однократно производится вызов функции setup(). А из нее так же однократно при помощи Serial.print() в монитор порта выводится строка "setup() function is working". Таким образом, данный инструмент, Serial Monitor, можно использовать для отладки скетча. Помимо текста, как мы уже обсудили, возможен вывод любых числовых значений:

void setup() {
  Serial.begin(115200);

  Serial.print("setup() function is working");
  Serial.print(50);
  Serial.print(51);
  Serial.print(52);
}

void loop() {

}

И в Serial Monitor теперь:

Проблема при выводе через Serial.print().

Очевидно, что возникла сложность. Связана она с тем, что вывод идет подряд, без перехода на новую строку. Не проблема, модернизируем скетч, добавив вызовы Serial.print('\n'), как раз-таки для перехода на новую строку :

void setup() {
  Serial.begin(115200);

  Serial.print("setup() function is working");
  Serial.print('\n');

  Serial.print(50);
  Serial.print('\n');

  Serial.print(51);
  Serial.print('\n');

  Serial.print(52);
  Serial.print('\n');
}

void loop() {

}

Но это нерационально и неприемлимо с любой точки зрения, поэтому лучший вариант - использование функции Serial.println(). Собственно, ее отличие заключается в том, что '\r' и '\n' добавляются в конце строки автоматически, что и дает необходимый переход на новую строку перед последующими выводами:

void setup() {
  Serial.begin(115200);
  Serial.println("setup() function is working");
  Serial.println(50);
  Serial.println(51);
  Serial.println(52);
}

void loop() {

}
Использование функции Serial.println().

Помимо прочего есть возможность форматировать аргумент функции под определенную систему счисления:

Вызов функции Результирующий вывод
Serial.print(85, DEC); 85
Serial.print(85, BIN); 1010101
Serial.print(85, OCT); 125
Serial.print(85, HEX); 55

Соответственно, число 85 в десятичной системе счисления соответствует 1010101 в двоичной, 125 в восьмеричной и 0x55 в шестнадцатеричной. Все очень просто и удобно, аналогичным же образом можно задать количество знаков после запятой для дробных значений:

Вызов функции Результирующий вывод
Serial.print(3.14159265, 0); 3
Serial.print(3.14159265, 1); 3.1
Serial.print(3.14159265, 3); 3.141
Serial.print(3.14159265, 5); 3.14159

Отлично, с этим успешно разобрались, плавно перемещаемся ко второй запланированной части статьи 👍

Функция delay().

Описание.

Второй функцией, который мы сегодня уделим повышенное внимание будет функция delay(). Ее задача полностью соответствует названию - функция останавливает выполение программы на время, переданное в нее в качестве аргумента. При этом время в данном случае исчисляется в миллисекундах. Например, delay(15) спровоцирует задержку на 15 мс.

Для чего это нужно? Да просто для формирования примитивных задержек. Примитивных по той простой причине, что при вызове этой функции микроконтроллер намертво останавливается, ожидая указанное время. А ведь в это время могли выполняться какие-либо другие операции, вместо банальнейшего простаивания.

Но сегодня речь не об этом, в некоторых случаях функции delay() вполне достаточно, и ее применение оправдано для решения задачи, плюс использовать ее можно максимально просто. В одной из будущих статей курса разберем альтернативные, более правильные и грамотные, способы организации задержки, а пока продолжаем по плану.

Аналогичным образом работает и еще одна функция - delayMicroseconds(). Вся разница только в том, что здесь значение временного интервала задается в микросекундах, а не в миллисекундах. Причем максимальное значение аргумента функции в данном случае составляет 16383, то есть чуть более 16-ти мс. Таким образом: delayMicroseconds(5000) - задержка на 5000 мкс, то есть на 5 мс. И теперь переходим к практическому примеру.

Пример скетча.

Итак, дополним наш самый первый пример из этой статьи дополнительным выводом в монитор порта. В функции loop(), которая вызывается периодически и неотвратимо, добавляем:

void setup() {
  Serial.begin(115200);
  Serial.println("setup() function is working");
}

void loop() {
  Serial.println("loop() function is working");
  delay(1000);
}

При вызове delay(1000) программа останавливается на 1000 мс (1 секунду), а значит в Serial Monitor мы видим вывод строки "loop() function is working" ровно раз в секунду. Убедиться в этом также можно, включив отображение меток времени:

Монитор порта timestamp.

И результат не заставляет себя ждать:

Пример использования функции delay() на Arduino.

С небольшой погрешностью вывод строки происходит строго через 1000 мс, которые мы задали в скетче, так что все сработало как и задумано. И на этой позитивной ноте заканчиваем сегодняшнюю статью, перечисленные функции в дальнейшем будем использовать постоянно, так что до встречи в статьях курса 🤝

Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x