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
}
}
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
}
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
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 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.
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
}
}
}