7-СЕГМЕНТНЫЙ RGB ИНДИКАТОР

     простые интересные РАДИОСХЕМЫ сделанные своими руками


» ПОИСК СХЕМ


» РАДИОБЛОГИ
Добавление своих символов на символьном дисплее 1602 (русификация)
Очень простой датчик-реле уровня воды
Стабилитроны в стабилизаторах напряжения
Защита авто электроники от перенапряжения и перегрузки
Тестер напряжения пробоя стабилитронов и транзисторов
Автономные Транспортные Средства: такси, грузовики, автобусы
БП ПК ATX: ещё модификация с плавной регулировкой тока и вольтажа
Цифровой светодиодный ампервольтметр: перепрошивка
Радиосхемы » Светодиоды

7-СЕГМЕНТНЫЙ RGB ИНДИКАТОР


Оказывается возможно сделать 7-сегментный дисплей, который будет менять цвет индикации. Это делается на основе разноцветных светодиодов WS2812B, специальной печатной платы и корпуса. Такой дисплей работает с Arduino и область его применения достаточно широкая.

Дисплей основан на специальных цветных светодиодах WS2812B, большим количеством которых можно управлять с помощью одного контакта. То есть это интеллектуальный светодиодный драйвер, подключенный к диоду RGB. Он позволяет управлять большим количеством светодиодов с помощью только одного вывода. Для этих LED требуется только источник питания (5 В) и один сигнал, они соединены в схеме так:

В случае длинных кабелей перед подключением к микроконтроллеру стоит добавить резистор на линии передачи данных. Конечно, для управления ими требуется использование соответствующего протокола.

Все управление осуществляется с помощью одного цифрового сигнала, который подается на вывод DIN первого светодиода. Отправляем сигнал по одному цветным битам (правильно закодированным). На каждый светодиод приходится 24 бита (3 байта - красный байт, зеленый байт, синий байт). Это означает, что можем отображать широкий диапазон цветов, теоретически до 16 777 216 различных оттенков! Данные биты передаются, пока не зафиксируем низкий уровень выходного сигнала минимум на 50 мкс. Сами биты кодируются путем указания высокого и низкого уровня на выводе в течение соответствующего времени. В итоге это выглядит как показано на картинке:

  • если хотим отправить бит 0, то устанавливаем контакт связи в высокое состояние на время T0H, а затем в низкое состояние на время T0L.
  • если хотим отправить бит 1, мы устанавливаем контакт связи в высокое состояние на время T1H, а затем в низкое состояние на Время T1L.
  • если хотим объявить, что завершаем передачу данных (то есть после этой паузы можем управлять светодиодами с самого начала), установить контакт в низкое состояние хотя бы на время.

Время указано в таблице:

Для проекта использовалась плата PIC18F45K50 (PIC18F4550 также подошла бы сюда, поскольку оба этих микроконтроллера почти идентичны). На этой плате установлен кварцевый генератор на 20 МГц. Кроме того, она содержит довольно простые элементы, такие как резистор сброса, конденсаторы, разъем USB (используется только для питания).

Но вернёмся к индикатору. Плата представляет собой одну цифру. Цифры можно комбинировать друг с другом и получать в итоге больше цифр (управляемых одним контактом) благодаря использованию WS2812B.

Сделано все это размером не более 5 на 5 см.

Но пайка это еще не всё, ведь нужно сделать фильтр, который немного рассеет свет и даст эффект освещения целых сегментов (а не отдельных светодиодов). Использовался для этого один из слоев из старой ЖК-матрицы. Выбран слой, который дает лучший эффект, бело-молочный:

Наклеим на элемент с помощью суперклея, так как больше менять не планируется.

Панели спроектированы так, чтобы их можно было соединять вместе. В конечном итоге будем использовать прототипы в качестве индикатора температуры, поэтому соединим вместе три модуля:

Вот LED модуль в действии (максимально возможная яркость):

Пример кода для Arduino

А это короткий тестовый код для Arduino. Код поддерживает оцифровку, и вы можете легко добавлять к нему дополнительные цифры. Он основан на библиотеке Adafruit_NeoPixel.h

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

#define LED_PIN    6

#define DIGITS 3
#define LED_COUNT DIGITS*7

// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
  // These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
  // Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
  // END of Trinket-specific code.

  strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
  strip.show();            // Turn OFF all pixels ASAP
  strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
}
int masks[10] = { 119,
68, 62, 110,
77, 107, 251, 70, 0xFF, 239  };
void displayDigit(int d, int pos, uint32_t color)
{
  int ofs = pos * 7;
  for(int i=0; i< 7; i++) { // For each pixel in strip...
    if((1 << i) & masks[d])
    {
        strip.setPixelColor(ofs+i, color);         //  Set pixel's color (in RAM)
    }
    else
    {
        strip.setPixelColor(ofs+i, 0);         //  Set pixel's color (in RAM)
    }
  }
}
void displaySimple(int d, uint32_t color)
{
  d = d % 1000;
  int a = d / 100;
  int b = (d%100)/10;
  int c = d % 10;

  displayDigit(a,0,color);
  displayDigit(b,1,color);
  displayDigit(c,2,color);
  strip.show();
}
// loop() function -- runs repeatedly as long as board is on ---------------
int counter = 123;
void loop() {
  for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 512) {
      int pixelHue = firstPixelHue;// + (i * 65536L / strip.numPixels());
      uint32_t c = strip.gamma32(strip.ColorHSV(pixelHue));
      displaySimple(counter,c);      
      delay(100);
      counter++;
  }

}

Функция displayDigit устанавливает отображение данной цифры в определенной позиции, а displaySimple отображает трехзначное число (вы можете обрабатывать больше цифр, но нужно изменить код). Массив 'masks' определяет, какие фрагменты должны освещаться для какой цифры (вы можете добавить дополнительные элементы в этот массив для отображения, например, букву 'A').

Стоит помнить, что простая установка цвета WS2812B библиотекой здесь не отображает его на панели, для отображения изменений вызовите 'strip.show ()'.

Исходя из этого, вы легко сможете создать простой термометр или часы (в случае с часами пригодится четвертая цифра, но нужно будет изменить код).

Если что, можете удвоить количество WS2812B, чтобы увеличить яркость сегментов. Можно подумать об использовании другой стороны печатной платы, например, чтобы предоставить место для микроконтроллера. Также использовать лучшее светорассеивающее покрытие, поэкспериментируйте.

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

   Форум по светодиодам




   Обсудить статью 7-СЕГМЕНТНЫЙ RGB ИНДИКАТОР






» РАДИОЭЛЕМЕНТЫ

Группа вконтакте Канал ютуб Группа в фэйсбук © 2010-2021 "Радиосхемы" Все права защищены Почта Моб.версия