Изменение цвета (угачание, fade) Arduino

Я делаю забавный проект светодиодной рождественской елки, используя этот код:

// Source location \\adam\U_DRIVE\_BACKED_UP\_Documents\Electronics\XmasTree
#include <FastLED.h>
#define NUM_LEDS 102
#define DATA_PIN 6
CRGB leds[NUM_LEDS];
void setup() {
  Serial.begin(9600);
  Serial.println("Boot");
  // put your setup code here, to run once:
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);

  //  SetRandomLight;
  SetAllOff();
  delay(10); //Delay before getting going.
  BootUp();
  randomSeed(analogRead(0) + analogRead(1) + analogRead(2) + analogRead(3) + analogRead(4) + analogRead(5) + analogRead(6));
}

void loop() {
  // put your main code here, to run repeatedly:
  SingleDrift();
  FastLED.show();
  //delay(random(50));
}

void FadeAll(int x)
{
  for (int i = 0; i < NUM_LEDS; i++)
  {
    leds[i].subtractFromRGB(x);
  }
}

void SetRandomLight() {
  for (int i = 0; i < NUM_LEDS; i++)
  {
    leds[i].r = random(128);
    leds[i].g = random(128);
    leds[i].b = random(128);
    Serial.println(i);
  }
}

void SetAllOff()
{
  Serial.println("Blanking all.");
  for (int i = 0; i < NUM_LEDS; i++)
  {
    leds[i] = 0x000000;
    leds[i].r = 0;
    leds[i].g = 0;
    leds[i].b = 0;

    //Serial.println(i);
  }
  FastLED.show();
}

void SingleDrift() {
  int mini = 5;
  int maxi = 255;
  FastLED.setBrightness(maxi);
  for (int i = 0; i < NUM_LEDS; i++)
  {
    if (leds[i].r > 64) leds[i].r = leds[i].r - 8;
    if (leds[i].g > 64) leds[i].g = leds[i].g - 8;
    if (leds[i].b > 64) leds[i].b = leds[i].b - 8;

    int rnd = random(10);
    if (rnd == 1 && leds[i].r >= 2) leds[i].r = leds[i].r - 1;
    if (rnd == 2 && leds[i].g >= 2) leds[i].g = leds[i].g - 1;
    if (rnd == 3 && leds[i].b >= 2) leds[i].b = leds[i].b - 1;
    if (rnd == 4) leds[i].fadeToBlackBy(2);
    if (rnd == 5) leds[i].g++;
    //if (rnd == 6 && leds[i].g < 240) leds[i].g = leds[i].g + 1;
    //if (rnd == 7 && leds[i].b < 240) leds[i].b = leds[i].b + 1;
    if (leds[i].g < 2) leds[i].g = 2;
  }

  int i = random(NUM_LEDS);
  Serial.println(i);
  if (leds[i].r + leds[i].g + leds[i].b > 10) return; //If the LED is still bright, do not change it.
  if (random(100) > 80)
  {
    //Choose a colour
    int r = random(20);
    switch (r)
    {
      case 99:
        for (i = 0; i < NUM_LEDS; i++)
        {
          int x = leds[i].r;
          leds[i].r = leds[i].b;
          leds[i].b = x;
        }

      case 1:
      case 2:
      case 3:
        leds[i] = CRGB::Red;
        break;
      case 4:
      case 5:
      case 6:
        leds[i] = CRGB::Green;
        break;
      case 7:
        leds[i] = CRGB::Blue;
        break;
      case 8:
        leds[i].r = random(128, 255);
        leds[i].g = random(128, 255);
        leds[i].b = random(128, 255);
      case 9:
        leds[i] = CRGB::Yellow;
        break;
      case 10:
        leds[i] = CRGB::Crimson;
        break;
      case 12:
        leds[i] = CRGB::Aqua;
        break;
      case 13:
        leds[i] = CRGB::BlueViolet;
        break;
      case 14:
        leds[i] = CRGB::MidnightBlue;
        break;
      case 15:
        leds[i].setRGB( 255, 255, 255);
        break;
    }
  }
}

void BootUp()
{
  for (int i = 0; i < NUM_LEDS; i++)
  {
    leds[i].b = map(i, 0, NUM_LEDS, 0, 255);
    leds[i].r = map(i, NUM_LEDS, 0, 0, 255);
  }
  for (int pc = 0; pc < 100; pc++)
  {
    FastLED.setBrightness(pc);
    FastLED.show();
    delay(3);
  }
  for (int i = 0; i < NUM_LEDS; i++)
  {
    leds[i] = -leds[i];
    FastLED.show();
    delay(10);
  }

  for (int i = 0; i < NUM_LEDS; i++)
  {
    leds[i].setRGB( 0, 10, 0);

    FastLED.show();
    delay(10);
  }
}

В настоящее время светодиодный цикл каждый раз становится зеленым, поэтому я хотел бы добавить разные цветовые затухания. Тем не менее, я не мог понять, как изменить цвет/время после того, как покопался вокруг. Не мог бы кто-нибудь указать мне правильное направление для того, какие изменения в коде мне нужно внести?

, 👍-1

Обсуждение

почему бы вам не посмотреть пример кода в библиотеке FastLED? ... вы должны быть в состоянии найти его в примерах скетчей в arduino IDE, @jsotola


2 ответа


0

Я думаю, линия 84, в которой светодиоды остаются зелеными, а не становятся черными. Я думаю, что строка 81 предназначена для создания какого-то эффекта мерцания на некоторых зеленых светодиодах и для того, чтобы цвет стал немного более зеленым. Поэтому я их удалил. Чтобы светодиоды не стали черными вместо зеленых, я добавил оператор if, который прекращает дальнейшее выцветание, если общая "яркость" составляет 16 или меньше. Я понятия не имею, как это будет выглядеть. Возможно, вам придется немного изменить это 16-значное значение.

