Помощь fastLED - требуется специальное усиление

led

Здравствуйте, мне нужна помощь, чтобы попытаться заставить fastLED запускаться и останавливаться в определенных точках на полосе, у меня есть эта хорошая анимация затухания, но мне нужно разделить полосу примерно на 3 части и запустить ее в разное время.

вот беспорядок, я приветствовал любую помощь...

#include <FastLED.h>
#define NUM_LEDS 60
#define DATA_PIN 6 //Как скучно и очевидно!
#define COLOR_ORDER GRB //Зеленый (G), Красный (R), Синий (B)
#define CHIPSET WS2812B
#define BRIGHTNESS 60
#define VOLTS 5
#define MAX_AMPS 500 //значение в миллиамперах

// Хватит ерунды!

CRGB leds[NUM_LEDS];

void setup() {
  FastLED.addLeds<CHIPSET,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setMaxPowerInVoltsAndMilliamps(VOLTS, MAX_AMPS);
  FastLED.setBrightness(BRIGHTNESS);
  FastLED.clear();
  FastLED.show(); 
}

void loop() {
  fadeToBlackBy(leds, NUM_LEDS, 4);      // Меньшее значение = более длинный хвост
  int i = (millis()/40) % NUM_LEDS;      // Как быстро это происходит.
  leds[i] = CRGB::White;
  FastLED.show();
}

Ура! Роб

, 👍0

Обсуждение

Любая идея, как я могу установить начальное и конечное положение светодиода, которые не являются полной длиной полосы? моя версия микки мауса... for(int i=40; i<strip.numPixels() -43; i++) { // Для каждого пикселя в полосе... я редактирую бит "i=40", затем "-43;", @Acewindel

Вы понимаете, что можете написать такой код? ... for(int i=start; i<end; i++), @jsotola

Хорошо, очень жаль, что впервые здесь плохо отредактировал вопрос., @Acewindel

как насчет этого https://wokwi.com/projects/362275278547275777, @jsotola


1 ответ


2

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

https://wokwi.com/projects/362275278547275777

Важно понять, что FastLED.show(); — это функция, которая отправляет содержимое массива leds[] на физический светодиод. полоса.

Это означает, что вы можете делать с массивом leds[] все, что хотите, и изменения не будут видны до тех пор, пока не будет вызвана функция show().

Вы можете вносить изменения по частям, не видя поэтапных изменений.

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


#include <FastLED.h>

#define CHIPSET     WS2812B
#define COLOR_ORDER     GRB         // Зеленый (G), Красный (R), Синий (B)
#define NUM_LEDS         95
#define DATA_PIN          3
#define BRIGHTNESS      255
#define VOLTS             5
#define MAX_AMPS        500         // значение в миллиамперах

CRGB leds[NUM_LEDS];                // основная светодиодная матрица
CRGB test[10];                      // устанавливаем отдельный массив для слияния с основным массивом светодиодов
                                    // что-то вроде спрайта
int indx = 0;

boolean tick[4] = {false, false, false, false};    // флаги таймеров обратного отсчета

unsigned long timeInterval  [4] = {10, 20, 1, 2};  // таймеры загружаются с этими значениями
unsigned long timeCounter   [4];                   // это настоящие таймеры

unsigned long previousMicros = 0;


void setup() {

  Serial.begin(115200);

  FastLED.addLeds<CHIPSET,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setMaxPowerInVoltsAndMilliamps(VOLTS, MAX_AMPS);
  FastLED.setBrightness(BRIGHTNESS);
  FastLED.clear();

  memcpy(timeCounter, timeInterval, 4 * sizeof(long));  // таймеры предварительной загрузки
}

void loop() {

  unsigned long currentMicros = micros();

  if (currentMicros - previousMicros >= 1000) {   // тик 1 мс
    for (int i = 0; i < 4; i++) {
      previousMicros = currentMicros;

      timeCounter[i]-- ;                          // отслеживать 4 временных интервала
      if (timeCounter[i] == 0) {
        timeCounter[i] = timeInterval[i];         // достиг нуля, перезагружаем счетчик и выдаем "тик"
        tick[i] = true;
      }
    }

    // участки массива leds[] затухают с разной скоростью
    // ПРИМЕЧАНИЕ: "&светодиоды[0]" и "светодиоды" оба указывают на начало массива
    fadeToBlackBy(&leds [0], 30,  3);               // длинный хвост
    fadeToBlackBy(&leds[30], 30, 10);               // середина хвоста
    fadeToBlackBy(&leds[60], 30, 20);               // короткий хвост
    fadeToBlackBy(&leds[90],  5,  1);               // очень длинный хвост

    if (tick[0]) {    // тик 10 мс
      tick[0] = false;
      leds[indx] = CRGB::White;                   // добавляем "бегущую точку" после применения затухания
      indx++;
      if (indx > (NUM_LEDS-1)) indx = 0;
    }

    if (tick[1]) {    // тик 20 мс
      tick[1] = false;

// &test[0] указывает на элемент массива напрямую
// это позволяет выбрать начальную точку для функции затухания

// fadeToBlackBy(test, 3, 16); // эти две строки одинаковы
      fadeToBlackBy(&test[0], 3, 16);               // исчезают только первые три элемента в массиве
      fadeToBlackBy(&test[3], 1, 20);               // исчезает только третий элемент в массиве

      if(test[0].r < 64){                           // пиксели достаточно выцветшие
        test[0]= CRGB(248, 11, 130);                // перезагрузить пиксели
        test[1]= CRGB(221, 245, 6);
        test[2]= CRGB(112, 16, 236);
        test[3]= CRGB(16, 236, 53);
      }
    }
    memcpy(&leds[10], test,     4 * sizeof(CRGB));    // применяем 4 пикселя к массиву leds[]
    memcpy(&leds[50], &test[0], 4 * sizeof(CRGB));    // применяем 4 пикселя к массиву leds[]
    memcpy(&leds[80], &test[1], 3 * sizeof(CRGB));    // применяем 3 пикселя к массиву leds[]

    FastLED.show();                                   // отправляем данные о пикселях на светодиодную ленту
  }
}
,