FastLED - Как управлять определенными светодиодами

led

Я, к сожалению, новичок в Arduino и FastLED. Я нашел хороший эскиз, который почти идеально соответствует моим потребностям.

Только одна проблема:

Я не хочу, чтобы в Sketch ВСЕ светодиоды были одного цвета.
Я хочу, чтобы некоторые светодиоды были красными (например, светодиоды 0–4), некоторые зелеными, а другие синими.

Все они могут иметь одинаковый эффект и время, но было бы здорово, если бы я мог немного их рассинхронизировать.

Но было бы здорово иметь возможность делать разные светодиоды разного цвета. Вот эскиз «Пульс» или «Дыхание», который я хочу использовать.

    #include <FastLED.h>

    #define NUM_LEDS 37
    #define DATA_PIN 11
    #define CLK_PIN 13

    CRGB leds[NUM_LEDS];

    int fadeAmount = 5;  // Установите величину затухания. Обычно я делаю 5, 10, 15, 20, 25 и т. д., вплоть до 255.
    int brightness = 0; 

    void setup()
    {
      FastLED.addLeds<APA102, DATA_PIN, CLK_PIN, BGR>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
      FastLED.setBrightness(50);
    }

    void loop()
    { 
       for(int i = 0; i < NUM_LEDS; i++ )
       {
       leds[i].setRGB(0,255,250);  // Установите цвет ЗДЕСЬ!!!
       leds[i].fadeLightBy(brightness);
      }
      FastLED.show();
      brightness = brightness + fadeAmount;
      // инвертируем направление затухания на концах затухания:
      if(brightness == 0 || brightness == 255)
      {
        fadeAmount = -fadeAmount ; 
      }    
      delay(80);  // Эта задержка устанавливает скорость затухания. Обычно я делаю от 5 до 75, но вы всегда можете подняться выше.
    }

, 👍0


1 ответ


Лучший ответ:

3

Цвета светодиодов в вашем эскизе задаются в этом цикле:

for(int i = 0; i < NUM_LEDS; i++ )
{
    leds[i].setRGB(0,255,250);  // Установите цвет ЗДЕСЬ!!!
    leds[i].fadeLightBy(brightness);
}

Вы перебираете все светодиоды и устанавливаете для них определенный цвет и яркость. Изменения будут отправлены светодиодам, когда вы впоследствии вызовете FastLED.show(). Никто не мешает вам установить разный цвет для каждого светодиода или изменить значение только для некоторых светодиодов.

Например, чтобы зажечь первые 5 светодиодов красным цветом, следующие 10 - зеленым, а остальные оставить такими, какими они были раньше, вы можете использовать этот код (просто замените его циклом for) :

for(int i=0;i<5;i++){
    leds[i].setRGB(255,0,0);
    leds[i].fadeLightBy(brightness);
}
for(int i=5;i<15;i++){
    leds[i].setRGB(0,255,0);
    leds[i].fadeLightBy(brightness);
}
FastLED.show();

Принцип заключается в том, что у вас есть массив значений цветов. Каждое значение состоит из трех меньших значений для красного, зеленого и синего (RGB) (Цвет определяется распределением между красным, зеленым и синим ; яркость определяется общим уровнем красного, зеленого и синего). И каждое значение массива привязано к светодиоду (первое значение — к первому светодиоду, второе значение — ко второму светодиоду,...). Вы можете изменить значения цветов в массиве по своему усмотрению. А если вы хотите, чтобы светодиоды отображали текущие значения в массиве, вы отправляете их с помощью FastLED.show(). Это означает, что вам придется вызывать эту функцию каждый раз, когда вы хотите, чтобы светодиоды менялись. Чтобы это работало, вам не обязательно менять каждое значение в массиве.

Если вы хотите создать асинхронное изменение цветов, вы можете отказаться от delay(80) и использовать неблокирующий код, как в примере BlinkWithoutDelay Ардуино IDE. Здесь вы используете функцию millis() в качестве часов (она возвращает миллисекунды с момента запуска Arduino). Вы берете временную метку вначале и сравниваете разницу между ней и текущим временем:

unsigned long timestamp=0;
unsigned long interval=80; //интервал 80 миллисекунд

void loop(){
    unsigned long current_time=millis();
    if(current_time - timestamp > interval){
        // делаем что-то здесь, например устанавливаем цвета светодиодов
        timestamp = current_time;
        // не забудьте FastLED.show() для вывода цветов
    }
}

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

,

Привет, вау! Я просто поражен тем, как хорошо вы мне все это объяснили и показали! Отлично! Я обязательно попробую это, когда буду дома с работы и оставлю отзыв. Большое спасибо !, @tranceonline

ВАУ, это сработало идеально! Еще раз: Спасибо большое!!!, @tranceonline