Arduino双拍手感测代码中断

时间:2019-06-03 18:09:51

标签: arduino arduino-uno arduino-ide

我正在制作一个程序,当我拍手两次时,它会打开我的灯。我将该项目编码为: 1.听到声音(第一次拍手) 2.倾听安静的声音(拍手之间的声音),这是为了避免错误的触发(说话等)。 3.听到第二声(第二声掌声)。

代码可以正常运行并且可以正常工作,但是它有几个我很难找到/修复的断点。我知道是否发出声音,然后安静下来,然后反复发出另一声音,然后代码快速连续地卡在第一个while循环中,或者完全停止进入第一个while循环。我说话时代码经常会中断。

如果有人愿意为我节省一些时间和精力,我会提供代码。我还是个初学者,我将不胜感激所有建议。

bool quiet = false;
bool loud = false;
int runtime = 1000;
int start = millis();
bool clap = false;
bool clap2 = false;
void setup() {

    Serial.begin(9600);
    pinMode(2, INPUT);
}

void loop() {

    int mic = digitalRead(2);
    if (mic == 0) {
        Serial.println("loud");
        clap = true;
    } else {
        Serial.println("quiet");
    }
    if (clap == true) {
        clap = false;
        Serial.println("clap");
        start = millis();
        delay(500);
        while (start >= millis() - runtime && loud != true) {
            mic = digitalRead(2);
            if (mic == 0) {
                Serial.println("noise detected!");
                loud = true;
            } else {
                Serial.println("scilence");
                quiet = true;
            }

        }
    } else {
        delay(1);
    }
    if (quiet == true && loud == false) {
        quiet = false;
        Serial.println("listening for second clap...");
        delay(500);
        start = millis();
        while (start >= millis() - runtime) {
            mic = digitalRead(2);
            if (mic == 0) {
                clap2 = true;
            } else {
                delay(1);
            }
        }
    } else {
        loud = false;
        quiet = false;
    }
    if (clap2 == true) {
        clap2 = false;
        Serial.println("clap 2");
        delay(1000);
    } else {
        delay(1);
    }
}

1 个答案:

答案 0 :(得分:0)

欢迎使用StackOverflow!

在您发布的程序中,我认为您过于复杂了;)。首先,delay()函数是一个阻塞函数:在延迟时间内,什么也不会发生。因此,通常建议比较时间以便知道您是否已经等待了足够的时间:然后您可以同时执行其他任务。

我会为您的loop()函数提出这样的建议:

if(digitalRead(2)==0) //loud
{
    unsigned long first_clap_time = millis();
    unsigned long elapsed_time = 0;
    bool silence = false;
    bool exit = false;
    while (elapsed_time < 5000 || exit)  // allow a max delay of 5sec
    {
        if (digitalRead(2)!=0) silence = true;
        elapsed_time = millis() - first_clap_time;
        if (digitalRead(2)==0 && elapsed_time > 500 && silence) 
        {
            Serial.println("Two claps detected!");  //if a second clap is detected 500 milliseconds after the first, and before 5 sec, and a silence was detected
            exit = true;
        }
    }      
}

这应该只能检测到两个拍手,它们之间的间隔为500毫秒至5秒钟(当然要进行调整)。我没有办法测试该程序,所以请随时提供反馈!

希望有帮助,