Funzione counter led e buzzer

Ciao a tutti,
sono propenso alla realizzazione di un sensore parcheggio da posizionare in garage in modo da stoppare l'auto al suono continuo del buzzer.
La funzione counter è impostato in modo da suonare per 20 sec per poi zittirsi fino ad una nuova misura letta dal sensore ultrasuono ( movimento auto )
Il problema riscontrato è che dopo essersi zittito, sia il led che il buzzer continuano a funzionare con frequenza di secondi ( piccoli lampeggi e beep con frequenza del counter )
Il led emette piccoli lampeggi e il buzzer piccoli suoni senza interrompersi
Non so se ho reso l'idea, ma il mio intento è quello di voler mettere a tacere fino allo spostamento dell'auto sia il led che il buzzer
Allego il code

Spero di essere stato chiaro e ringrazio in anticipo

 int trigPin = PD5; // Sensor Trip pin connected to Arduino pin D5
int echoPin = PD6; // Sensor Echo pin connected to Arduino pin D6
int redLED = PD2; // Red LED connected to pin D2
int yellowLED = PD3; // Yellow LED connected to pin D3
int greenLED = PD4; // Green LED connected to pin D4
int buzzer = A0; // Buzzer connected to Analogue pin A0
long TempDistance = 0; // A variable to store the temporary distance
int counter = 0; // Counter value to check if the object has stopped moving

void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(redLED, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
pinMode(buzzer, OUTPUT);
}

void loop() {
long duration, Distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
Distance = (duration/2) / 74; // Distance in Inches

if(counter < 20){ // Do the rest if the car is still moving
if (Distance > 200) { // Nothing in the garrage
turnThemAllOff();
}

if ((Distance > 55) && (Distance <= 200)) { // Turn on Green LED
digitalWrite(greenLED, HIGH);
digitalWrite(yellowLED, LOW);
digitalWrite(redLED, LOW);
noTone(buzzer);
}

if ((Distance > 15) && (Distance <= 55)) { // Turn on Yellow LED
digitalWrite(yellowLED, HIGH);
digitalWrite(redLED, LOW);
digitalWrite(greenLED,LOW);
noTone(buzzer);
}

if (Distance <= 15) { // Turn on Red LED
digitalWrite(redLED, HIGH);
digitalWrite(greenLED,LOW);
digitalWrite(yellowLED, LOW);
noTone(buzzer);
}

if (Distance < 8) { // Item is way to close - start the buzzer
tone(buzzer, 500);
}

}

if ((Distance == TempDistance) || ((Distance+1) == TempDistance) || ((Distance-1) == TempDistance)){
if(counter >= 20){ // Turn off the lights if the object hasn't moved for 20 cycles (no change in distance)
Serial.println("No movement detected, turning off the lights");
turnThemAllOff();
} else {
counter++;
}
} else {
counter = 0; // Reset counter if there is a movement
}

TempDistance = Distance;
Serial.print(Distance);
Serial.println(" inches");
Serial.print("Counter : ");
Serial.println(counter); delay(500); }
// Function to turn the LEDs off

void turnThemAllOff(){
digitalWrite(redLED, LOW);
digitalWrite(greenLED,LOW);
digitalWrite(yellowLED, LOW);
noTone(buzzer);
}

A dire il vero non c'è traccia da nessuna parte dei venti secondi del buzzer, il codice che, probabilmente, hai copiato da qualche parte in relatà fa venti misurazioni ogni 500mS e se dopo venti misurazioni la distanza non è cambiata allora spegne tutto.
Quale led emette piccoli lampeggi? Perchè in base a queto dovresti capire quale if sta scattando.
Inoltre se aggiungi qualche messaggio su monitor seriale riuscirai a capire meglio in che aree del codcie la procedura sta passando per debuggare meglio.
Può anche essere che la lettura effettuata del sensore non sia precisa e che quindi questo if:

((Distance == TempDistance) || ((Distance + 1) == TempDistance) || ((Distance - 1) == TempDistance))

Fallisce il controllo (perché accetta solo uno scarto di + o - un unità come tollerabile) e resetta il contatore.
Se fai una prova e metti il risultato anche di ciò che passa sul serial monitor magari si riesca a comprendere meglio cosa sta accadendo e si raggiunge più facilmente la possibilità di risolvere

P.S. = La prossima volta prima di mettere il codice premi Ctrl+T nell'IDE, ti formatta il codice in modo che sia quantomeno leggibile facilemente. Grazie :slight_smile:

Grazie per la tua risposta e consigli.
Mi sono espresso male ed effettivamente fa 20 misurazioni ogni 500 ms
Infatti il brevissimo lampeggio led e beep buzzer sono ogni 500 ms dopo le 20 misurazioni

