Uscire da una funzione() con lo stato stabile

buondi , ho creato una funzione , che la chiamo a richiesta , come si fa per avere , in questo programma il noTone quando ne esco??

if (digitalRead(5)==HIGH ) {
 uno();
 }
void uno() {
  if (stato_buzzer == LOW) {                                    // se il LED è già spento
    if (millis() - tempo_buzz > 1500) { // e passato abbastanza tempo
      tone(PIN_BUZZER, 1000);                           // accendi il LED
      stato_buzzer = HIGH;                                      // memorizza il suo stato corrente
      tempo_buzz = millis();                   // aggiorna l'ora di questo nuovo evento
    }
  } else {                                                  // se il LED è già acceso
    if (millis() - tempo_buzz > 500) {  // e passato abbastanza tempo
      noTone(PIN_BUZZER);                            // spegni il LED
      stato_buzzer = LOW;                                       // memorizza il suo stato corrente
      tempo_buzz = millis();                   // aggiorna l'ora di questo nuovo evento
    }
  }

Spiegati meglio. Io sinceramente non ho capito cosa chiedi.

Aggiungi un noTone() prima di uscire?

Scherzi a parte, quoto @nid69ita .
Non è chiara la richiesta

Forse vuoi far sapere, dopo aver chiamato la funzione, il valore di stato_buzzer ??
Se si, la funzione deve ritornare quel valore vedi comando return in un libro/sito di linguaggio C

grazie delle risposte, no , a me serviva sapere come , quando ne esco si trovi in questa condizione

  if (millis() - tempo_buzz > 500) {  // e passato abbastanza tempo
      noTone(PIN_BUZZER);                            // spegni il LED
      stato_buzzer = LOW;                                       // memorizza il suo stato corrente
      tempo_buzz = millis();                   // aggiorna l'ora di questo nuovo evento
    }

Ho il sospetto che tu stia approcciando il problema nel modo sbagliato.
Prova a spiegare tutto l'insieme invece di un pezzo solo.

e solo un esempio , facendo una prova , ho notato che a volte , esce dalla funzione che il buzzer suona .perche ne esce con il millis() nello stato che suona .
vorrei solo capire come si fa a fare in modo che quando non e' piu chiamata la funzione non ne esca in uno stato indefinito

Come diceva @nid69ita per ritornare un valore da una funzione si usa il return.
A seconda del valore che vuoi ritornare devi cambiare la dichiarazione della funzione.
Invece di
void uno()
userai

int uno()
unsigned long uno()
ecc

a seconda di cosa vuoi restituire.

quindi sarebbe cosi?
quando ne esce lo stato che permane e sempre LOW

if (digitalRead(5)==HIGH ) {
 uno();
 }
void uno() {
  if (stato_buzzer == LOW) {                                    // se il LED è già spento
    if (millis() - tempo_buzz > 1500) { // e passato abbastanza tempo
      tone(PIN_BUZZER, 1000);                           // accendi il LED
      stato_buzzer = HIGH;                                      // memorizza il suo stato corrente
      tempo_buzz = millis();                   // aggiorna l'ora di questo nuovo evento
    }
  } else {                                                  // se il LED è già acceso
    if (millis() - tempo_buzz > 500) {  // e passato abbastanza tempo
      noTone(PIN_BUZZER);                            // spegni il LED
      stato_buzzer = LOW;                                       // memorizza il suo stato corrente
      tempo_buzz = millis();                   // aggiorna l'ora di questo nuovo evento
    }
  }
  if(stato_buzzer==LOW) return;
  }

No. Se stato_buzzer è HIGH non ritorni niente e non va bene.
Al limite
return stato_buzzer;
ma devi cambiare anche la dichiarazione della funzione mettendo il tipo di stato_buzzer.
Comunque stato_buzzer è una variabile globale, quindi è accessibile anche fuori dalla funzione.

Il codice all'interno della funzione viene eseguito una sola volta dall'inizio alla fine, tutte le volte che la funzione viene chiamata.
Se quando chiami la funzione, il codice al suo interno attiva un buzzer, ma poi non lo disattiva, è normale che il buzzer rimanga attivo.
Quindi o attendi un certo tempo, e poi lo disattivi dentro alla funzione, oppure devi prevedere di disattivarlo in qualche modo dopo che sei uscito dalla funzione.

Come dice fratt stai pensando alla soluzione sbagliata per un problema sbagliato dovuto alla logica sbagliata :wink: Quella funzione viene chiamata a ripetizione finchè un ingesso rimane HIGH. Se a un certo punto non chiami più la funzione, quello che "stava facendo" rimane fermo li. Quindi non si tratta di fare qualcosa quando la funzione finisce (visto che finisce forse migliaia di volte al secondo), ma di fare qualcosa quando l'ingresso diventa LOW.

O la funzione (da modificare) la chiami sempre passandole lo stato dell'ingresso anche quando è LOW, oppure lo stato stabile che vuoi ottenere lo imposti ogni volta che rilevi ingresso LOW.

In sostanza hai scritto cosa fare per ingresso HIGH, ma non per ingresso LOW.

if (digitalRead(5)==HIGH ) 
{ uno();
}
else
{ noTone();
}

grazie, ho pensato ad una cosa cosi, che vi pare

unsigned long tempo_buzz = 0;
bool stato_buzzer ;
int f=0;
void setup() {
  Serial.begin(9600);
 pinMode(13, OUTPUT);
 pinMode(8, INPUT_PULLUP);
}
void loop() {
  if (digitalRead(8) == LOW ) {
    Serial.println(F("premuto   "));
    Serial.println(f);
    uno();
 }
  else
{
   if (f==1) {
   digitalWrite(13, LOW);
  f=0;
}
}
}
void uno() {
  if (stato_buzzer == LOW) {                                    // se il LED è già spento
    if (millis() - tempo_buzz >125) { // e passato abbastanza tempo
      f=1;
      digitalWrite(13, HIGH);                          // accendi il LED
      stato_buzzer = HIGH;                                      // memorizza il suo stato corrente
      tempo_buzz = millis();                   // aggiorna l'ora di questo nuovo evento
    }
  } else {                                                  // se il LED è già acceso
    if (millis() - tempo_buzz > 125) {  // e passato abbastanza tempo
      digitalWrite(13, LOW);                            // spegni il LED
      stato_buzzer = LOW;                                       // memorizza il suo stato corrente
      f=0;
      tempo_buzz = millis();                   // aggiorna l'ora di questo nuovo evento
    }
  }
  

}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.