Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right Связь chevron_right Read ASCII String: разбор строки с запятыми для управления RGB-светодиодом

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);

    }

  }
}

Как проверить результат

  1. Загрузите скетч на плату.
  2. Откройте Serial Monitor в Arduino IDE.
  3. В выпадающем меню выберите режим окончания строки Newline (не No line ending).
  4. Введите три числа от 0 до 255 через запятую, например: 255,0,128 и нажмите Enter.
  5. Светодиод должен сменить цвет, а в мониторе появится ответная строка с 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