我将如何在 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 光谱”
快速编写了这段代码,使 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 光谱”