LED 闪烁和延迟周期



我想使用Arduino中的串行监视器更改LED闪烁模式和延迟时间。

  • 第一种模式:1个LED侧向移动

  • 第二种模式:2个LED侧向移动

  • 第三种模式:3个LED侧向移动

  • 第四种模式:4个LED侧向移动

  • 周期1:500毫秒

  • 周期2:300毫秒

  • 周期3:100ms

  • 周期4:50ms

当我输入a、b、c、d时,更改LED模式。如果我在模式a进行时输入c,但它将在现场添加两条引线。我想当我输入1、2、3、4时,延迟期会改变。

接下来,我已经尽可能多地编写了代码,但我认为我再也做不到了,所以我发布了一个问题。

char pattern[4][8] = {
{0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80},
{0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x81},
{0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0xC1, 0x83},
{0x0F, 0x1E, 0x3C, 0x78, 0xF0, 0xE1, 0xC3, 0x87}
};
char data = ' ';
char count = 0;
void setup()
{
Serial.begin(115200);
for(int i=14; i<21; i++) pinMode(i, OUTPUT);
}
void loop() 
{
if(Serial.available()>0)
{
data = Serial.read();
Serial.println(data);
switch(data)
{
case 'a':
{
for(int i=count; i<7; i++) digitalWrite(i+14, pattern[1][count] & 1<<i);
count++;
if(count==7) count = 0;
delay(100);
if(data == !'a')
{
break;
}
}
case 'b':
{
for(int i=count; i<7; i++) digitalWrite(i+14, pattern[2][count] & 1<<i);
count++;
if(count==7) count = 0;
delay(500);
if(data == !'b')
{
break;
}
}
case 'c':
{
for(int i=0; i<7; i++) digitalWrite(i+14, pattern[3][count] & 1<<i);
count++;
if(count==7) count = 0;
delay(500);
if(data == !'c')
{
break;
}
}
case 'd':
{
for(int i=0; i<7; i++) digitalWrite(i+14, pattern[4][count] & 1<<i);
count++;
if(count==7) count = 0;
delay(500);
if(data == !'d')
{
break;
}
}
}
}
}

您的代码中有几个小错误,我试图一步一步地向您解释。完成的代码可以在这里进行测试(并可视化(。

for(int i=14; i<21; i++) pinMode(i, OUTPUT);

在这里,您只初始化8个引脚中的7个。您需要将i<21更改为i<=21i<22。如果你想的话,你可以数一下:14, 15, 16, 17, 18, 19, 20i<21的情况,但它们只有7个引脚。

for(int i=count; i<7; i++) digitalWrite(i+14, pattern[1][count] & 1<<i);

您想要设置所有8个LED,因此需要将i初始化为0,并计数为i<8i<=7。同样,从pattern[1]开始,第一个模式需要具有地址pattern[0]

if(count==7) count = 0;

这里也是一样,如果你想拥有所有8个案例,你需要从0到7计数。如果将count重置为7,则不会有最后一个LED状态。将其更改为count==8

if(data == !'a')
{
break;
}

不要把你的休息放在一个条件下,只需使用break而不使用if

if(Serial.available()>0)
...
switch()

您希望在loop()的每次迭代中更改指示灯。如果您的开关位于if(Serial.available()>0)内部,则只有当串行消息到达时,您才能更改LED状态。这就是为什么你的LED改变";"随机";。只有当你主动发送消息时,他们才会得到更新,而不是周期性的。

我建议为delay使用一个变量,并将其移动到交换机之外,if(count==8) count = 0也是如此。

最后的代码是:

char pattern[4][8] = {
{0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80},
{0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x81},
{0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0xC1, 0x83},
{0x0F, 0x1E, 0x3C, 0x78, 0xF0, 0xE1, 0xC3, 0x87}
};
char data = ' ';
char count = 0;
int mode = 0;
int delayTime = 500;
void setup()
{
Serial.begin(9600);
Serial.println("Start application");
for(int i=14; i<22; i++) pinMode(i, OUTPUT); //Initialize all 8 pins
}
void loop() 
{
if(Serial.available()>0) //Get's only executed if a serial message arrives
{
data = Serial.read();
Serial.println(data);
switch (data) {
case 'a': mode = 0; break;
case 'b': mode = 1; break;
case 'c': mode = 2; break;
case 'd': mode = 3; break;
case '1': delayTime = 500; break;
case '2': delayTime = 250; break;
case '3': delayTime = 100; break;
case '4': delayTime = 50; break;
default: break;
}
}
switch(mode) //Get's executed on every call of loop()
{
case 0:
for(int i=0; i<8; i++) digitalWrite(i+14, pattern[0][count] & 1<<i);
break;
case 1:
for(int i=0; i<8; i++) digitalWrite(i+14, pattern[1][count] & 1<<i);
break;
case 2:
for(int i=0; i<8; i++) digitalWrite(i+14, pattern[2][count] & 1<<i);
break;
case 3:
for(int i=0; i<8; i++) digitalWrite(i+14, pattern[3][count] & 1<<i);
break;
}
delay(delayTime); //Always wait for delayTime ms
count++;
if(count==8) count = 0; //Reset count if it is >7
}

最新更新