es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo hago que un piezo suene 3 veces y luego se detenga en Arduino?

EDIT: https://www.tinkercad.com/things/ampvgOj75D1
Este es el enlace a mi proyecto de tinkercad que contiene el cableado del circuito, siento haber olvidado que también es necesario para que el código funcione.

Necesito este código para que el piezo suene 3 veces y luego se detenga por completo, el bucle while() no funciona por alguna razón.
He intentado mover la función i++ pero no funciona. Si establezco i=0; globalmente, el piezo nunca suena, si lo coloco en loop(), sigue repitiéndose sin detenerse la tercera vez.

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++;

}

}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para hacer que el piezo reproduzca 3 veces y luego se detenga por completo utilizando el código proporcionado, el bucle while() debe modificarse. En lugar de usar while (i<=3), usa while (i<3) ya que el bucle actualmente permite que el código se ejecute 4 veces (i=0, i=1, i=2, i=3).

    Además, i debe restablecerse a 0 y el bucle while() debe detenerse una vez que i alcance 3. El código modificado debería verse así:

    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++;
        }
      }
      //reset i and stop playing the piezo
      i = 0;
      noTone(speakerPin);
    }
    

    Además, para que el código funcione, es necesario confirmar la conexión y los componentes del circuito. Por favor, consulta el proyecto de Tinkercad proporcionado para el diagrama del circuito y asegúrate de configurarlo correctamente.

Comments are closed.