我正在研究一个Arduino草图,在那里我创建了两个交通灯,一个用于正常交通,一个用于行人。我为这两个灯中的每一个创建了一个函数,它循环通过它的循环(例如:变黄,等待20秒,然后变为红色并再次等待)。这些被称为aTrafficlight()和pTrafficlight,其中a是普通灯,p是行人灯。在我的loop()函数中,我为一个按钮设置了一个digitalRead。当按下这个按钮时,红绿灯应该一次一个地循环通过它们的循环(所以正常的灯变成红色,pTrafficlight等了一下,然后变成绿色,闪烁几次,变成红色,等待并结束循环,所以它进入它的原始状态。)
这一切都有效。但现在我想添加一个蜂鸣器。当pTrafficlight为红色时,此蜂鸣器必须每秒发出一次哔声,一次为绿色时为十分之一秒,而在绿色闪烁时为每两秒两次。
这里我遇到了一些问题: - 当等待处于原始状态(按钮未按下)时,似乎我有时可以按下按钮而没有反应,因为循环仍在继续。我需要弄清楚当buttonState == LOW时如何避免在循环中等待。 (有一个功能等待(int sec)) - 按下按钮时,循环循环。我可以写一些循环,实现交通信号灯同时是红色和嘟嘟声,但我宁愿保持这些分开。 - 双哔哔声相同。我不希望灯的哔哔声和闪烁在同一个循环中,因为它令人困惑,难以阅读和理解代码。
这是我的循环():
int buttonState = 0;
void loop(){
buttonState = digitalRead(pButton);
if(buttonState == LOW){
vSet("red");
pSet("green");
// This is where I tried to create the sound.
digitalWrite(pSound, HIGH);
delay(10);
digitalWrite(pSound, LOW);
wait(1);
} else {
aTrafficlight();
pTrafficlight();
}
}
有没有办法解决我的多线程问题?我试着在arduino.cc和谷歌上查一下,但我找不到一种我能理解的方式在我现有的代码中使用它。
如果没有,你有什么更好的建议吗?
答案 0 :(得分:3)
您不需要多线程。您需要使用定时器,无论是通过中断(如Pawel写的)还是通过其他机制(如Metro库),它们可以让代码在定时器运行时继续循环。请参阅此问题和答案:How Can I Create Interrupts in C for Arduino
巧合的是,我最近posted一些关于状态机和Arduino的材料,正如Hans Passant所提到的,以及延迟()的替代方案,两者都有你可能会觉得有用的额外参考。
答案 1 :(得分:0)
您可以使用时间片设计。我只想概括一下这一点。 第一个代码循环,以便它总是发出延迟(1)并将mod 10计数器设置为:
int stopWhen = -1; // at startup
// etc.
x = (x+1)%10; // every time loop execs
然后当buttonState == LOW
时 if (stopwWhen = -1)
{
stopWhen = x;
// beep etc.
}
但是在每个循环中:
// always exec this:
if (stopWhen == x)
{
stopWhen = -1;
// stop beeping.
}