Найти тему
Электроника, ESP32, Arduino

Как парсить не парся инфу из Serial в Arduino Wiring (управление с ПК)

Дано: три светодиода и что-нибудь Ардуино-подобное. Задача организовать установку яркости каждого светодиода, через монитор COM порта, отправляя туда текстовое сообщение с компьютера.

Для проверки программного решения, соберем на макетной плате прототип.

3 светодиода подключены к выводам с поддержкой PWM
3 светодиода подключены к выводам с поддержкой PWM

Яркость светодиодов будем устанавливать с помощью текстовых сообщений отправляемых в монитор порта:

  • r125 (установить яркость красного светодиода)
  • g255 (установить яркость зеленого светодиода)
  • b10 (установить яркость синего светодиода)
Настройки монитора порта в среде Arduino IDE
Настройки монитора порта в среде Arduino IDE

Что происходит после отправки строки r125 ? Полученные данные помещаются в созданный в памяти классом Serial буфер, в виде отдельных байт - кодов символов 'r' '1' '2' '3' и могут быть вычитаны оттуда побайтно оператором Serial.read();

// считываем байт из буфера в переменную incomingByte
uint8_t incomingByte = Serial.read();

Задача будет сводиться к следующим шагам:

  1. читаем первый символ и определяем к какому светодиоду будут относиться следующие за ним символы цифр установки яркости;
  2. ждем пока поступление символов цифр не закончится - ведь длинна посылки может быть разной;
  3. убедившись, что пришли все символы цифр, сцепляем их в строку;
  4. строку преобразовываем в число;
  5. получив заветное однобайтовое число, устанавливаем яркость светодиода.

Примерно так, можно решить задачу, на голом C (хотя там, на мой взгляд, удобнее использовать дополнительный символ завершения строки, чтобы не мучаться еще и с таймером ожидания последнего символа).

Однако в среде Arduino Wiring, разработчики добавили несколько дополнительных функций, которые делают пункты 2...4 самостоятельно.

Речь идет о Serial.parseInt(); и Serial.parseFloat();

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

Что именно они делают, я уже описал - в пришедшей посылке они ищут символы 0....9 и клеят из них число типа Int или Float в соответствии с названиями.

Программа получается очень простой, я думаю Вы без труда в ней разберетесь.

Программа для установки яркости трех светодиодов с ПК
Программа для установки яркости трех светодиодов с ПК
Тестирование на макетке яркость светодиодов устанавливается с помощью монитора порта
Тестирование на макетке яркость светодиодов устанавливается с помощью монитора порта

Оператор, который я еще не разбирал:

// сколько времени искать число (мс)
Serial.setTimeout(250);

После вызова Serial.parseInt(), программа будет искать в буфере полученных байт число, некоторое определенное время, после чего продолжит работать дальше. Или если вместо символов, из которых можно составить число, отправить какую-нибудь бессмысленную фигню, из которой вообще число не составить - программа в любом случае будет ждать указанное время и только потом продолжит работу (Serial.parseInt(); вернет при этом 0). Если фигню отправлять не планируется, а канал передачи хороший - можно это время уменьшить. По умолчанию, на поиск и составление числа, там дается аж целых 1000мс, что для подобного примера явно перебор.

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

case 'w':  // яркость для ,белого светодиода (PIN_WHITE)
analogWrite(PIN_WHITE, bright);
break;

и управляем белым светодиодом, через сообщение: w100 где 100 будет его яркость.

Где это можно поюзать в практических целях?

  • программа управляется с ПК и отдает ему какие-либо данные, паять в таком случае дополнительные органы управления совсем не обязательно;
  • готовое устройство работает автономно, но некоторые настройки нужно менять ооочень редко (в этом случае после настройки с ПК, полученные данные необходимо будет сохранить в энергонезависимой памяти);
  • отладка программы, проверка железа (подключили сервопривод и сразу можно его проверить через монитор порта, написав пару строчек кода);
  • управление одной ардуиной, с другой ардуины по радиоканалу.

Код из этой статьи доступен тут:

07_Как парсить не парся инфу из Serial в Arduino Wiring (управление с ПК).zip

Оглавление тут:

Всем удачи!