我将如何在 Arduino 代码中优化这些 for 循环?

How would I optimize these for loops in Arduino code?

快速编写了这段代码,使 RGB LED 淡出整个 RGB 光谱(我认为),想知道是否有一种更有效的方法来对主循环中的所有内容进行编码?好像太复杂了。

(顺便说一句,我知道当我改变亮度时速度会改变。)

int redPin = 9;
int greenPin = 10;
int bluePin = 11;

int brightness = 255;
int fadeSpeed = 25;

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  
  for (int i=0; i<brightness; i++) {
    analogWrite(redPin, i);
    delay(fadeSpeed);
  }
}

void loop() {
  for (int i=0; i<brightness; i++) {
    analogWrite(greenPin, i);
    delay(fadeSpeed);
  }
  for (int i=0; i<brightness; i++) {
    analogWrite(redPin, brightness - i);
    delay(fadeSpeed);
  }
  for (int i=0; i<brightness; i++) {
    analogWrite(bluePin, i);
    delay(fadeSpeed);
  }
  for (int i=0; i<brightness; i++) {
    analogWrite(greenPin, brightness - i);
    delay(fadeSpeed);
  }
  for (int i=0; i<brightness; i++) {
    analogWrite(redPin, i);
    delay(fadeSpeed);
  }
  for (int i=0; i<brightness; i++) {
    analogWrite(bluePin, brightness - i);
    delay(fadeSpeed);
  }
}

对于你正在做的事情,一堆循环就可以了。您也许可以构建 table 颜色并在它们之间进行插值,或者将公共部分组合到一个您调用的例程中……定义当前的 r、g、b 值,并创建例程 setleds(r, g, b)。您的每个循环只会调整一种颜色并调用通用例程。它具有将特定于硬件的部分从特定于控制的决策中移开的良好效果。 (更新引脚与计算 rgb 值)。但也许这并不重要。

请注意,由于您的所有延迟,loop() 不会经常 运行,如果您以后需要它们,这可能会影响串行读取。

另一个问题是您要更改 RGB,但要制作彩虹,我们需要 HSV - 色调饱和度值。有很多人有例子。这是一个:https://eduardofv.com/2011/01/15/arduino-rgb-led-hsv-color-wheel/

我会把他的例子更进一步,去掉循环中的循环。跟踪当前色调,并在每次调用 loop 时碰撞它,并更新 LED。当您达到 360 度时环绕。此外,这将使反转方向或随机扫过颜色变得更容易。

喂!玩得开心!

如果只是为了尽量减少重复的相似代码行,可以定义任意多的函数,定义参数方便:

void loop() {
   fadeUp(greenPin);
   fadeUp(redPin);
   fadeUp(bluePin);
   fadeDn(greenPin);
   fadeDn(redPin);
   fadeDn(bluePin);
}

void fadeUp(byte pin) {
   fade(pin, 0, brightness, +1);
}
void fadeDn(byte pin) {
   fade(pin, brightness, 0, -1);
}

void fade(byte pin, byte start, byte end, byte delta) {
   for (byte i=start; i!=end; i+=delta) {
       analogWrite(pin, i);
       delay(fadeSpeed);
   }
}

顺便说一句:您的解决方案没有涵盖“整个 RGB 光谱”