首页 > 解决方案 > 数组中的随机颜色

问题描述

是否可以为一串 LED 分配随机颜色?我有一串 10 个 WS2812 LED,它们可以是我在数组中声明的任何颜色使用 FastLed 库,颜色可以是名称。

colorLed = {Red, Blue, Green, Purple};

我想为每个单独的 LED 随机选择一种颜色,而不是只选择一种颜色的整个字符串。两个或多个 LED 具有相同的颜色不是问题。

我尝试过这样的事情:尝试为数字分配颜色,并给 LED 一个随机数。代码无法验证,无法将 int 与随机数组合(至少不是我尝试的方式)

#include "FastLED.h"
#define NUM_LEDS 10

CRGB leds[NUM_LEDS];

#define DATA_PIN 2

long randNumber;
long randNumber0 = CRGB::Red;
long randNumber1 = CRGB::White;
long randNumber2 = CRGB::Blue;
long randNumber3 = CRGB::Red;
long randNumber4 = CRGB::White;
long randNumber5 = CRGB::Blue;
long randNumber6 = CRGB::Red;
long randNumber7 = CRGB::White;
long randNumber8 = CRGB::Blue;
long randNumber9 = CRGB::Red;

#define INTERVAL_MESSAGE1 5000

unsigned long time_1 = 0;

void setup() {
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);

  Serial.begin(9600);
}

void loop() {

  if (millis() >= time_1 + INTERVAL_MESSAGE1) {
    time_1 += INTERVAL_MESSAGE1;
    leds[0] =  randNumber.random(0,9);
    leds[1] =  randNumber.random(0,9);
    leds[2] =  randNumber.random(0,9);
    leds[3] =  randNumber.random(0,9);
    leds[4] =  randNumber.random(0,9);
    leds[5] =  randNumber.random(0,9);
    leds[6] =  randNumber.random(0,9);
    leds[7] =  randNumber.random(0,9);
    leds[8] =  randNumber.random(0,9);
    leds[9] =  randNumber.random(0,9);
    FastLED.show(55);
  }


}

标签: arduino

解决方案


假设您的colorLed数组中有 4 种颜色,您可以枚举它们并执行以下操作:

# define MAX_COLORS 4    // Assuming you have 4 colors only

enum ColorList{
Red = 1,
Blue,
Green,
Purple
};

然后将它们用作结构中的数据类型(仅仅是因为我喜欢将数据划分为类和数据结构)。

我整理了以下代码。请注意,我已经在 CodeLite for C++ 上对其进行了测试,但还没有在 Arduino 上进行过测试。但是,我相信如果您根据自己的需要调整它,它会很好地工作。

/* ColoPicker.cpp*/

#include <iostream>
#include <random>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <time.h>

using namespace std;

#define MAX_COLORS 4

char textOut[100];
int cycles;

string colorNames[4] = { "RED", "BLUE", "GREEN", "PURPLE" };

typedef enum { RED, BLUE, GREEN, PURPLE } ColorList;

struct ColorsGroup {
    ColorList colorCode;
    string name;
};

ColorsGroup colorLED[4];

// Methods
int random(int, int);
ColorList retrieveColor(int);
void fillColors(void);
void printColors(int);

void setup()
{

    fillColors();

    cycles = 0;
}

int main()
{
    cout << "********** Color picker *********" << endl;

    setup();

    while(cycles < 10) {

    fillColors();

    printColors(cycles);

    cycles++;
    
    }

    return 0;
}

// From: https://stackoverflow.com/questions/7560114/random-number-c-in-some-range
int random(int min, int max)
{
    static bool first = true;

    if(first) {
    srand(time(NULL));
    first = false;
    }

    return min + rand() % ((max + 1) - min);
}

void fillColors(void)
{
    for(int idx = 0; idx < MAX_COLORS; idx++) {

    ColorList newColor = retrieveColor(random(0, MAX_COLORS - 1));

    colorLED[idx].colorCode = newColor;
    colorLED[idx].name = colorNames[newColor];
    }
}

void printColors(int i)
{
    sprintf(textOut, "%d. colorLED >> ", i);

    cout << textOut ;
    
    for(int idx = 0; idx < MAX_COLORS; idx++) {

    const char* nameStr = colorLED[idx].name.c_str(); // or &colorLED[idx].name[0];

    sprintf(textOut, "%s[%d]",  nameStr, colorLED[idx].colorCode);  
    cout << textOut;
    
    if(idx <= MAX_COLORS-2){
        sprintf(textOut, ", ");
        cout << textOut;
    }else{
        cout << ";" << endl;
    }
    
    }
}

ColorList retrieveColor(int col)
{

    switch(col) {
        
    case 0:
    return RED;
    break;
    
    case 1:
    return BLUE;
    break;
    
    case 2:
    return GREEN;
    break;
    
    case 3:
    return PURPLE;
    break;

    default:
    return RED; // for the sake of completeness
    break;
    }
}

输出如下所示:

ColorPicker 的控制台输出


推荐阅读