Arduino中同时具有多个功能

时间:2012-02-02 10:12:25

标签: c++ multithreading arduino

我正在研究一个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和谷歌上查一下,但我找不到一种我能理解的方式在我现有的代码中使用它。

如果没有,你有什么更好的建议吗?

2 个答案:

答案 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.
 }