arduino - 数组中的随机颜色
问题描述
是否可以为一串 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);
}
}
解决方案
假设您的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;
}
}
输出如下所示:
推荐阅读
- php - 生成 GTM 脚本的 PHP cronjob
- javascript - Python 数据无法在 JavaScript 传单地图中正确加载
- php - 如何使用 laravel where 子句?
- magento - Magento 2 Rest api:无法下订单。出错
- php - laravel 中是否有类似 yii2 的调试?
- angular - 点击链接的http get请求在角度2中给出错误
- ios - 我们可以在 ios swift 的 indexpath 的 didSelectRow 中异步调用 api
- android - 使图形可点击而不是在地图中创建新图形
- c# - ElasticSearch 或 Fsharp 因此错误而崩溃
- bash - 每次输入 kubectl --all-namespaces 的快捷方式