我如何让压电播放 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 没有更新。 我的推荐:

  1. 使用 Serial.println("message"); 跟踪您的代码,在所有分支中跟踪您的代码
  2. if
  3. 中移动 i++; 语句
  4. while 语句替换为 if