Бегущая строка на WS2812B, 16х16

В данном материале подробно расскажу, как соединить плату Arduino UNO с гибкой RGB-матрицей формата 16×16 (основа — чип WS2812B). Предоставлю наглядную схему подключения и пример готовой программы для реализации эффекта бегущей строки с текстом.

Бегущая строка на WS2812B

Необходимые детали:
► Контроллер Arduino UNO R3  x 1 шт.
► Провода DuPont, 2,54 мм, 20 см x 1 шт.
► Гибкая светодиодная панель WS2812B, RGB, 16×16 x 1 шт.
► Блок питания (сетевой адаптер) универсальный 5В 5А, штекер 5.5 х 2.5 x 1 шт.

Описание:
В данном примере с помощью контроллера Arduino UNO мы создадим эффект бегущей строки на гибкой светодиодной матрице WS2812B.

Подключение:
Управление матрицей WS2812B с помощью Arduino UNO выполняется посредством единственного соединения: вывод «D2» Arduino UNO подключается к выводу «DATA IN» матрицы. Для питания матрицы необходимо дополнительно подсоединить внешний блок питания с напряжением 5 В и силой тока минимум 5 А. Важно также убедиться, что общий провод («GND») блока питания соединён с общим проводом («GND») Arduino.

Установка библиотеки:
Чтобы запустить скетч, потребуется установить три библиотеки: «Adafruit_NeoPixel», «Adafruit_NeoMatrix» и «Adafruit_GFX». Проще всего это сделать, используя интегрированную среду разработки Arduino IDE, для этого откройте Скетч → Подключение библиотеки → Менеджер библиотек…

Установка шрифтов:
Чтобы обеспечить поддержку русского текста, требуется скачать шрифта и скопировать её содержимое в директорию «Adafruit_NeoMatrix», расположенную по пути: C:\Users\Ваше_Имя\Documents\Arduino\libraries\Adafruit_NeoMatrix.

Программа:
Запустите программу Arduino IDE, вставьте приведенный ниже код и загрузите его на вашу плату Arduino

#include <Adafruit_NeoPixel.h>       // Подключаем библиотеку NeoPixel
#include <Adafruit_NeoMatrix.h>      // Подключаем библиотеку NeoMatrix
#include <Adafruit_GFX.h>            // Подключаем библиотеку GFX
#include "FontsRus/TimesNRCyr9.h"    // Специальный русский шрифт TimesNewRoman Cyrillic размером 9px
 
#define PIN 6                        // Номер пина к которому подключены светодиоды                   

// Создание объекта матрицы с параметрами:
// Ширина и высота матрицы (16х16),
// Расположение матрицы (нижняя правая сторона, столбцы слева направо зигзагообразно),
// Цветовая схема (RGB) и частота передачи сигнала (800 КГц)
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 16, PIN,NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,NEO_GRB + NEO_KHZ800);

// Массив трех основных цветов (красный, зеленый, синий)
const uint16_t colors[] = 
{
  matrix.Color(255, 0, 0),           // Красный
  matrix.Color(0, 255, 0),           // Зеленый
  matrix.Color(0, 0, 255)            // Синий
};

void setup() 
{
  matrix.begin();                     // Инициализация матрицы
  matrix.setTextWrap(false);          // Отключаем автоматический перенос текста
  matrix.setBrightness(10);           // Устанавливаем яркость матрицы (от 0 до 255)
  matrix.setTextColor(colors[0]);     // Текущий цвет текста красный
}

// Переменные для эффекта прокрутки текста
int x    = matrix.width();            // Начальная позиция текста справа от края матрицы
int pass = 0;                         // Индекс текущего цвета в массиве цветов

void loop() 
{
  matrix.fillScreen(0);               // Очистка экрана
  matrix.setCursor(x, 13);            // Определяем позицию начала текста (x, y)
  matrix.setFont(&TimesNRCyr9pt8b);   // Используем наш шрифт TimesNRCyr9
  matrix.print(F("ПРИВЕТ RobotChip"));// Выводим текст на экран

  // Логика перемещения текста и смены цвета
  if(--x < -300) {                   // Когда текст выходит за пределы экрана...
    x = matrix.width();               // Возвращаем текст обратно вправо
    if(++pass >= 3) pass = 0;        // Меняем индекс цвета (циклическое переключение)
    matrix.setTextColor(colors[pass]);// Применяем следующий цвет из массива
  }

  matrix.show();                      // Показываем обновленное изображение на матрице
  delay(100);                        // Задерживаем выполнение на 100 миллисекунд
}

Описание программы:

Сначала в программе подключаем три библиотеки «Adafruit_NeoPixel», «Adafruit_NeoMatrix» и «Adafruit_GFX», а также подключаем поддержку русского шрифта.

#include <Adafruit_NeoPixel.h>       
#include <Adafruit_NeoMatrix.h>      
#include <Adafruit_GFX.h>     
#include "FontsRus/TimesNRCyr9.h"       

Затем указываем, к какому выводу платы подсоединена светодиодная лента.

#define PIN    6

Далее указываем габариты матрица 16×16 пикселей

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, PIN, NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,NEO_GRB + NEO_KHZ800);

Создаем массив трех основных цветов

const uint16_t colors[] = {
  matrix.Color(255, 0, 0),           
  matrix.Color(0, 255, 0),           
  matrix.Color(0, 0, 255)            

Потом запускаем матрицу командой begin(), предотвращаем автоматический перенос строк, применяя метод setTextWrap(false). Устанавливаем уровень яркости светодиодов равным 10 (при максимальном значении 255). Изначально цвет отображаемого текста задан красным.

matrix.begin();                     
  matrix.setTextWrap(false);         
  matrix.setBrightness(10);           
  matrix.setTextColor(colors[0]);    

В основном цикле программы сначала выполняется очистка экрана командой fillScreen(0). Затем положение курсора обновляется таким образом, что координата X плавно уменьшается. После этого устанавливается русский шрифт TimesNRCyr9pt8b и осуществляется вывод текста методом print().

matrix.fillScreen(0);               
  matrix.setCursor(x, 13);            
  matrix.setFont(&TimesNRCyr9pt8b);   
  matrix.print(F("ПРИВЕТ RobotChip"));

Затем медленно уменьшаем значение координаты X, перемещая текст по экрану. Когда позиция достигает значения −300, цикл начинается заново, при этом меняется цвет текста. Если текст не помещается целиком на экране, следует увеличить порог возврата. В случае излишней задержки вывода, наоборот, уменьшите это значение.

if(--x < -300) {                  
    x = matrix.width();             
    if(++pass >= 3) pass = 0;        
    matrix.setTextColor(colors[pass]);
  }

Завершается цикл обновлением дисплея с помощью команды show() и добавлением небольшой задержки длительностью 100 миллисекунд ( delay(100)), обеспечивающей плавность анимации.

matrix.show();                      
  delay(100);                     

Купить Arduino UNO
Купить гибкую светодиодную панель WS2812B, RGB, 16x16
Купить блок питания 5В, 5А

Вам может также понравиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *