Как обратиться к arbitray leds (WS2812B) в уже определенном массиве светодиодов?
Я хочу обратиться к первым и последним трем пикселям 9-пиксельной полосы и применить к ним градиент с помощью FastLED. Я могу успешно обратиться к ним, но отображаемые цвета неверны. Есть ли что-то, что я упускаю из виду или неправильно понимаю в том, как работает FastLED?
#include <FastLED.h>
// вся полоса
#define NUM_LEDS 9
#define LED_PIN 6
CRGB leds[NUM_LEDS];
// Определить индексы первого и последних 3 индексов 9-пиксельной полосы
int customLeds[6] = {0,1,2,6,7,8};
// My Palette
DEFINE_GRADIENT_PALETTE (heatmap) {
0, 255, 0, 0, // Red
128, 0, 255, 0, // Green
255, 0, 0, 255 // Blue
};
CRGBPalette16 myPalette1 = heatmap;
void setup() {
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(20);
}
void loop() {
for (int i = 0; i < (sizeof(customLeds)); i++) {
// Каждый светодиод i получает правильный цвет, учитывая его место в массиве - 0, 42.5, 85, 127.5, 170, 212.5, 255
leds[customLeds[i]] = ColorFromPalette(myPalette1, (i * (255 / sizeof(customLeds))), 255, LINEARBLEND);
}
FastLED.show();
}
@Dale Botha, 👍-1
Обсуждение2 ответа
WS2812B требует, чтобы все 9 светодиодов отправляли данные одновременно, вы не можете пропустить ни одного !
int customLeds[6] = {0,1,2,6,7,8};
При этом будут передаваться только данные первых 6 светодиодов.
customLeds
используется только для установки цветов в светодиодах".
FastLED.show() по-прежнему будет отправлять данные для всех 9 светодиодов, которые определены с помощью массива
leds и
NUM_LEDS`., @chrisl
Итак, вот ответ, который я придумал:
#include <FastLED.h>
// the whole strip
#define NUM_LEDS 9
#define LED_PIN 6
CRGB leds[NUM_LEDS];
// Define the indexes of the first and last 3 indexes of a 9 pixel strip
bool customLeds[9] = {1, 1, 1, 0, 0, 0, 1, 1, 1};
int customLeds_num = 6;
// My Palette
DEFINE_GRADIENT_PALETTE (heatmap) {
0, 255, 0, 0, // Red
128, 0, 255, 0, // Green
255, 0, 0, 255 // Blue
};
CRGBPalette16 myPalette1 = heatmap;
void setup() {
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(5);
}
void loop() {
FastLED.clear();
// Keep track of how many leds have been lit
int customLedIndex1 = 0;
for (int i = 0; i < NUM_LEDS; i++) {
// Each i led get the correct color given their place in the array - 0, 42.5, 85, 127.5, 170, 212.5, 255
//lights a specific pixel only if it's in the customLeds truth table
if (customLeds[i]) {
// works out where on the gradient a specific pixel is
leds[i] = ColorFromPalette(myPalette1, (customLedIndex1 * (255 / 5)), 255, LINEARBLEND);
//increments the index for the next pixels value on the gradient
customLedIndex1++;
}
}
FastLED.show();
customLedIndex1 = 0;
}
Решение включало использование логического массива, который указывал, какие светодиоды должны быть включены (true / 1), а какие выключены (false / 0), а затем создавал отдельный индекс (customLedIndex), который подсчитывал, сколько светодиодов было зажжено, чтобы они могли получить правильный цвет, соответствующий их "месту" в системе. палитра
- Можно ли сделать FastLED быстрее?
- Переключение с одного цвета на другой
- Arduino для запуска и светодиодная лента длиной до 100 м
- Arduino Uno R3, WS2812B, 1 полоса из 60 светодиодов, разделенная на 4
- Источник питания WS2812B
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
Sizeof дает не количество элементов, а объем памяти, используемой массивом .., @Majenko
что это значит? ...
отображаемые цвета неверны
, @jsotolaЦвета пикселей должны следовать за палитрой, но в то время как они являются цветами из палитры, они правы ... они находятся по всему градиенту и не складываются линейно., @Dale Botha
Я понял свою проблему...это:(i * (255 / sizeof(customLeds)) - не работает, потому что два массива имеют разную длину! Я нахожусь в поисках решения., @Dale Botha
Пожалуйста, замените
sizeof(customLeds)
наsizeof(customLeds)/sizeof(customLeds[0])
, чтобы фактически получить количество элементов в массиве вместо количества байтов., @chrislДа, чуть более элегантное решение. Я просто жестко закодировал общую сумму для удобства использования. Позже в проекте я планирую использовать это. Но, учитывая мое решение ниже, этот метод становится спорным, поскольку я использую логический массив общей длины. Отсюда мое использование жестко закодированного итога и переменной инкремента. Спасибо @chrisl, @Dale Botha