Изготовление цифрового дисплея на WS2812B

Дисплей с WS2812Наигравшись с  линейкой  состоящей из 10 светодиодов WS2812B, описанной в предыдущей статье, решил сделать что-нибудь посложнее.

После изготовления погодной станции появилась мысль, оснастить все комнаты часами с показом температуры от центрального сервера.
Думал делать такие часы из семисегментных индикаторов с цифрами высотой 7-10 см, но тут очень удачно подвернулись пиксельные светодиоды.

Для отображения 4-х цифр можно применить матричный дисплей 8×16 или даже 5×15. Но взглянув на свое табло от погодной станции — на графический дисплей такого мизерного разрешения ничего толком не вывести. Тем более количество оставшихся после пайки линеек светодиодов решило все сомнения. Буду делать сегментный индикатор.

Спроектировал дисплей в графическом пакете: четыре знака под цифры, три десятичные точки, для отображение, например, температуры и двоеточие между часами и минутами. Получилось всего 57 светодиодов WS2812B.

Эскиз дисплея на WS2812B

 

Ссылка на даташит WS2812B, схемы включения и цоколевка есть в статье про светодиодные линейки.

Печатную плата дисплея на WS2812B проектирую в Spirit Layout 6.0

Чертеж печатной платы WS2812B

Скачать чертеж печатной платы для программы Spirit Layout 6.0

Изготавливаю печатную плату методом ЛУТ

Печатная плата дисплея на  WS2812

Паяю светодиоды на плату

Готовый дисплей на WS2812

Плата дисплея WS2812

Тестовый скетч из библиотеки  Adafruit Neo Pixel показал работоспособность дисплея

Работа дисплея на WS2812

Дисплей WS2812 в работе

WS2812 крпупно

 

Несколько демо скетчей для дисплея на WS2812B

Скетч показывающий возможности управления цветом цифр дисплея

Демо скетч для дисплея WS2812. Управление цветом

Скетч демонстрирующий скорость работы дисплея

Демо скетч для дисплея WS2812. Таймер

Скетч демонстрирующий управление яркостью цифр дисплея

Демо скетч для дисплея WS2812. Управление яркостью

Небольшой итог

Дисплей полностью оправдал мои надежды. Ресурсы Ардуино тратятся только во время записи в цепочку WS2812.
Если после этого выключить контроллер, информация в светодиодах остается.

Никакого мерцание при перерисовке светодиодов, как на некоторых матричных дисплеях.

Максимальное энергопотребление дисплея ~600мА,  приводит периодически к перезагрузке контроллера при питании от USB компьютера. При питании от внешнего источника все работает стабильно.

Нагрев дисплея при работе не более 40С

Стоимость данного дисплея получается около $7.5 + печатная плата и все материалы для пайки

К недостаткам данной реализации можно привести слабоватую читаемость цифр. Для улучшения читаемости лучше сделать цифру 4×7 диодов, что приведет к увеличению количества WS2812 до 85 и стоимость примерно $11

Эскиз дисплея на 85 WS2812

Кто работал, кто устал … можно и отдохнуть в рабочем кресле!

Дисплей WS2812

 

Чертеж печатной платы дисплея на WS2812B
221.7 KiB
2360 Downloads
Детали
Демо скетч для дисплея WS2812. Таймер
3.3 KiB
3060 Downloads
Детали
Демо скетч для дисплея WS2812. Управление яркостью
5.6 KiB
2415 Downloads
Детали
Демо скетч для дисплея WS2812. Управление цветом
5.0 KiB
3543 Downloads
Детали
Вы можете оставить отзыв или трекбек со своего сайта.