Это лучшее, что я мог сделать без полной переписки кода.

void SingleDrift() {
  int mini = 5;
  int maxi = 255;
  FastLED.setBrightness(maxi);
  for (int i = 0; i < NUM_LEDS; i++)
  {
    if (leds[i].r > 64) leds[i].r = leds[i].r - 8;
    if (leds[i].g > 64) leds[i].g = leds[i].g - 8;
    if (leds[i].b > 64) leds[i].b = leds[i].b - 8;

    if ( (leds[i].r + leds[i].g + leds[i].b) > 16) // не допускайте выцветания в черный цвет
    {
      int rnd = random(10);
      if (rnd == 1 && leds[i].r >= 2) leds[i].r = leds[i].r - 1;
      if (rnd == 2 && leds[i].g >= 2) leds[i].g = leds[i].g - 1;
      if (rnd == 3 && leds[i].b >= 2) leds[i].b = leds[i].b - 1;
      if (rnd == 4) leds[i].fadeToBlackBy(2);
      //if (rnd == 5) leds[i].g++;
      //if (rnd == 6 && leds[i].g < 240) leds[i].g = leds[i].g + 1;
      //if (rnd == 7 && leds[i].b < 240) leds[i].b = leds[i].b + 1;
      //if (leds[i].g < 2) leds[i].g = 2; // I think this line kept the leds green
    }
  }
  ...
,

0

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

На моем месте я бы выбросил этот код и начал бы с кода, который делает какую-то другую анимацию. Ты ничего не сломаешь, так что играй.

Что касается кода, который вы опубликовали:

Мне кажется, что первый цикл for, который проходит через все светодиоды, настроен на то, чтобы сначала уменьшить яркость всех светодиодов до 0 на 8, пока их значение > 64.>

После глобального затухания он затем использует случайное число 0-9, чтобы решить, что делать дальше для каждого светодиода.

  1. Если случайное значение равно 1, 2 или 3, это уменьшает красные, зеленые или синие каналы на 1.
  2. Если случайное значение равно 4, это приводит к тому, что индикатор тока становится черным.
  3. Если случайное значение равно 5, это увеличивает зеленый канал индикатора тока на 1. наконец, он возвращает зеленый канал текущего светодиода к 2, если он опускается ниже 2. Это означает, что каждый светодиод будет мигать тусклым зеленым цветом, если только следующий раздел не изменит цвет этого светодиода на что-то другое.

Я добавил "**это" комментарии к строкам, которые приводят светодиоды в зеленый цвет.

  for (int i = 0; i < NUM_LEDS; i++)
  {
    if (leds[i].r > 64) leds[i].r = leds[i].r - 8;
    if (leds[i].g > 64) leds[i].g = leds[i].g - 8;
    if (leds[i].b > 64) leds[i].b = leds[i].b - 8;

    int rnd = random(10);
    if (rnd == 1 && leds[i].r >= 2) leds[i].r = leds[i].r - 1;
    if (rnd == 2 && leds[i].g >= 2) leds[i].g = leds[i].g - 1;
    if (rnd == 3 && leds[i].b >= 2) leds[i].b = leds[i].b - 1;
    if (rnd == 4) leds[i].fadeToBlackBy(2);
    if (rnd == 5) leds[i].g++;  //**Это приведет к тому, что этот светодиод будет мигать зеленым.
    //if (rnd == 6 && leds[i].g < 240) leds[i].g = leds[i].g + 1;
    //if (rnd == 7 && leds[i].b < 240) leds[i].b = leds[i].b + 1;
    if (leds[i].g < 2) leds[i].g = 2; //**This will make each LED stop at dim green.
  }

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

  for (int i = 0; i < NUM_LEDS; i++)
  {
    if (leds[i].r > 64) leds[i].r = leds[i].r - 8;
    if (leds[i].g > 64) leds[i].g = leds[i].g - 8;
    if (leds[i].b > 64) leds[i].b = leds[i].b - 8;

    int rnd = random(11);
    if (rnd == 1 && leds[i].r >= 2) leds[i].r = leds[i].r - 1;
    if (rnd == 2 && leds[i].g >= 2) leds[i].g = leds[i].g - 1;
    if (rnd == 3 && leds[i].b >= 2) leds[i].b = leds[i].b - 1;
    if (rnd == 4) leds[i].fadeToBlackBy(2);

    if (rnd == 5) leds[i].g++;  //**Это приведет к тому, что этот светодиод будет мигать зеленым.
    if (rnd == 6) leds[i].r++;  //**Это приведет к тому, что этот светодиод будет мигать красным.
    if (rnd == 7) leds[i].b++;  //**Это приведет к тому, что этот светодиод будет мигать синим.
    if (rnd == 8) && (leds[i].g < 2) leds[i].g = 2; //**Это заставит светодиод потускнеть зеленым
    if (rnd == 9) && (leds[i].r < 2) leds[i].r = 2; //**Это заставит светодиод потускнеть красным
    if (rnd == 10) && (leds[i].b < 2) leds[i].b = 2; //**Это заставит светодиод потускнеть синим
  }

Затем он выбирает один случайный светодиод, и в 20% случаев делает больше случайных изменений цвета этого светодиода, если он достаточно тусклый. Он использует случайное значение от 0-19, чтобы решить, что делать в следующей инструкции switch. Первый случай-это случай 99:, который никогда не может выполняться, потому что случайное значение никогда не будет больше 19. Для других значений это заставляет быть яркий основной цвет, или, может быть, белый, или, может быть, цвет со случайными значениями RGB в диапазоне от 128 до 255.

,