(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


1 ответ


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).

,