18 комментариев на «Изготовление цифрового дисплея на WS2812B»

  1. alex187:

    Есть желание собрать типа экрана на 30 х 60 точек RGB. Сложно сделать управление?

    Хочу сделать на параллельном чипе — http://www.alibaba.com/products/F0/ws2821/8.html

  2. Alexey Alexey:

    Можно и на этом.
    Смотря что ждать от управления.
    Мне проще на ардуине сделать

  3. Архип:

    В даташите написано что обязателен конденсатор и для некоторых вариаций и резистор. У тебя их нет. Зачем они тогда нужны?

  4. Алексей:

    Подскажите, помогите, как зажечь ТРИ светика такой матрицы.
    Прошу, хочу понять как работают такие светики по трем проводам (+\-\s)

    • Alexey Alexey:

      Ну в первой статье алгоритм расписан, а подробнее в даташите даже с графиками.
      Каждый пиксель обрабатывает одну команду (три байта) из последовательности после сброса, остальные просто транслирует на выход. Получается, что первый отображает первые три байта, второй следующие и так далее. Всего заявлено управление 1024 штуками с частотой 30 раз в секунду

  5. Алексей:

    Спасибо, попробую, для меня это сложно )))

  6. Алексей:

    Можно маленький скечт для трех светодиодов, чтоб понять как сам скечт работает. Ну пусть будет один цвет и простая бегушка — хочется посмотреть алгоритм скетча, а не как устроен принцип работы таких светиков. Просто в моем случаи сложность в программирование на ардуине )))
    Заранее спасибо всем за помощь ))))

    • Alexey Alexey:

      #include
      Adafruit_NeoPixel led3 = Adafruit_NeoPixel(3, 2, NEO_GRB + NEO_KHZ800); //Три светодиода на DIO 2

      void setup() {
      led3.begin();
      }

      void loop() {
      // Бегущий огонь на 3 светодиода красного цвета cо скоростью 0.5 сек
      for( int i=0; i<3; i++ ){
      for( int j=0; j<3; j++ ){
      if( i == j )led3.setPixelColor(j, led3.Color(255,0,0));
      else led3.setPixelColor(j, led3.Color(0,0,0));
      }
      led3.show();
      delay(500);
      }
      }

      Кстати, в библиотеке есть неплохие примеры

  7. Денис:

    Алексей, никак не пойму, как в скетче связаны uint16_t DIGIT[] и unsigned int R_MASK[].
    Я так понимаю R_MASK[] это маска, по которой в цикле создается цифра? Никак не могу сообразить, как маску переделать под цифры размером 4 на 7 диодов.

    Массив цифр у меня получился следующий:
    uint16_t DIGIT[] = {
    0xFF6FF, /* 0 */
    0xFE000, /* 1 */
    0x9FFcF, /* 2 */
    0x83FFF, /* 3 */
    0xF097F, /* 4 */
    0xF3FF9, /* 5 */
    0xFFFF9, /* 6 */
    0x8067F, /* 7 */
    0xFFFFF, /* 8 */
    0xF3FFF /* 9 */

    };

    Подскажите, какую маску под них нужно написать?

  8. erdo?an:

    привет. Я жду помощи по этому проекту я хочу на сегодняшний день P10 .16×32 час рейтинга.

    ТУРЦИЯ / АНКАРА

  9. erdo?an:

    Мне нужно время, температура матрицы проекта

    ТУРЦИЯ / АНКАРА

  10. xopek:

    Добрый времень суток,
    А как все-таки сделать 4*7?
    Я вроде и DIGIT перерисовал и отметку начала цифр изменил, и количество точке с 13 до 20, но все равно 20 диод не светится, а ещё в каждой цифре 2-3 лишних светодиоды светится.
    uint16_t DIGIT[] = {
    0xFF6FF, /* 0 */
    0x7F, /* 1 */
    0xF3FF9, /* 2 */
    0x83FFF, /* 3 */
    0x1E97F, /* 4 */
    0x9FFCF, /* 5 */
    0xFFFCF, /* 6 */
    0x30FF, /* 7 */
    0xFFFFF, /* 8 */
    0x9FFFF /* 9 */
    };
    uint8_t POSITION[] = { 3,24,47,68 };

    for( int i=0; i<20; i++ )

    Подскажите пожалуйста

Ваш отзыв на Alexey

Вы должны войти, чтобы оставлять комментарии.