Как изменить цвет с выключенного на включенный в 1 цвете?

Поэтому я хочу добиться того же эффекта, что и стирание цвета (например, ходить по кругу, включая светодиоды, пока они все не включатся), за исключением того, что вместо немедленного перехода от выкл. к 100% яркости мне нужно, чтобы это выглядело более естественно, заставляя его постепенно переходить от выключенного к включенному до одного цвета, и светодиоды должны оставаться включенными после завершения постепенного включения. Это мой текущий код, и я не могу понять, как заставить его исчезать. все, что я нашел в Google, очень сложно сделать из простой вещи. неужели так сложно это сделать?

#include <Adafruit_NeoPixel.h>
#define PIN 6
#define NUM_LEDS 24
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRBW + NEO_KHZ800);

void setup() {
  strip.setBrightness(2);
  strip.begin();
  strip.show(); // Инициализируем все пиксели выключенными
}

void loop() {
  colorWipe(strip.Color(255, 255, 255, 255), 70); //белый

}

// Заливаем точки одну за другой цветом
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(50);
  }
}

, 👍-1

Обсуждение

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


2 ответа


0

См. мой ответ здесь.

Код из этого ответа:

/*
 * 
 * Демо 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 (byte m = 100; m > 0; m--)
      {
      showColor (PIXELS, patterns [i] [0] * m, patterns [i] [1] * m, patterns [i] [2] * m);
      delay (10);
      } // конец для
    } // конец для каждого элемента массива

  } // конец цикла
,

Спасибо! так что я просто скопирую и вставлю все это, и все заработает? или мне добавить его в существующий код? я очень новичок в этом., @Dpw808

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

Чтобы использовать именно этот код, вам понадобится [моя библиотека](https://github.com/nickgammon/NeoPixels_SPI). Кроме того, контакт данных NeoPixels должен быть подключен к D11 (цифровой контакт 11) на Uno., @Nick Gammon

Этот конкретный код последовательно исчезает в показанных цветах (красный, зеленый, синий и т. д.)., @Nick Gammon

ах, мне просто нужен белый., @Dpw808

ок, @nick gammon, твоя программа работает, но все ее действия исчезают. огни вообще не движутся по кругу. я не знаю, как заставить их двигаться по кругу., @Dpw808


1

Обратите внимание, что переменная "wait" на самом деле не используется в вашей функции colorwipe.

Кажется, функция colorwipe включает их все подряд. Единственное, что вам нужно сделать, это добавить к нему затухание.

for(uint16_t i=0; i<strip.numPixels(); i++) {
    for(uint8_t brightness=0; brightness<maxBrightness; brightness++){
       strip.setPixelColor(i, strip.Color(brightness, brightness, brightness, brightness );
       strip.show();
       delay(wait);
  }
,