我想控制三个RGB LED的颜色(总共有9个LED)以及是否打开或关闭。我正在将Arduino与PlatformIO和FastLED库一起使用,以使用FastLED.show();。
打开它们。我的显示屏上有六个按钮:LED1,LED2,LED3,红色,绿色,蓝色(双状态按钮)给我
true按下时和
[false发行时
void bt0PopCallback(void *ptr){uint32_t dual_state; NexDSButton *btn = (NexDSButton *)ptr; bt0.getValue(&dual_state); if(dual_state){ LED1 = true; } else{ LED1 = false; } }
void bt1PopCallback(void *ptr){uint32_t dual_state; NexDSButton *btn = (NexDSButton *)ptr; bt1.getValue(&dual_state); if(dual_state){ LED2 = true; } else{ LED2 = false; } }
void bt2PopCallback(void *ptr){uint32_t dual_state; NexDSButton *btn = (NexDSButton *)ptr; bt2.getValue(&dual_state); if(dual_state){ LED3 = true; } else{ LED3 = false; } }
按下LED1按钮时例如:LED1 = true,当释放按钮时<< LED1 = false。
如果LED1 =真,RED =真,则该指示灯将变为红色。当释放红色并按下绿色时,LED1现在变为绿色。如果释放LED1并按下LED2,则LED1熄灭,LED2呈绿色点亮。我想到了这个:
if(BLUE == true){BLUEV = 255;} else { BLUEV = 0;}
if(RED == true){REDV = 255;} else { REDV = 0;}
if(GREEN == true){GREENV = 255;} else { GREENV = 0;}
if(LED1 == true){leds[0] = CRGB(REDV, GREENV, BLUEV); } else { leds[0] = CRGB(0, 0, 0); }
if(LED2 == true){leds[1] = CRGB(REDV, GREENV, BLUEV); } else { leds[1] = CRGB(0, 0, 0); }
if(LED3 == true){leds[2] = CRGB(REDV, GREENV, BLUEV); } else { leds[2] = CRGB(0, 0, 0); }
FastLED.show();
但是我认为这显然是不完美的。任何人都有建议如何对其进行更好的编码?也许使用开关盒?
干杯!
void bt0PopCallback( void* ptr )
{
uint32_t dual_state;
NexDSButton* btn = (NexDSButton*) ptr;
bt0.getValue( &dual_state );
LED1 = dual_state; // direct assignment
}
对于颜色代码中的其他if-else
变体,您可以使用三元运算符?:
像这样来清除内容:
BLUEV = BLUE ? 255 : 0;
REDV = RED ? 255 : 0;
GREENV = GREEN ? 255 : 0;
并且,要设置leds
数组的值,请使用for
循环。可以使用LED1
将LED2
,LED3
和std::array
分组,以便在循环中使用std::array
的相应值。这里是
leds
的示例:std::array
#include <array> const std::array<decltype(LED1), NUM_LEDS> LED { LED1, LED2, LED3 }; for ( int i = 0; i < NUM_LEDS; ++i ) // loop to set the colors of LEDs { leds[i] = LED[i] ? CRGB(REDV, GREENV, BLUEV) : CRGB(0, 0, 0); }
表示NUM_LEDS
数组的大小,即:
leds