通过一个问题磕磕绊绊,我试图在迭代多个阵列的同时移动两个或更多个伺服器。想想鼓机,我可能想要在一些节拍上同时击中小军鼓,低音和高帽。不在其他人身上。
byte bass[] = {1,0,1,0};
byte snare[] = {1,1,0,0};
byte hihat[] = {1,1,0,0};
for (int i = 0; i < sizeof(snare); i++)
{
if (i == 1)
{
snare.write(45);
delay(250);
snare.write(0);
dleay(250);
}
else if
{
snare.write(0);
delay(500);
}
}
等等每个阵列,每个乐器。
正如您所看到的,由于延迟()并且两个或更多个循环不会在程序性质的同时触发,因此不会起作用。
我知道我可以使用millis()而不是使用delay()来解决这个问题。
我很好奇,如果使用伺服驱动板更容易完成我要做的事情,或者毫无意识(毫米)是我唯一的途径?
更新
在修补了millis()一段时间之后,我发现自己的任务过于复杂,并且发现了足够近的&#39;通过简单的路线我想到的任务。
#include <Servo.h>
Servo s1;
Servo s2;
Servo s3;
Servo s4;
byte bass[] = {45,0,0,0,45,0,0,0,0,0,0,0,0,0,0,0,45,0,45,0,0,0,0,0,0,0,0,0,45,0,0,0};
byte snare[] = {0,0,0,0,0,0,0,0,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,0,0,0,0,0,0,0};
byte hihat[] = {45,0,0,0,45,0,0,0,45,0,0,0,45,0,0,0,45,0,0,0,45,0,0,0,45,0,0,0,45,0,0,0};
byte cymb[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,0,0,0,0,0,0,0,0,0,0,0,0,0,45,0,0,0};
void setup() {
Serial.begin(9600);
s1.attach(6);
s2.attach(5);
s3.attach(4);
s4.attach(3);
s1.write(0);
s2.write(0);
s3.write(0);
s4.write(0);
}
void loop()
{
drummer();
}
void drummer()
{
for (int i = 0; i < sizeof(bass); i++)
{
s1.write(bass[i]);
s2.write(snare[i]);
s3.write(hihat[i]);
s4.write(cymb[i]);
delay(250);
}
}
答案 0 :(得分:0)
如果使用伺服驱动板更容易,我很好奇 完成我要做的事情,或者millis()是我唯一的途径?
Millis()会奏效。我没有伺服驱动板,所以我不能说它,但我认为这不会有助于同时运行伺服系统。
这是使用millis()的代码。我只是根据你给出的例子写了它。
byte bass[] = {1,0,1,0};
byte snare[] = {1,1,0,0};
byte hihat[] = {1,1,0,0};
usigned long currentMillis = 0;
unsigned long previousMillis = 0;
const long interval = 250;
const long longInterval = 500;
for (int i = 0; i < sizeof(snare); i++)
{
if (i == 1)
{
snare.write(45);
currentMillis = millis();
if (currentMillis - previousMillis >= interval){
snare.write(0);
}
}
else if
{
if (currentMillis - previousMillis >= longInterval){
snare.write(0);
}
}
}