(Neopixels) Как сохранить пиксели одного цвета, несмотря на увеличение яркости?
Я делал функцию затухания для NeoPixels. Однако, в тот момент, когда у меня была максимальная яркость для пикселей, я заметил там 2 цвета, хотя в своей функции я указал только один цвет.
Некоторые полоски одного цвета, а другие — другого. Я указал, что цвет полосок должен быть синим, однако многие полоски синие, а полоски ближе к концу — зеленые (но ближе к сине-зеленому цвету).
Есть ли способ сохранить цвет даже при изменении яркости? Я где-то читал в интернете, что при разных уровнях яркости отображается другой цвет, например, setPixelColor(brightness, r,g,b)
.
Я также пробовал библиотеку FastLED и следовал документации. Однако, освещение не делает того, что сказано в кодах, я пробовал leds[i].fadeLightBy(200)
и это не дало мне никакого результата.
Мой код для функции затухания (отредактировано с http://moving-rainbow.readthedocs.io/en/latest/guide/fade-in-and-out/):
void fade(uint32_t color) {
for (int i = 0; i < 255; i++) {
for (int q = 0; q < strip.numPixels(); q++) {
strip.setPixelColor(q, Wheel((color) & 255));
}
strip.setBrightness(i);
strip.show();
}
//уменьшение яркости
for (int l = 255; l > 255; l--) {
for (int p = 0; p < strip.numPixels(); p++) {
strip.setPixelColor(p, Wheel((color) & 255));
}
strip.setBrightness(l);
strip.show();
}
}
Метод «Колесо» взят из примера Arduino Neopixel strandtest.
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if (WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if (WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
Есть ли у вас какие-либо советы о том, как мне это сделать?
1 ответ
В этом примере наброска я использую простое затухание NeoPixel:
/*
*
* Демо NeoPixels - плавно увеличивает и уменьшает цвета (в массиве)
*
*/
#include <SPI.h>
#include <NeoPixels_SPI.h>
const unsigned int PIXELS = 8; // Количество пикселей в строке
void setup()
{
ledsetup();
} // конец настройки
float patterns [] [3] = {
{ 1, 0, 0 }, // красный
{ 0, 1, 0 }, // зеленый
{ 0, 0, 1 }, // синий
{ 1, 1, 0 }, // желтый
{ 1, 0, 1 }, // пурпурный
{ 0, 1, 1 }, // голубой
{ 1, 1, 1 }, // белый
{ 160.0 / 256, 82.0 / 256, 45.0 / 256 }, // сиена
{ 46.0 / 256, 139.0 / 256, 87.0 / 256 }, // цвет морской волны
};
// количество элементов в массиве
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
void loop()
{
for (byte i = 0; i < ARRAY_SIZE (patterns); i++)
{
// постепенное увеличение
for (byte m = 0; m < 100; m++)
{
showColor (PIXELS, patterns [i] [0] * m, patterns [i] [1] * m, patterns [i] [2] * m);
delay (10);
} // конец for
// затухание
for (byte m = 100; m > 0; m--)
{
showColor (PIXELS, patterns [i] [0] * m, patterns [i] [1] * m, patterns [i] [2] * m);
delay (10);
} // конец for
} // конец для каждого элемента массива
} // конец цикла
Это использует простую библиотеку NeoPixel, которую я написал с использованием оборудования SPI. Библиотека с точным кодом выше доступна здесь.
По сути, затухание выполняется путем умножения значений с плавающей точкой для значений R/G/B на константу от 0 до 100 (вы можете сделать это от 0 до 255).
Поскольку сами цвета выражены в диапазоне 0 .. 1, то результат умножения будет от 0 до 255. Для моего невооруженного глаза цвета кажутся настоящими при любой яркости.
Чтобы использовать библиотеку на Uno, просто подключите +5 В, Gnd и вывод данных MOSI (D11 на Uno).
- Странное поведение со светодиодной лентой WS2812B RGB
- Какая хорошая альтернатива Arduino Nano, которую можно использовать с Neopixels?
- Реструктурировать код для многозадачности Neopixel + ИК-пульт + ардуино
- игнорирование изменений значения потенциометра
- Ошибка компиляции для платы Arduino Uno
- Непрерывно запускайте функцию световой последовательности в операторе if
- Что такое "tws_delay" и как его использовать? (с ATTiny85)
- 20 м LED WS2811 Pixel Strip 12 В