Arduino: использование цвета при выводе в последовательный порт

Наверняка, многие видели файловые менеджеры Norton Commander, Midnight Commander и другие, которые работают в консоли с выводом цвета. Обычно это происходит по SSH. Поискав информацию в Интернете, обнаружил, что такое работает и при подключении через последовательный порт. Возникает вопрос: а возможно ли использовать цвет при выводе в последовательный порт с Arduino?

Оказывается, это вполне реально. Для этого необходимо использовать escape-последовательности.

Такие последовательности начинаются с символов ESC[ , где ESC — символ с кодом 27. Для того, чтобы поменять цвет вывода, нужно отправить последовательность вида:

ESC[Value;…;Valuem
где Value — код цвета или атрибута.

Вот их значения:

Атрибуты:

  • 0 — Обычный
  • 1 — Полужирный
  • 4 — Подчёркнутый (только в монохромном режиме)
  • 5 — Мигающий
  • 7 — Реверсивный
  • 8 — Зачёркнутый

Цвета в Escape-последовательностях

ЦветКод для текстаКод для фона
Чёрный3040
Красный3141
Зелёный3242
Жёлтый3343
Синий3444
Пурпурный3545
Голубой3646
Белый3747

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

ESC[31;40m

Вот так это будет выглядеть в коде:

Serial.write(27);
Serial.print("[31;40m");
Serial.println("I am red string.");

Если нужно сделать текст полужирным, то добавится «1»:

ESC[1;31;40m

Ну и примерчик для полного перебора всех цветов:

void setup() 
{ 
  Serial.begin(9600); 
  Serial.println("Test 123"); 
  
  //Serial.write(27);
  //Serial.print("[31;42m");
} 

void loop() 
{ 
  for (int i=30; i<38; i++)
  {
    for (int j=40; j<48; j++)
    {
      Serial.write(27);
      Serial.print("[");
      Serial.print(i);
      Serial.print(";");
      Serial.print(j);
      Serial.print("m");

      Serial.print("String line ");
      Serial.print(i);
      Serial.print(" ");
      Serial.println(j);
    }
  } 

  while(1);
} 

Обратите внимание, что для работать в обычном мониторе порта Arduino IDE это не будет. Нужен терминал, который умеет работать с escape-последовательностями, например, Putty. Для этого в его настройках указываем работу по Serial-соединению, вписываем COM-порт и скорость:

После этого нажимаем «Open» и видим результат:

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