Помощь fastLED - требуется специальное усиление
Здравствуйте, мне нужна помощь, чтобы попытаться заставить 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();
}
Ура! Роб
@Acewindel, 👍0
Обсуждение1 ответ
Вот пример скетча, который показывает, как манипулировать данными в подразделе массива.
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(); // отправляем данные о пикселях на светодиодную ленту
}
}
- Питание светодиодной ленты - Сколько ампер?
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
- Светодиод L продолжает гореть
- Улучшенное циклическое переключение цветов RGB.
- Плавное мигание светодиодов
- Остановить мигание светодиодов
- FastLED - Как управлять определенными светодиодами
Любая идея, как я могу установить начальное и конечное положение светодиода, которые не являются полной длиной полосы? моя версия микки мауса... 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