C++ 在Arduino做一个更好的循环

C++ 在Arduino做一个更好的循环,c++,c,loops,arduino,C++,C,Loops,Arduino,我已经用Arduino编写了3个LED彩灯循环的代码,但它似乎(代码)容易出现错误,所以我正在尝试一种新的编写方法。由于复杂性,我将坚持使用phesdo代码来完成我要做的事情。这是: If (red LED isn't max and green LED is 0 and blue LED is 0) {inc red LED; update dot matrix} If (red LED is max and green LED isn't max and blue LED is 0)

我已经用Arduino编写了3个LED彩灯循环的代码,但它似乎(代码)容易出现错误,所以我正在尝试一种新的编写方法。由于复杂性,我将坚持使用phesdo代码来完成我要做的事情。这是:

If (red LED isn't max and green LED is 0 and blue LED is 0)
  {inc red LED; update dot matrix}
If (red LED is max and green LED isn't max and blue LED is 0)
  {inc green LED; update dot matrix}
If ((red LED is/has-been max but not 0 ) and green LED is max and blue LED is 0)
  {dec red; update dot matrix}
If (red LED is 0 and green LED is max and blue LED isn't max)
  {inc blue; update dot matrix}
If (red LED is 0 and (green LED is/has-been max but not 0) and blue LED is max)
  {dec green; update dot matrix}
If (red LED isn't Max and green LED is 0 and blue is Max )
  {inc red; update dot matrix}
If (red LED is Max and green LED is 0 and (blue LED is/has-been Max but not 0))
  {dec blue; update dot matrix}

Update LED Driver;
注意:对于视觉来说,它是一个颜色轮,红色->橙色->绿色->青色->蓝色->粉色->重复


需要注意的是,所有这些都在一个循环中,该循环在退出获取其他数据之前只运行一次。然后,它必须返回到这个循环,并记住它离开的颜色位置。另一方面,将所有这些都封装在for循环中并以线性方式执行是非常容易的。因为它必须inc或dec一种颜色,如果你愿意,了解它的颜色位置,更新led驱动程序,然后返回inc或dec,记住它停止的位置。那么,除了复杂的if语句风格之外,还有谁有更好的代码方法,伪风格,我可以使用。

是的,这不太好。。。我会做一些像

typedef struct{ //maybe stick this in a union, depending on what the compiler does to it.
    unsigned char r:2;
    unsigned char g:2;
    unsigned char b:2;
}color;
const int numOfColors = 3;
color colors[numOfColors] = {
    {2,0,0},//r
    {1,1,0},//o
    {0,2,0}//g
};

for(int i = 0 ; 1 ; i++)
{
    color c = colors[i%numOfColors];
    //set color
    //update
    //wait
}

是的,那不太好。。。我会做一些像

typedef struct{ //maybe stick this in a union, depending on what the compiler does to it.
    unsigned char r:2;
    unsigned char g:2;
    unsigned char b:2;
}color;
const int numOfColors = 3;
color colors[numOfColors] = {
    {2,0,0},//r
    {1,1,0},//o
    {0,2,0}//g
};

for(int i = 0 ; 1 ; i++)
{
    color c = colors[i%numOfColors];
    //set color
    //update
    //wait
}

至少当我阅读你的
if
语句时,你有7种不同的状态(也许应该是8?),当你到达最后一种状态时,它会回到第一种状态


这很容易实现为一个计数器,它有一个小的查找表,可以从一个状态号映射到一个状态,LED应该点亮。

至少当我读到你的
if
语句时,你有7个不同的状态(可能应该是8?),当你到达最后一个时,它会回到第一个


这很容易实现为一个计数器,带有一个小的查找表,从一个状态号映射到一个状态,LED应该点亮。

通过简单的情况图,您可以找到一个公式,根据您在每个刻度上递增的全局计数器,将强度直接应用于单个组件,代码如下(我刚刚编写了它,还没有测试,但应该足以让您了解它是如何工作的):

int计数器=0;//计数器,您应该在每个刻度上递增
整数相位=6;//循环中的总相位
int cyclelelength=最大步长*相位;//一个周期内的总滴答声
int currentStepOfCycle=计数器%cycleLength;
int currentPhase=循环的当前步数/最大步数;
int CURRENTSTEPOF PHASE=周期%max_步数的CURRENTSTEPOF;
//这是为每个基色执行的相移量,以使提升线处于相位0
int相移[3]={2,0,4};
//对于每个颜色分量
对于(int i=0;i<3;++i){
//移动阶段,使您具有/处于阶段0
int-shiftedPhase=(电流相位+相位_移位[i])%相位;
如果(移位相位==1 | |移位相位==2)
强度[i]=最大值;
否则如果(移位相位==0)
强度[i]=相位的电流阶跃;
否则如果(移位相位==3)
强度[i]=相位的最大电流阶跃;
其他的
强度[i]=0;
}
其思路如下:

移位是必需的,因为通过为一个不同的颜色分量增加当前相位的增量,可以考虑第0, 1, 2和第3阶段,以理解强度应该提高、下降或设置为每个分量的最大值。


这应该适用于您想要轻松应用的任何强度步骤。

通过简单的情况图,您可以找到一个公式,根据您在每个刻度上递增的全局计数器,将强度直接应用于单个组件,代码如下所示(我刚刚写的,还没有测试,但应该足以让您了解它的工作原理):

int counter=0;//计数器您应该在每个刻度上递增
int phases=6;//周期中的总相位
int cyclelelength=max_steps*phases;//一个周期内的总节拍数
int currentStepOfCycle=计数器%cycleLength;
int currentPhase=循环的当前步数/最大步数;
int CURRENTSTEPOF PHASE=周期%max_步数的CURRENTSTEPOF;
//这是为每个基色执行的相移量,以使提升线处于相位0
int相移[3]={2,0,4};
//对于每个颜色分量
对于(int i=0;i<3;++i){
//移动阶段,使您具有/处于阶段0
int-shiftedPhase=(电流相位+相位_移位[i])%相位;
如果(移位相位==1 | |移位相位==2)
强度[i]=最大值;
否则如果(移位相位==0)
强度[i]=相位的电流阶跃;
否则如果(移位相位==3)
强度[i]=相位的最大电流阶跃;
其他的
强度[i]=0;
}
其思路如下:

移位是必需的,因为通过为一个不同的颜色分量增加当前相位的增量,可以考虑第0, 1, 2和第3阶段,以理解强度应该提高、下降或设置为每个分量的最大值。


这应该适用于您想要轻松应用的任何强度步骤。

“所有这些都是在一个循环中,只运行一次”那么,在循环中有什么意义呢?不,对不起,这是循环,但我必须在循环之前和之后做一些事情,我不能只是坐在循环中更新颜色。我需要稍微改变颜色,更新LED驱动程序,然后做其他事情,然后再回来更新一点,重复。不要使用循环,使用计时器。“所有这些都在一个只运行一次的循环中"那么,在循环中有什么意义呢?不,对不起,这是循环,但我必须在循环之前和之后做一些事情,我不能只是坐在循环中更新颜色。我需要稍微改变颜色,更新LED驱动程序,然后做其他事情,然后再回到循环中,再更新一点,重复。不要使用循环,使用计时器。至少在我读到它的时候,是这样的e LED不只是开或关——我相信他每个LED都有两个“开”级别(但我可能误解了LED组合的真正意图)。@JerryCoffin是的,我不确定……我想你可以使用2位,并有一个开/半/关状态,但你仍然可以用相同的基本方式操作……使用