Дано: три светодиода и что-нибудь Ардуино-подобное. Задача организовать установку яркости каждого светодиода, через монитор COM порта, отправляя туда текстовое сообщение с компьютера.
Для проверки программного решения, соберем на макетной плате прототип.
Яркость светодиодов будем устанавливать с помощью текстовых сообщений отправляемых в монитор порта:
- r125 (установить яркость красного светодиода)
- g255 (установить яркость зеленого светодиода)
- b10 (установить яркость синего светодиода)
Что происходит после отправки строки r125 ? Полученные данные помещаются в созданный в памяти классом Serial буфер, в виде отдельных байт - кодов символов 'r' '1' '2' '3' и могут быть вычитаны оттуда побайтно оператором Serial.read();
// считываем байт из буфера в переменную incomingByte
uint8_t incomingByte = Serial.read();
Задача будет сводиться к следующим шагам:
- читаем первый символ и определяем к какому светодиоду будут относиться следующие за ним символы цифр установки яркости;
- ждем пока поступление символов цифр не закончится - ведь длинна посылки может быть разной;
- убедившись, что пришли все символы цифр, сцепляем их в строку;
- строку преобразовываем в число;
- получив заветное однобайтовое число, устанавливаем яркость светодиода.
Примерно так, можно решить задачу, на голом 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 будет его яркость.
Где это можно поюзать в практических целях?
- программа управляется с ПК и отдает ему какие-либо данные, паять в таком случае дополнительные органы управления совсем не обязательно;
- готовое устройство работает автономно, но некоторые настройки нужно менять ооочень редко (в этом случае после настройки с ПК, полученные данные необходимо будет сохранить в энергонезависимой памяти);
- отладка программы, проверка железа (подключили сервопривод и сразу можно его проверить через монитор порта, написав пару строчек кода);
- управление одной ардуиной, с другой ардуины по радиоканалу.
Код из этой статьи доступен тут:
Оглавление тут:
Всем удачи!