1

我有一个 60 个 LED 的 LED 灯条(WS2812B)。我有以下代码,它在条带的开头点亮一个 LED 并将其发送到末端,一旦它到达末端,它就会“反弹”并沿着条带返回到开始处。

我想要做的是让 LED 灯条的两端都亮起一个 LED 灯,后面有一条小轨迹,然后这些 LED 沿着灯条向下移动到相对的两端,并在它们相遇时交叉。

我试图弄清楚如何一次运行两行代码,因为目前它以一种方式发送灯,然后运行其他代码。任何帮助,将不胜感激

以下是我到目前为止的代码。

#include "FastLED.h"

// How many leds in your strip?
#define NUM_LEDS 57

// For led chips like Neopixels, which have a data line, ground, and power, you just
// need to define DATA_PIN.  For led chipsets that are SPI based (four wires - data, clock,
// ground, and power), like the LPD8806, define both DATA_PIN and CLOCK_PIN
#define DATA_PIN 4
#define CLOCK_PIN 13

// Define the array of leds
CRGB leds[NUM_LEDS];
int end_led = 55;
void setup() { 
    FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
}

void loop() { 

    // First slide the led in one direction
    for(int i = 0; i < NUM_LEDS; i++) {
        // Set the i'th led to
        leds[i] = CRGB::Red;
        // Show the leds
        FastLED.show();
        // now that we've shown the leds, reset the i'th led to black
        leds[i] = CRGB::Black;
        // Wait a little bit before we loop around and do it again
        delay(30);
    }

    // Now go in the other direction.  
    for(int i = NUM_LEDS-1; i >= 0; i--) {
        // Set the i'th led to red 
        leds[i] = CRGB::Red;
        // Show the leds
        FastLED.show();
        // now that we've shown the leds, reset the i'th led to black
        leds[i] = CRGB::Black;
        // Wait a little bit before we loop around and do it again
        delay(30);
    }

}

4

2 回答 2

2

当然,这个线程已经超过 2 年了,但是当我遇到它时,我正在做其他事情,但我相信这会让你得到你想要的:

为条带中的第一个 LED 设置一个变量

var startPos = 0;

指定尾巴的长度

var tailLength = 5;

然后在你的循环中

function loop() {
for (var i=0; i<strip.numPixels(); i++){
//set all to black
strip.setPixelColor(i,0,0,0,0);
}

//creates the tail first, to keep main pixel from being overwritten on overlap
for (var j=tailLength;j>=1;j--){
    strip.setPixelColor(startPos-j, 255,0,0,255-((255/tailLength)*j));
    strip.setPixelColor(strip.numPixels()-startPos+j, 255,0,0,255-((255/tailLength)*j));
}   

strip.setPixelColor(startPos, 255,0,0,255);
strip.setPixelColor(strip.numPixels()-startPos,255,0,0,255);
FastLED.show();
startPos++;

if(startPos>=StripNum+tailLength) startPos = 0;
delay(30);
}

这会在主像素后面创建一个逐渐消失的故事(通过亮度)。这可能会进一步简化,但应该有利于人类可读性。

于 2016-11-29T21:33:04.940 回答
1

这是未经测试的代码 - 使用风险自负。这个想法是合并两个循环,以便在每次迭代的两端都有一个循环。这需要更改远端的索引导致使用LEDS-1-i而不是i.

要留下痕迹,您必须更改每次迭代时关闭哪个 LED,留下位移。我不确切知道当小径交叉时您想要发生什么,所以我没有尝试对其进行编码。

for(int i = 0; i < NUM_LEDS; i++) {
    // Set the i'th led from start
    leds[i] = CRGB::Red;
    // Set the i'th led from end
    leds[NUM_LEDS - 1 - i] = CRGB::Red;
    // Show the leds
    FastLED.show();
    // now that we've shown the leds, reset the i'th led to black
    leds[i] = CRGB::Black;
    leds[NUM_LEDS - 1 - i] = CRGB::Red;
    // Wait a little bit before we loop around and do it again
    delay(30);
}
于 2014-05-19T03:29:04.120 回答