我如何让压电播放 3 次然后在 Arduino 中停止?
How do i make a piezo play 3 times and then stopping in Arduino?
编辑:https://www.tinkercad.com/things/ampvgOj75D1
这是我的 tinkercad 项目的 link 包含电路的接线,抱歉我忘了它也需要让代码工作。
我需要这段代码让压电播放 3 次然后完全停止,while()
循环由于某种原因不起作用。
我尝试移动 i++
函数,但它不起作用。如果我在全局范围内声明 i=0;
,则压电永远不会播放,如果我将其放在 loop()
中,它会一直重复而不会第三次停止。
int i=0;
const byte speakerPin=9;
unsigned long CurrentMillis;
unsigned long lastPeriodStart;
const int onDuration=100;
const int periodDuration=500;
void setup()
{
pinMode(9, OUTPUT);
Serial.begin(9600);
}
void loop()
{
CurrentMillis = millis();
Serial.println(i);
while(i<=3)
{
if (CurrentMillis-lastPeriodStart>=periodDuration)
{
lastPeriodStart = millis();
tone(speakerPin,550, onDuration);
}
i++;
}
}
您的实际代码由于变量 i
在每个循环中递增而无法工作。所以这意味着 i
在很短的时间内超过 3 并且 if
语句仍然是错误的。
如果在 if
中移动 i++
语句,您的代码不会离开 while
循环,因为 CurrentMillis
没有更新。
我的推荐:
- 使用
Serial.println("message");
跟踪您的代码,在所有分支中跟踪您的代码
- 在
if
中移动 i++;
语句
- 将
while
语句替换为 if
编辑:https://www.tinkercad.com/things/ampvgOj75D1 这是我的 tinkercad 项目的 link 包含电路的接线,抱歉我忘了它也需要让代码工作。
我需要这段代码让压电播放 3 次然后完全停止,while()
循环由于某种原因不起作用。
我尝试移动 i++
函数,但它不起作用。如果我在全局范围内声明 i=0;
,则压电永远不会播放,如果我将其放在 loop()
中,它会一直重复而不会第三次停止。
int i=0;
const byte speakerPin=9;
unsigned long CurrentMillis;
unsigned long lastPeriodStart;
const int onDuration=100;
const int periodDuration=500;
void setup()
{
pinMode(9, OUTPUT);
Serial.begin(9600);
}
void loop()
{
CurrentMillis = millis();
Serial.println(i);
while(i<=3)
{
if (CurrentMillis-lastPeriodStart>=periodDuration)
{
lastPeriodStart = millis();
tone(speakerPin,550, onDuration);
}
i++;
}
}
您的实际代码由于变量 i
在每个循环中递增而无法工作。所以这意味着 i
在很短的时间内超过 3 并且 if
语句仍然是错误的。
如果在 if
中移动 i++
语句,您的代码不会离开 while
循环,因为 CurrentMillis
没有更新。
我的推荐:
- 使用
Serial.println("message");
跟踪您的代码,在所有分支中跟踪您的代码 - 在
if
中移动 - 将
while
语句替换为if
i++;
语句