Read ASCII String: разбор строки с запятыми для управления RGB-светодиодом
Разбираем строку формата CSV, поступающую через Serial, и управляем яркостью RGB-светодиода с помощью analogWrite.
В этом уроке мы научимся принимать через Serial строку вида "5,220,70", разбивать её на числа и использовать полученные значения для управления цветом RGB-светодиода. Для разбора строки применяется функция Serial.parseInt(), которая умеет находить фрагменты текста, разделённые любым не-буквенно-цифровым символом. Чаще всего в роли разделителя выступает запятая — такой формат данных называется CSV (comma-separated values), но подойдут и пробел, и точка.
Значения извлекаются как целые числа и передаются в analogWrite(), чтобы задать яркость каждого канала RGB.
Необходимое оборудование
- Arduino Board
- RGB-светодиод с общим анодом (common anode)
- 3 резистора по 220 Ом
- провода-перемычки
- макетная плата
Схема подключения

Подпись: Схема подключения RGB-светодиода к Arduino UNO на макетной плате. Длинный вывод (общий анод) соединяется с 5V, остальные три вывода — R, G, B — через резисторы 220 Ом идут на пины 3, 5 и 6.
Принципиальная схема

Подпись: Принципиальная схема подключения RGB-светодиода через резисторы 220 Ом к Arduino UNO. Компоненты: RGB-светодиод (RGB LED), резисторы 220 Ом (220 Ω RESISTORS).
Как соединить компоненты
Для сборки схемы потребуется четыре провода. Один провод идёт от вывода 5V на плате к самому длинному пину светодиода — это общий анод. Расположите RGB-светодиод на макетной плате так, чтобы длинный пин был вторым слева (или вторым сверху, в зависимости от ориентации). Уточните по даташиту конкретного светодиода порядок выводов: как правило, это R, V+, G, B.
Оставшимися проводами подключите:
- красный катод → пин 3 (через резистор 220 Ом)
- зелёный катод → пин 5 (через резистор 220 Ом)
- синий катод → пин 6 (через резистор 220 Ом)
Особенность светодиода с общим анодом
RGB LEDs с общим анодом работают иначе, чем светодиоды с общим катодом. Анод подключён к питанию, поэтому для того чтобы зажечь светодиод, нужно подать на катодный пин LOW, а не HIGH. Это значит:
255через analogWrite() → светодиод выключен (нет разности потенциалов)0через analogWrite() → светодиод горит на полную яркость
Чтобы не путаться и отправлять привычные значения от 0 (выкл) до 255 (максимум), в скетче используется несложный приём: вместо analogWrite(pin, brightness) вызывается analogWrite(pin, 255-brightness). Таким образом, значение 255 в Serial Monitor соответствует максимальной яркости.
Код
Сначала объявим константы для пинов, к которым подключены каналы светодиода. Это упростит чтение кода:
const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;
В функции setup() запускаем Serial на скорости 9600 бод:
Serial.begin(9600);
Там же настраиваем пины светодиода как выходы:
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
В loop() проверяем, есть ли данные в буфере Serial. Конструкция while() будет выполняться, пока в буфере есть непрочитанные байты:
while (Serial.available() > 0) {
Объявляем локальные переменные для хранения яркости каждого канала. Функция Serial.parseInt() читает данные из Serial до следующего разделителя (запятой) и возвращает целое число:
int red = Serial.parseInt();
int green = Serial.parseInt();
int blue = Serial.parseInt();
После чтения трёх значений ждём символа новой строки, который подтверждает конец пакета:
if (Serial.read() == '\n') {
Функция constrain() ограничивает значение допустимым диапазоном для PWM. Затем вычитаем из 255, чтобы адаптировать значение под светодиод с общим анодом:
red = 255 - constrain(red, 0, 255);
green = 255 - constrain(green, 0, 255);
blue = 255 - constrain(blue, 0, 255);
Передаём подготовленные значения в analogWrite() для управления цветом:
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
Отправляем обратно в Serial Monitor текущие значения в шестнадцатеричном формате — удобно для отладки:
Serial.print(red, HEX);
Serial.print(green, HEX);
Serial.println(blue, HEX);
Закрываем блоки if, while и основного цикла:
}
}
}
Результат в Serial Monitor выглядит примерно так:
/*
Чтение строки ASCII из последовательного порта.
Скетч демонстрирует работу функции Serial parseInt().
Ищет строку ASCII со значениями, разделёнными запятыми,
разбирает их в int и использует для управления яркостью RGB-светодиода.
Схема: RGB-светодиод с общим анодом подключён следующим образом:
- красный катод: цифровой пин 3
- зелёный катод: цифровой пин 5
- синий катод: цифровой пин 6
- Анод: GND
создан 13 апр. 2012
автор Tom Igoe
изменён 14 мар. 2016
автор Arturo Guadalupi
Код примера находится в открытом доступе.
*/
// пины для светодиодов:
const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;
void setup() {
// инициализация serial:
Serial.begin(9600);
// настройка пинов как выходов:
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}
void loop() {
// если есть данные в serial, читаем их:
while (Serial.available() > 0) {
// ищем следующее целое число во входящем потоке serial:
int red = Serial.parseInt();
// повторяем:
int green = Serial.parseInt();
// повторяем ещё раз:
int blue = Serial.parseInt();
// ищем символ новой строки — это конец сообщения:
if (Serial.read() == '\n') {
// ограничиваем значения диапазоном 0–255 и инвертируем
// если используется светодиод с общим катодом, просто напишите "constrain(color, 0, 255);"
red = 255 - constrain(red, 0, 255);
green = 255 - constrain(green, 0, 255);
blue = 255 - constrain(blue, 0, 255);
// устанавливаем яркость красного, зелёного и синего каналов светодиода:
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
// выводим три числа одной строкой в шестнадцатеричном формате:
Serial.print(red, HEX);
Serial.print(green, HEX);
Serial.println(blue, HEX);
}
}
}
Как проверить результат
- Загрузите скетч на плату.
- Откройте Serial Monitor в Arduino IDE.
- В выпадающем меню выберите режим окончания строки Newline (не
No line ending). - Введите три числа от 0 до 255 через запятую, например:
255,0,128и нажмите Enter. - Светодиод должен сменить цвет, а в мониторе появится ответная строка с HEX-значениями.
Типичные ошибки
- Светодиод не реагирует — проверьте, что в Serial Monitor выбран режим
Newline. Без символа новой строки скетч не выйдет изwhileи не вызовет analogWrite(). - Цвета перепутаны — убедитесь, что пины R, G, B подключены именно к 3, 5 и 6 (PWM-пины). Если перепутать, цвета будут не те, что ожидаете.
- Светодиод горит тускло или не гаснет — возможно, используется светодиод с общим катодом. В таком случае уберите вычитание
255 -из кода. - Значения вне диапазона — constrain() защищает от передачи чисел больше 255 или меньше 0, но лучше сразу отправлять корректные данные.
Практические замечания
- Формат CSV удобен не только для цвета: точно так же можно передавать координаты, показания датчиков или любые наборы параметров.
- Вместо запятой разделителем может быть пробел, точка с запятой или любой другой не-буквенно-цифровой символ — Serial.parseInt() поддерживает все варианты.
- Если нужно отправлять данные из другой программы (Python, Processing), убедитесь, что строка завершается символом
\n.
Дополнительные материалы
Больше базовых примеров найдёте в разделе built-in examples.
Подробное описание всех функций языка — в language reference.
Последнее обновление: 29.07.2015, SM