我想使用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<=21
或i<22
。如果你想的话,你可以数一下:14, 15, 16, 17, 18, 19, 20
是i<21
的情况,但它们只有7个引脚。
for(int i=count; i<7; i++) digitalWrite(i+14, pattern[1][count] & 1<<i);
您想要设置所有8个LED,因此需要将i
初始化为0
,并计数为i<8
或i<=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
}