我正在制作一个程序,当我拍手两次时,它会打开我的灯。我将该项目编码为: 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);
}
}
答案 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秒钟(当然要进行调整)。我没有办法测试该程序,所以请随时提供反馈!
希望有帮助,