首页 文章

Arduino中同时具有多个功能

提问于
浏览
1

我正在制作一个Arduino草图,在那里我创造了两个交通灯,一个用于正常交通,一个用于行人 . 我为这两个灯中的每一个创建了一个函数,它循环通过它的循环(例如:变黄,等待20秒,然后变为红色并再次等待) . 这些被称为aTrafficlight()和pTrafficlight,其中a是普通灯,p是行人灯 . 在我的loop()函数中,我为一个按钮设置了一个digitalRead . 当按下这个按钮时,红绿灯应该一次一个地循环通过它们的循环(所以正常的灯变成红色,pTrafficlight等了一下,然后变成绿色,闪烁几次,变成红色,等待并结束循环,所以它进入它的原始状态 . )

这一切都有效 . 但现在我想添加一个蜂鸣器 . 当pTrafficlight为红色时,此蜂鸣器必须每秒发出一次蜂鸣声,一次为绿色时为十分之一秒,而每两秒钟闪烁一次则为绿色 .

在这里我遇到了一些问题: - 当在原始状态下等待(按钮未按下)时,似乎我有时可以按下按钮而没有反应,因为循环仍在继续 . 我需要弄清楚当buttonState == LOW时如何避免在循环中等待 . (有一个函数wait(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和google上查找它,但我找不到一种我理解的方式在我现有的代码中使用它 .

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

2 回答

  • 3

    您不需要多线程 . 您需要使用定时器,无论是通过中断(如Pawel写的)还是通过其他机制(如Metro库),它们可以让代码在定时器运行时继续循环 . 看到这个问题和答案:How Can I Create Interrupts in C for Arduino

    巧合的是,我最近在状态机和Arduino上都有一些材料,如汉斯帕斯特所提到的,以及延迟()的替代品,两者都带有额外的参考,你可能会发现它们很有用 .

  • 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.
     }
    

相关问题