Fade In/Fade Out с несколькими светодиодными лентами
Я хочу создать приложение со светодиодной полосой (Fade In/Fade Out). Каждая полоса имеет 48 пикселей. Одна из полос должна быть красной, а другая синей. Используя цикл for, мне удалось постепенно исчезает небольшое количество полос (например, 10). Но когда я постепенно увеличиваю/угасаю все 48 светодиодов, код ведет себя так, как будто есть «задержка». Я думаю, это потому, что в файле for много данных. loop.Есть ли способ постепенного появления/исчезновения без использования цикла for?
#include "FastLED.h"
#define NUM_LEDS_PER_STRIP 48
CRGB redLeds[NUM_LEDS_PER_STRIP];
CRGB blueLeds[NUM_LEDS_PER_STRIP];
void setup() {
FastLED.addLeds<NEOPIXEL, 6>(redLeds, NUM_LEDS_PER_STRIP);
FastLED.addLeds<NEOPIXEL, 7>(blueLeds, NUM_LEDS_PER_STRIP);
FastLED.setBrightness(0);
}
void loop() {
// исчезать
for(int i=0;i<256;i=i+5) {
for(int j=0;j<NUM_LEDS_PER_STRIP;j++) {
FastLED.setBrightness(i);
redLeds[j] = CRGB(255,0,0);
blueLeds[j] = CRGB(0,0,255);
FastLED.show();
}}
//исчезать
for(int i=255;i>=0;i=i-5) {
for(int j=0;j<NUM_LEDS_PER_STRIP;j++) {
FastLED.setBrightness(i);
redLeds[j] = CRGB(255,0,0);
blueLeds[j] = CRGB(0,0,255);
FastLED.show();
}}
}
@bopele, 👍0
2 ответа
Каждое изменение яркости требует отправки 48 светодиодов x 3 байта на полосу, = 144 байта = 1152 бита данных. Для каждого бита требуется 2,5 мкс данных, поэтому минимум 2,88 мс при скорости передачи данных 400 кГц. Я не знаю, какую скорость использует FastLED.h, может быть до 800 кГц. Сколько полос? 2? Так что удвойте это.
Каждая строка требует отправки всех своих данных при изменении любого одного светодиода, поэтому вы можете изменить 1 светодиод и оставить 143 в покое, все данные все равно будут отправлены. Именно так работают адресные полосы.
CrossRoads уже указал вероятную причину задержки (поэтому проголосовали за).
Один из способов решить эту проблему — использовать один микроконтроллер (подчиненный) для каждой цепочки светодиодов и разделить нагрузку, а также использовать один микроконтроллер в качестве ведущего:
- Используйте протокол быстрой связи между вашим текущим MCU (главным) и ведомыми (предпочтительно маленькими/дешевыми, такими как Arduino Mini/Micro), например, SPI, который легко использовать для связи.
- Чтобы убедиться, что все они запускаются одновременно, вы можете сначала отправить все данные (SPI), а в конце, после отправки всех данных всем ведомым устройствам, установить на ведущем устройстве высокий уровень GPIO, при котором все ведомые устройства будут слушать, зная, что они должны начать отправку.
- SPI работает очень быстро, но если вы хотите сэкономить время связи, вы можете сделать несколько интеллектуальных команд (например, отправить команду для сброса группы байтов или изменить группу байтов на определенное значение и т. д.). В зависимости от того, какие команды вы хотите, может потребоваться хранить данные всех светодиодных лент на вашем Arduino, что может стоить немалых денег (см. ответ CrossRoads).
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Тайм-аут связи Arduino Mega с ошибкой программатора
Спасибо за совет, но я не знаю, что вы подразумеваете под "оставить 143 в покое". Как сделать так, чтобы 143 светодиод оставил в покое с кодом?, @bopele
@bopole 143: количество байтов для одного светодиода, которое вы НЕ хотите изменять (48 светодиодов * 3 байта на полосу = 144 байта, 1 вы хотите изменить, остальные (143) нет)., @Michel Keijzers
Скажем, у вас был только 1 светодиод. Теперь вы хотите заменить 1 светодиод, а остальные 2 оставить как есть. Вы должны отправить 1 новое значение и повторно отправить 2 неизмененных значения. Именно так работают такие микросхемы, как WS2812B и другие, используемые в адресных лентах. Расширение до 48 светодиодов. Один байт изменяется, вы отправляете это новое значение и повторно отправляете неизмененные значения для всего остального., @CrossRoads