C++ Arduino中同时具有多种功能

C++ Arduino中同时具有多种功能,c++,multithreading,arduino,C++,Multithreading,Arduino,我正在绘制一幅Arduino的草图,在那里我创建了两个交通灯,一个用于正常交通,一个用于行人。我为这两个灯中的每一个创建了一个函数,该函数循环它的循环(例如:变黄,等待20秒,然后变红,然后再次等待)。它们被称为aTrafficlight()和pTrafficlight,其中a为正常照明,p为行人照明。在我的loop()函数中,我为按钮设置了digitalRead。按下此按钮时,交通灯应一次循环一个环路(因此,正常灯变为红色,交通灯等待一段时间,然后变为绿色,闪烁几次,变为红色,等待并结束环路,

我正在绘制一幅Arduino的草图,在那里我创建了两个交通灯,一个用于正常交通,一个用于行人。我为这两个灯中的每一个创建了一个函数,该函数循环它的循环(例如:变黄,等待20秒,然后变红,然后再次等待)。它们被称为aTrafficlight()和pTrafficlight,其中a为正常照明,p为行人照明。在我的loop()函数中,我为按钮设置了digitalRead。按下此按钮时,交通灯应一次循环一个环路(因此,正常灯变为红色,交通灯等待一段时间,然后变为绿色,闪烁几次,变为红色,等待并结束环路,使其进入原始状态。)

这一切都有效。但现在我想加一个蜂鸣器。当pTrafficlight为红色时,该蜂鸣器必须每秒鸣响一次;当pTrafficlight为绿色时,该蜂鸣器必须每秒鸣响一次;当pTrafficlight为绿色时,该蜂鸣器必须每两秒鸣响两次

在这里,我遇到了几个问题: -当在原始状态下等待(按钮未按下)时,似乎有时我可以毫无反应地按下按钮,因为循环仍在进行。我需要弄清楚当buttonState==低时如何避免在循环中等待。(有一个函数wait(int-sec)) -当按下按钮时,它在循环中循环。我可以写一些循环来实现红绿灯和哔哔声同时出现,但我宁愿把它们分开。 -双重嘟嘟声也一样。我不想让哔哔声和闪烁的灯光处于同一个for循环中,因为这会让人困惑,也很难阅读和理解代码

这是我的循环()

有没有办法解决我的多线程问题?我试着在arduino.cc和google上查找它,但我找不到一种我理解得足够多的方法在我现有的代码中使用它


如果没有,您有更好的建议吗?

您不需要多线程。您需要使用计时器,无论是通过中断(如Pawel所写)还是通过另一种机制(如Metro库),它允许代码在计时器运行时继续循环。请参见此问题和答案:


巧合的是,正如Hans Passant所提到的,我最近在状态机和Arduino上,以及在delay()的替代品上,提供了一些材料,这两种材料都有额外的参考,您可能会发现它们很有用

您可以使用时间片设计。让我简单地概括一下这一点。 第一个代码循环,使其始终发出延迟(1),并将mod 10计数器设置为:

 int stopWhen = -1;  // at startup
 // etc.
 x = (x+1)%10;       // every time loop execs
然后当buttonState==低

 if (stopwWhen = -1)
 {
    stopWhen = x;
    // beep etc.
 }
但在每个循环中:

 // always exec this:
 if (stopWhen == x)
 {
    stopWhen = -1;
    // stop beeping.
 }

这需要一种基于状态机的不同编程技术。这是常见的游戏,谷歌“游戏循环”。最基本的是为什么不使用中断?通过这种方式,您可以周期性地调用中断处理程序,而无需循环或阻塞任何内容。。。
 // always exec this:
 if (stopWhen == x)
 {
    stopWhen = -1;
    // stop beeping.
 }