Bene ma quale led lampeggia? Uno, tutti? Nel Serial monitor le misurazioni riportate sono coerenti e sempe uguali quando l'oggetto non è in movimento?

Lampeggia solo l'ultimo led il rosso in questo caso
Nel serial monitor la lettura non varia

Scusami ma non si può dover strappare informazioni con le pinze, metti tutto il risultato, quando vale la lettura di Distance? e counter? perché da quel che dici sembra che counter sia sempre inferiore a venti e distance minore di 16 ma senza vedere l'output del serial monitor bisogna andare a intuito.

Te lo spiego in parole povere:
quando sono vicino al sensore che poi dovrò spegnere la macchina, il led rosso rimane sempre acceso e il buzzer ha un suono continuo e lungo.
Sia il led che il buzzer restano attivi per la durata delle 20 misurazione ogni 500 ms.
Una volta terminato le 20 misurazioni, sia il led che il buzzer si spengono, ma emettono, per il led un piccolo lampeggio con cadenza 500 ms e lo stesso per il buzzer ( brevissimo tono )
Questo è il mio problema.
Come posso evitare di dover vedere un lampeggio led rosso ogni 500 ms e lo stesso con il buzzer ( tono ) dopo le 20 misurazioni?

Purtroppo non siamo tutto professori
Grazie

Non è questione di essere professori, il funzionamento è chiaro, così come il codice che hai postato teoricamente fa quel che dovrebbe fare e che tu ti aspetti. Purtroppo però hai un problema, quindi ti ho suggerito di aggiungere messaggi di debug nel serial monitor in più punti possibile, far girare il programma in modo che si arrivi a simulare il problema e allegare qui il risultato che vedi sul serial monitor per tentare di capire dove potrebbe essere il problema ed aiutarti al meglio, perché purtroppo guardando il codice non riesco a suggerirti nulla di più, se non puoi, non vuoi o ritieni duperfluo fare ciò che ho chiesto va benissimo, era solo un suggerimento.
Se arriva qualcuno più bravo o intelligente di me che ti trova il possibile problema senza richiedere nulla ben per te avrai ottenuto la risposta che cercavi, alternativamente non so cos'altro dirti per aiutarti ulteriormente.

dino72:
Purtroppo non siamo tutto professori

...ma io dico, uno sta qui a perder tempo aggratis, e deve anche essere ripreso per eventuali (tra l'altro lecite) richieste per facilitare la soluzione del problema!!! >:(

Non mi pare ti sia stato chiesto il mondo, ma solo di inserire qualche serial.print e riportare qui il log seriale di un intero ciclo!!!, e, aggiungo io, uno schema del progetto, per escludere eventuali problemi hardware!

Visto che chi ti aiuta non ha in mano il tuo progetto, sicuramente non ha tempo di costruirselo e, cosa più importante, non ha la famosa "sfera di cristallo", quindi... "AiutateCi ad aiutarVi" (cit.)

Se poi, questo non Vi sta bene, ci può sempre rivolgere all'autore originale del progetto.

Federico

PS
... e per farti capire che questa mia non è per far polemica, ma solo per cercare di farti capire che le richieste non sono mai fine a se stesse, ti consiglio, quando usi gli SR04/SRF05, di utilizzare questa libreria che risolve vari problemi legati a quel sensore (non il tuo, per ora); l'autore è un frequentatore del forum.

io la vedo semplice, scusate se mi permetto

Scusatemi, il resto del post era sbagliato

Sono giovane, ma non maleducato

C1P8:
io la vedo semplice, scusate se mi permetto

tutto giusto se non fosse che c'è questo if

if(counter < 20){

esclude tutta la sezione dopo venti letture identiche, o quantomeno è ciò che vorrebbe

Vero

Ho sbagliato

Ora cancello scusate

C1P8:
Sono giovane, ma non maleducato

Tranquillo, NON è certo maleducazione, tutti possiamo commettere errori ... magari ci fosse qualcuno che riesce a scrivere codice sempre senza sbagli :smiley:

L'importante è, anche senza cancellare il contenuto del post, indicare chiaramente che c'è un'errore e che quindi non va bene :wink:

Guglielmo

C1P8:
Sono giovane, ma non maleducato

Tranquillo è sempre meglio osare e sbagliare, che non osare, significa che hai ragionato sul problema :slight_smile:

Federico

Domani avrò la possibilità di riprovare il progetto e posterò messaggi di debug e monitor serial
Nel frattempo chiedo scusa se sono stato arrogante
A domani e grazie in anticipo