Thread e Audio

Salve a tutti,
vorrei sapere se esiste un modo per utilizzare un buzzer audio su arduino senza interrompere il void loop. Il progetto sta nel far suonare il buzzer in una macchinina mentre si muove.
Il classico delay per il buzzar interrompe il programma rendendo impossibile il movimento della macchina.
Grazie

Se non sbaglio la funzione tone() può essere usata sia con un tempo prefissato che no. La attivi e continua a suonare sino alla chiamata noTone().

Guglielmo

gpb01:
Se non sbaglio la funzione tone() può essere usata sia con un tempo prefissato che no. La attivi e continua a suonare sino alla chiamata noTone().

Guglielmo

Grazie per la risposta. Abbiamo provato con i led la funzione millis(), e funziona perfettamente senza interrompere il ciclo loop.
Sostituendo l'accensione dei led con l'audio, all'avvio del buzzer i motori si spengono.
Led e audio devono lampeggiare e si alterna of/off ogni secondo (nel codice interval=1000)
Ecco i codici di entrambi gli esempi:
LED:

if(audio){
              previousMillis = millis();
              audio=false;
            }else{
              if (indietro){
                unsigned long mill=millis();
                if (mill >= previousMillis+interval) {
                  Serial.println(mill);
                  previousMillis = mill;
                  if (digitalRead(ledRetro) == LOW) {
                     digitalWrite(ledRetro, HIGH);
                  } else {
                     digitalWrite(ledRetro, LOW);
                  }
                }
              }
            }

BUZZER:

if(audio){
              previousMillis = millis();
              audio=false;
            }else{
              if (indietro){
                unsigned long mill=millis();
                if (mill >= previousMillis+interval) {
                  Serial.println(mill);
                  previousMillis = mill;
                  if (digitalRead(ledRetro) == LOW) {
                     digitalWrite(ledRetro, HIGH);
                     tone(14, 260);
                  } else {
                     digitalWrite(ledRetro, LOW);
                     noTone(14);
                  }
                }
              }
            }

Evidentemente la funzione tone() ha un delay che blocca tutto il ciclo

Non mi risulta ...
... quello che invece vedo è che sti usando in modo errato millis().

I confronto per fare certe cose con data periodicità, per evitare problemi di overflow e sfruttare il fatto che si usano gli unsigned int, deve essere fatto così:

if (millis() - previousMillis > intervallo) {
  ...
  ...
  previousMillis += intervallo;
}

Per quello che riguarda la tone() prova a fare un semplice programmino con cui inizi una tone e accendi il LED, aspetti 1000 ms, spegni la tone e spegni il LED e guarda se noti dei ritardi ... non ci devono essere.

Sicuro invece che NON ci siano conflitti sui pin usati ?

Guglielmo