Как управлять адресуемыми RGB-светодиодами WS2812B с помощью Arduino
Адресные RGB-светодиоды WS2812B отлично подходят для внутренней и внешней отделки. Это отличный выбор, если вы хотите управлять тысячами RGB-светодиодов с помощью одной линии передачи данных. Для RGB-светодиода WS2812B требуется только одна линия передачи данных для управления всеми последовательно подключенными светодиодами.
В этом руководстве вы узнаете об адресных RGB-светодиодах WS2811, WS2812, WS2812B и о том, как управлять ими с помощью Arduino.
Разница между WS2811, WS2812 и WS2812B
Доступны различные типы драйверов RGB-светодиодов, такие как WS2811, WS2812, WS2812B, SK6812 и т. д.
WS2811 — старая версия с внешней микросхемой. Он часто поставляется с 12-вольтовыми пакетами.
WS2812 — это не что иное, как WS2811, помещенный в корпус 5050 светодиодов.
WS2812B — это улучшенная версия WS2812. Он унаследовал все хорошие качества WS2812 и механически улучшил микросхему, еще больше повысив стабильность и эффективность.
А SK6812 - это клон WS2812B.
Все они будут работать более или менее одинаково. Но иногда вам нужно немного изменить код, чтобы он работал идеально.
Как работает WS2812B?
WS2812B имеет схему управления и микросхему RGB, интегрированную в пакет из 5050 компонентов. Этот пакет содержит четыре контакта — VCC, Ground, DIN и DOUT.
WS2812B имеет внутреннюю цифровую защелку и схему изменения формы сигнала. Он также включает электрическую схему сброса и схему сброса при потере питания.
Протокол передачи данных использует единый режим связи NZR. После того, как пиксель получает сигнал сброса, на DIN-порт поступают данные от контроллера. Первый пиксель собирает исходные 24-битные данные и отправляет их во внутреннюю защелку данных. Другие данные преобразуются внутренней схемой преобразования сигнала и отправляются в следующий каскадный пиксель через вывод Dout. После передачи для каждого пикселя сигнал уменьшается до 24 бит.
Две ножки питания, вход и выход. Команда приходит на входную ножку в виде последовательности 24 битов, по 8 на каждый цвет. Так как синхроимпульс отсутствует, ноль и единица отличаются длительностью: 0,4 мкс - ноль, 0,85 - единица. На один бит тратится 1,25 мкс, на один светодиод команда передается, соответственно, за 30 мкс. Скорость передачи, таким образом, составляет 800 кбит/с. В каждом чипе, в качестве конкретно ему адресованной команды, остается последние перед завершением передачи 24 бита, все предыдущие он транслирует на выход, передавая информацию по цепочке дальше. Окончанием пакета данных является пауза на низком уровне в течение 50 мкс, после чего каждый чип формирует сигналы на своих светодиодных ножках согласно “замершей” в нем информации. Цвет установлен и будет сохраняться до приема следующей команды.
Вот так в реальности выглядит передача данных на один светодиод:
24 бита и пауза. Данные можно расшифровать даже невооруженным глазом: 010110.. и так далее. Вот так все просто.
Требования к питанию для светодиодной ленты WS2812B
Для WS2812 требуется источник питания 5 В, и каждый светодиод потребляет ток примерно 60 мА при полной яркости. Если ваша светодиодная лента имеет 30 светодиодов, вам потребуется 60 мА x 30 = 1800 мА или ток 1,8 А. Таким образом, вы должны использовать источник питания 5 В с номинальным током 1,8 А или более.
Распиновка WS2812B
Лента WS2812B имеет три площадки для пайки на обоих концах. Вы можете припаять штыревые контакты, провода или трехконтактные разъемы к этим площадкам для пайки. В начале полосы у него есть контакты VCC, Ground и Din, а в конце полосы у него есть контакты VCC, Ground и Dout.
По исполнению:
В виде лент, плотностью от 30 до 144 светодиодов на метр и в разном защитном исполнении: IP30, IP65, IP67, IP68. Все, кроме первого, могут использоваться на улице почти в любых погодных условия
- В виде стандартных, привычных глазу светодиодов диаметром 5 мм. Они излучают равномерно во все стороны, что особо ценится любителями праздничных гирлянд, 3Д-кубов и прочих объемных предметов.
Технические характеристики WS2812B
- Размер - 5х5 мм
- Частота ШИМ - 400Гц
- Напряжение питания - 5В
- Потребление при нулевой яркости - 1 мА на светодиод
- Потребление при максимальной яркости - 60 мА на светодиод
- Цветность: RGB, 256 оттенков на канал, 16 миллионов цветов
- Размер данных - 24 бита на светодиод
- Скорость передачи данных - 800 кГц
Соединение WS2812B с Ардуино
В этом примере мы будем питать светодиодную ленту WS2812B, используя выходной контакт Arduino 5 В. Здесь мы используем 8 светодиодов. Вы можете подключить до 10-12 светодиодов, используя выходной контакт Arduino 5V. Если вы хотите добавить больше светодиодов, вам следует использовать внешний источник питания.
Здесь вы можете видеть, что мы подаем питание 5 В на светодиодную ленту WS2812B RGB от Arduino. Мы подключаем выходной контакт 5 В Arduino к контакту 5 В светодиодной ленты, а землю Arduino — к контакту заземления ленты. Затем подключите контакт данных светодиодной ленты к контакту Arduino № 3.
Если вы используете более 10-12 RGB-светодиодов WS2812B, вам необходимо подключить внешний источник питания. Вы можете подключить его, как показано ниже.
Вот и все, теперь вы можете запускать любой код снизу.
Самые популярные библиотеки
Поддерживает все версии Ардуино и множество протоколов передачи данных (не только для нашей ленты). Язык программирования, на котором она написана – чистый C.
Библиотека предназначена для работы со светодиодными кольцами NeoPixel Ring, разработки и производства Adafruit. Работает медленнее, обладает меньшими возможностями, но содержит в себе лишь самое нужное. Написана на C, языке ассемблера и немного на Wiring. Поддерживает всю линейку Ардуино.
Код Arduino WS2812B
Мы будем использовать библиотеку FastLED для управления светодиодной лентой WS2812B. Вы можете установить его вручную, загрузив его со страницы FastLED GitHub и поместив в папку библиотеки Arduinos. Или вы можете установить его, используя страницу управления библиотекой Arduino IDE.
Чтобы открыть окно управления библиотекой, перейдите в Инструменты > Управление библиотеками .
Подождите, пока менеджер библиотек загрузится должным образом. Затем найдите «fastled» . Там вы найдете пару записей. Выберите нужную библиотеку и нажмите «Установить».
Он установит библиотеку. Теперь перезапустите Arduino IDE, чтобы правильно загрузить библиотеку.
После правильной установки библиотеки загрузите приведенный ниже код, чтобы включить первые три светодиода.
#include
#define DATA_PIN 3
#define NUM_LEDS 8
#define BRIGHTNESS 64
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
// Define the array of leds
CRGB leds[NUM_LEDS];
#define UPDATES_PER_SECOND 100
void setup() {
FastLED.addLeds(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
}
void loop() {
// Turn the LED on
leds[0] = CRGB::Red;
leds[1] = CRGB::Green;
leds[2] = CRGB::Blue;
FastLED.show();
delay(10);
}
Объяснение кода
Здесь вы можете видеть, что мы сначала включаем библиотеку FastLED. Затем мы определяем некоторые переменные, чтобы использовать их позже. Мы будем использовать эту DATA_PIN
переменную для хранения номера вывода Arduino, который подключен к светодиодной ленте WS2812B.
Точно так же мы используем NUM_LEDS
для хранения номера светодиода, который есть на вашей светодиодной ленте.BRIGHTNESS
для управления яркостью светодиодов. Вы можете установить любой уровень яркости от 0 до 255.
LED_TYPE
установит тип светодиодного драйвера.
COLOR_ORDER
установит цветовую последовательность вашего светодиодного драйвера.
CRGB leds
[
NUM_LEDS
];
создаст массив с именем LEDs, который может содержать данные RGB для необходимого количества светодиодов.
Теперь в разделе настройки мы установим нашу светодиодную ленту.
FastLED.addLeds(leds, NUM_LEDS);
Это сообщает библиотеке, что мы используем светодиодную ленту WS2812B, которая подключена к контакту Arduino номер 3, а драйвер имеет порядок светодиодов GRB. и полоса имеет 8 светодиодов WS2812B RGB.
Настройка цветов RGB
Мы можем установить значение RGB светодиода по-разному. Здесь мы рассмотрим несколько популярных.
Пример 1: установить цвет из красного, зеленого и синего компонентов по отдельности
leds[i].red = 50;
leds[i].green = 100;
leds[i].blue = 150;
// ...or, using the shorter synonyms "r", "g", and "b"...
leds[i].r = 50;
leds[i].g = 100;
leds[i].b = 150;
Пример 2: установить цвет из красного, зеленого и синего компонентов одновременно.
leds[i] = CRGB( 50, 100, 150);
Пример 3: установить цвет с помощью «шестнадцатеричного кода цвета» (0xRRGGBB)
leds[i] = 0xFF007F;
Пример 4: установить цвет с помощью любого именованного веб-цвета HTML
leds[i] = CRGB::HotPink;
Пример 5: установить цвет через setRGB
leds[i].setRGB( 50, 100, 150);
Скопируйте цвет CRGB из одного пикселя в другой.
leds[i] = leds[j];
Создавайте различные типы эффектов
В этом разделе мы создадим различные типы эффектов в отдельной функции. И вызовите их в разделе цикла. Вы можете скопировать оттуда любую функцию и использовать ее в своем коде WS2812B Arduino.
Запустите приведенный ниже код, чтобы показать различные эффекты.
#include
#define DATA_PIN 3
#define NUM_LEDS 12
#define BRIGHTNESS 10
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
// Define the array of leds
CRGB leds[NUM_LEDS];
#define UPDATES_PER_SECOND 100
void setup() {
FastLED.addLeds(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
}
void loop() {
ws2812_fill_all();
moving_three_led();
rgb_chasing();
}
void ws2812_fill_all() {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB::Red;
delay(100);
FastLED.show();
}
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB::Black;
delay(100);
FastLED.show();
}
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB::Green;
delay(100);
FastLED.show();
}
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB::Black;
delay(100);
FastLED.show();
}
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB::Blue;
delay(100);
FastLED.show();
}
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB::Black;
delay(100);
FastLED.show();
}
}
void moving_three_led() {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB::Red;
leds[i + 1] = CRGB::Green;
leds[i + 2] = CRGB::Blue;
FastLED.show();
delay(100);
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB::Black;
//delay(5);
}
}
}
void rgb_chasing() {
int ms = 100;
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB(100, 0, 0);
FastLED.show();
delay(ms);
}
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB(0, 100, 0);
FastLED.show();
delay(ms);
}
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB(0, 0, 100);
FastLED.show();
delay(ms);
}
}
Цветовая палитра FastLED
Палитра — это таблица поиска, которая сопоставляет одно число от 0 до 255 с цветом RGB. Существует два основных типа палитр: более старый тип состоит из 16 цветов, а новый — градиентный.
Я считаю, что типы градиента наиболее полезны. Итак, мы начнем с них. Мы можем определить палитру градиента с помощью функции, показанной ниже.
DEFINE_GRADIENT_PALETTE (heatmap_gp) {
0, 0, 0, 0, //black
128, 255, 0, 0, //red
192, 255, 255, 0, //bright yellow
255, 255, 255, 255 //full white
};
Давайте посмотрим на вторую строку, и вы увидите, что она состоит из четырех чисел. Первое число определяет, где цвет будет отображаться в вашем градиенте, а следующие три числа — это значения RGB цвета, который вы хотите в этой позиции.
Первое число равно нулю, поэтому оно будет в самом начале градиента. И следующие три числа — 0, 0, 0, так что в этой позиции они будут черными.
Точно так же вы можете видеть, что в третьей строке мы поместили красный цвет (255, 0, 0) в позицию 128 в градиенте. В четвертой строке мы помещаем желтый цвет (255, 255, 0) в позицию 200 в градиенте. И в последней строке мы помещаем полный белый цвет (255, 255, 255) в конец цветовой палитры (позиция 255).
Здесь FirstLED отлично справляется со своей задачей, он берет цвета и позиции, которые вы указали, и интерполирует между ними, чтобы создать прекрасный плавный градиент.
Окончательная цветовая палитра будет выглядеть так:
Теперь вы можете использовать эту цветовую палитру двумя способами. Вы можете выбрать цвет из любой позиции палитры и использовать этот цвет, или вы можете использовать всю палитру для заполнения светодиодной ленты.
Выберите цвет из палитры
leds
[
i
]
=
ColorFromPalette
(
myPalette
,
index
);
– это выберет цвет из индекса и заполнит светодиод.
Итак, в качестве примера возьмем цвет с позиции 200 в моей палитре и заполним этим цветом быстрый светодиод полосы.leds
[
1
]
=
ColorFromPalette
(
myPalette
,
200
);
В приведенном ниже примере будет показан полный код.
#include
#define DATA_PIN 3
#define NUM_LEDS 8
#define BRIGHTNESS 64
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
uint8_t paletteIndex = 0;
DEFINE_GRADIENT_PALETTE (heatmap_gp) {
0, 0, 0, 0, //black
128, 255, 0, 0, //red
200, 255, 255, 0, //bright yellow
255, 255, 255, 255 //full white
};
CRGBPalette16 myPalette = heatmap_gp;
void setup() {
FastLED.addLeds(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
}
void loop() {
leds [0] = ColorFromPalette(myPalette, 125);
leds [1] = ColorFromPalette(myPalette, 170);
leds [2] = ColorFromPalette(myPalette, 210);
leds [3] = ColorFromPalette(myPalette, 255);
FastLED.show();
}
Заполнение ряда светодиодов палитрой
Вы можете использовать эту функцию fill_palette для заполнения палитры нескольких светодиодов. Требуется довольно много аргументов.
fill_palette(leds, nLEDS, startIndex, incIndex, Palette, brightness, blendType);
Первый аргумент — leds
массив для светодиодной ленты.
Затем идет ряд светодиодов. Поместите все светодиоды или количество светодиодов, которое вы хотите заполнить.startIindex
определит начальную точку, из которой вы хотите выбрать цвет в палитре. Поэтому, если вы укажете значение 0, будут выбраны все цвета от 0 до 255, а 100 — все цвета от 100 до 255 в палитре.incIndex
или Increment Index — это то, насколько мы хотим увеличить индекс при переходе от светодиода к светодиоду.
Затем вам нужно поместить эталонную палитру и файл brightness
.
В конце концов, у вас есть blendType
. Тип смешивания может быть LINEARBLEND
или NOBLEND
.
fill_palette(leds, NUM_LEDS, paletteIndex, 255/NUM_LEDS, myPalette, BRIGHTNESS, LINEARBLEND);
Сначала я определю NUM_LEDS, палитруIndex и BRIGHTNESS, а затем использую приведенную выше строку в секции цикла, чтобы заполнить полосу.
#include
#define DATA_PIN 3
#define NUM_LEDS 8
#define BRIGHTNESS 64
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
uint8_t paletteIndex = 0;
DEFINE_GRADIENT_PALETTE (heatmap_gp) {
0, 0, 0, 0, //black
128, 255, 0, 0, //red
200, 255, 255, 0, //bright yellow
255, 255, 255, 255 //full white
};
CRGBPalette16 myPalette = heatmap_gp;
void setup() {
FastLED.addLeds(leds, NUM_LEDS);
}
void loop() {
fill_palette(leds, NUM_LEDS, paletteIndex, 255 / NUM_LEDS, myPalette, BRIGHTNESS, LINEARBLEND);
FastLED.show();
}
Создать пользовательскую цветовую палитру
В предыдущем разделе вы узнали, как создать цветовую палитру вручную. Создавать цветовую палитру вручную довольно скучно.
К счастью, у нас есть хорошая коллекция цветовых палитр — soliton.vm.bytemark.co.uk/pub/cpt-city/index.html , и у нас есть расширение FastED PaletteKnife, которое автоматически генерирует код цветовой палитры из этих цветовых палитр.
Чтобы создать цветовую палитру из этой коллекции, нам нужно сначала установить расширение FastED PaletteKnife.
Перейдите на страницу расширения FastED PaletteKnife — fastled.io/tools/paletteknife/ и прокрутите вниз до раздела «Установка». Там вы найдете ссылку на букмарклет, перетащите эту ссылку на панель закладок. После успешной установки это будет выглядеть так.
Теперь откройте цветовую палитру из soliton.vm.bytemark.co.uk/pub/cpt-city/index.html . Вы найдете потрясающие цветовые палитры в разделе «Самые популярные палитры» на этой странице. Здесь мы будем использовать палитру температуры из списка палитр cpt. Вы можете перейти прямо по этой ссылке soliton.vm.bytemark.co.uk/pub/cpt-city/arendal/tn/temperature.png.index.html или найти понравившуюся палитру. Затем нажмите на закладку PaletteKnife.
Появится какое-то сообщение, нажмите ОК. Он покажет другое сообщение с текстовым полем, как показано ниже.
Скопируйте оттуда текст и вставьте его над разделом настройки вашего скетча Arduino FastLED.
// Gradient palette "temperature_gp", originally from
// http://soliton.vm.bytemark.co.uk/pub/cpt-city/arendal/tn/temperature.png.index.html
// converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 144 bytes of program space.
DEFINE_GRADIENT_PALETTE( temperature_gp ) {
0, 1, 27,105,
14, 1, 27,105,
14, 1, 40,127,
28, 1, 40,127,
28, 1, 70,168,
42, 1, 70,168,
42, 1, 92,197,
56, 1, 92,197,
56, 1,119,221,
70, 1,119,221,
70, 3,130,151,
84, 3,130,151,
84, 23,156,149,
99, 23,156,149,
99, 67,182,112,
113, 67,182,112,
113, 121,201, 52,
127, 121,201, 52,
127, 142,203, 11,
141, 142,203, 11,
141, 224,223, 1,
155, 224,223, 1,
155, 252,187, 2,
170, 252,187, 2,
170, 247,147, 1,
184, 247,147, 1,
184, 237, 87, 1,
198, 237, 87, 1,
198, 229, 43, 1,
212, 229, 43, 1,
212, 220, 15, 1,
226, 220, 15, 1,
226, 171, 2, 2,
240, 171, 2, 2,
240, 80, 3, 3,
255, 80, 3, 3};
Теперь вы можете использовать эту цветовую палитру по своему усмотрению.
В приведенном ниже примере мы будем использовать эту цветовую палитру для заполнения полосы и создания движущегося эффекта.
#include
#define DATA_PIN 3
#define NUM_LEDS 8
#define BRIGHTNESS 64
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
uint8_t paletteIndex = 0;
DEFINE_GRADIENT_PALETTE( temperature_gp ) {
0, 1, 27,105,
14, 1, 27,105,
14, 1, 40,127,
28, 1, 40,127,
28, 1, 70,168,
42, 1, 70,168,
42, 1, 92,197,
56, 1, 92,197,
56, 1,119,221,
70, 1,119,221,
70, 3,130,151,
84, 3,130,151,
84, 23,156,149,
99, 23,156,149,
99, 67,182,112,
113, 67,182,112,
113, 121,201, 52,
127, 121,201, 52,
127, 142,203, 11,
141, 142,203, 11,
141, 224,223, 1,
155, 224,223, 1,
155, 252,187, 2,
170, 252,187, 2,
170, 247,147, 1,
184, 247,147, 1,
184, 237, 87, 1,
198, 237, 87, 1,
198, 229, 43, 1,
212, 229, 43, 1,
212, 220, 15, 1,
226, 220, 15, 1,
226, 171, 2, 2,
240, 171, 2, 2,
240, 80, 3, 3,
255, 80, 3, 3};
CRGBPalette16 myPalette = temperature_gp;
void setup() {
FastLED.addLeds(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
}
void loop() {
fill_palette(leds, NUM_LEDS, paletteIndex, 255 / NUM_LEDS, myPalette, BRIGHTNESS, LINEARBLEND);
// Creates a moving effect
EVERY_N_MILLISECONDS(10) {
paletteIndex++;
}
FastLED.show();
}
На последок код забавной гирлянды.
У меня лента 60 диодов на метр, 5 метров ленты, значит #define NUM_LEDS
= 300
#include
#define LED_PIN 5
#define NUM_LEDS 300
#define BRIGHTNESS 64
#define LED_TYPE WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
#define UPDATES_PER_SECOND 100
// Этот скетч демонстрирует, как при помощи библиотеки FastLED
// создавать и использовать цветовые палитры.
//
// Пользоваться палитрами на практике – это гораздо проще,
// чем читать о них в теории. Поэтому просто запустите скетч
// и понаблюдайте за поведением светодиодов, попутно читая код.
// Этот скетч умеет создавать восемь (или больше) разных палитр,
// но его скомпилированная версия на AVR составляет всего 6,5 Кб.
//
// В библиотеку FastLED уже встроено несколько палитр. Кроме того,
// функционал библиотеки позволяет без особого труда создавать
// собственные палитры.
//
// Теорию того, как работают так называемые «компактные палитры»
// библиотеки FastLED, читайте в самом конце скетча.
CRGBPalette16 currentPalette;
TBlendType currentBlending;
extern CRGBPalette16 myRedWhiteBluePalette;
extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM;
void setup() {
delay( 3000 ); // небольшая задержка для того, чтобы цепь
// «устаканилась» после включения питания
FastLED.addLeds(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.setBrightness( BRIGHTNESS );
currentPalette = RainbowColors_p;
currentBlending = LINEARBLEND;
}
void loop()
{
ChangePalettePeriodically();
static uint8_t startIndex = 0;
startIndex = startIndex + 1; // скорость движения
FillLEDsFromPaletteColors( startIndex);
FastLED.show();
FastLED.delay(1000 / UPDATES_PER_SECOND);
}
void FillLEDsFromPaletteColors( uint8_t colorIndex)
{
uint8_t brightness = 255;
for( int i = 0; i < NUM_LEDS; i++) {
leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
colorIndex += 3;
}
}
// Этот фрагмент скетча демонстрирует несколько разных
// цветовых палитр. В библиотеку FasLED уже встроено несколько
// палитровых шаблонов: RainbowColors_p, RainbowStripeColors_p,
// OceanColors_p, CloudColors_p, LavaColors_p, ForestColors_p и
// PartyColors_p.
//
// Кроме того, вы можете создавать собственные палитры или даже
// написать код, создающий палитры прямо на ходу.
// Ниже продемонстрировано, как все это сделать.
void ChangePalettePeriodically()
{
uint8_t secondHand = (millis() / 1000) % 60;
static uint8_t lastSecond = 99;
if( lastSecond != secondHand) {
lastSecond = secondHand;
if( secondHand == 0) { currentPalette = RainbowColors_p; currentBlending = LINEARBLEND; }
if( secondHand == 10) { currentPalette = RainbowStripeColors_p; currentBlending = NOBLEND; }
if( secondHand == 15) { currentPalette = RainbowStripeColors_p; currentBlending = LINEARBLEND; }
if( secondHand == 20) { SetupPurpleAndGreenPalette(); currentBlending = LINEARBLEND; }
if( secondHand == 25) { SetupTotallyRandomPalette(); currentBlending = LINEARBLEND; }
if( secondHand == 30) { SetupBlackAndWhiteStripedPalette(); currentBlending = NOBLEND; }
if( secondHand == 35) { SetupBlackAndWhiteStripedPalette(); currentBlending = LINEARBLEND; }
if( secondHand == 40) { currentPalette = CloudColors_p; currentBlending = LINEARBLEND; }
if( secondHand == 45) { currentPalette = PartyColors_p; currentBlending = LINEARBLEND; }
if( secondHand == 50) { currentPalette = myRedWhiteBluePalette_p; currentBlending = NOBLEND; }
if( secondHand == 55) { currentPalette = myRedWhiteBluePalette_p; currentBlending = LINEARBLEND; }
}
}
// Эта функция заполняет палитру совершенно случайными цветами.
void SetupTotallyRandomPalette()
{
for( int i = 0; i < 16; i++) {
currentPalette[i] = CHSV( random8(), 255, random8());
}
}
// Эта функция делает палитру из черных и белых линий.
// Поскольку палитра – это, в сущности, массив
// из шестнадцати CRGB-цветов, для ее создания можно использовать
// различные функции fill_* – вроде fill_solid(), fill_gradient(),
// fill_rainbow() и т.д.
void SetupBlackAndWhiteStripedPalette()
{
// сначала делаем все фрагменты черными...
fill_solid( currentPalette, 16, CRGB::Black);
// ...а потом делаем каждый четвертый фрагмент белым:
currentPalette[0] = CRGB::White;
currentPalette[4] = CRGB::White;
currentPalette[8] = CRGB::White;
currentPalette[12] = CRGB::White;
}
// Эта функция заполняет палитру фиолетовыми и зелеными полосами.
void SetupPurpleAndGreenPalette()
{
CRGB purple = CHSV( HUE_PURPLE, 255, 255);
CRGB green = CHSV( HUE_GREEN, 255, 255);
CRGB black = CRGB::Black;
currentPalette = CRGBPalette16(
green, green, black, black,
purple, purple, black, black,
green, green, black, black,
purple, purple, black, black );
}
// Фрагмент кода ниже показывает, как создать статичную палитру,
// хранящуюся в памяти PROGMEM (т.е. во flash-памяти).
// Этот тип памяти, как правило, просторней, чем RAM.
// Статичная палитра вроде той, создание которой показано ниже,
// занимает, как правило, 64 байта flash-памяти.
const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM =
{
CRGB::Red,
CRGB::Gray, // белый – слишком яркий свет
// по сравнению с красным и синим
CRGB::Blue,
CRGB::Black,
CRGB::Red,
CRGB::Gray,
CRGB::Blue,
CRGB::Black,
CRGB::Red,
CRGB::Red,
CRGB::Gray,
CRGB::Gray,
CRGB::Blue,
CRGB::Blue,
CRGB::Black,
CRGB::Black
};
// Теперь немного теории о том, как работают компактные палитры
// библиотеки FastLED.
//
// В компьютерной графике, как правило, палитра
// (или «справочная таблица цветов») состоит из 256 фрагментов,
// которые содержат 256 разных 24-битных RGB-цветов. Соответственно,
// вы можете обратиться к нужному вам цвету при помощи простого
// 8-битного (т.е. 1-байтного) значения.
// Но 256-фрагментная палитра занимает 768 байт RAM-памяти,
// и для Arduino это, как правило, слишком много.
//
// FastLED поддерживает эти традиционные 256-фрагментные палитры -
// на тот случай, если RAM-память вашей сборки в состоянии потянуть
// необходимые 768 байт.
//
// Но в библиотеке FastLED есть и более компактная альтернатива.
// Эта функция называется «компактной палитрой» и состоит
// из 16 фрагментов. Впрочем, доступ к ней осуществляется так,
// будто на самом деле в ней 256 фрагментов, и это выполняется за счет
// интерполяции между имеющимися 16 фрагментами. Другими словами,
// между каждыми двумя смежными фрагментами генерируется пятнадцать
// виртуальных промежуточных фрагментов.
//
// К примеру, если для первого фрагмента компактной таблицы задать
// зеленый цвет (0,255,0), а для второго – синий (0,0,255),
// а затем запросить первые шестнадцать цветов, то библиотека вернет
// зеленый цвет, а следом – пятнадцать цветов, формирующих плавный
// градиент от зеленого к синему.
Заключение
В этом уроке вы узнали, как подключить светодиодную ленту RGB WS2812D к Arduino и как управлять ими различными способами. Я надеюсь, что вы найдете этот урок очень полезным. Чтобы получать больше подобного контента, подпишитесь на нашу еженедельную рассылку.
Кроме того, используйте раздел комментариев ниже, чтобы поделиться своими идеями и проектами, связанными со светодиодами WS2812B RGB.
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.