perfezionamento codice sensore ping

Buongiorno a tutti, navigando in rete ho trovato un codice per un progetto che prevede l'utilizzo del sensore ad ultrasuoni HC-SR04, che ho modificato ed implementato aggiungendo un allarme.
Nel codice ho impostato tre diversi range di distanza che attiveranno tre led e l'emettitore acustico ( un piezo).
In teoria da 0 a 20 cm si accenderà un solo led e l'allarme si attiverà ad alta frequenza; da 20 a 40 cm si accenderanno due led e l'allarme si attiverà a media frequenza; da 40 in poi si accenderanno tutti e tre i led e l'allarme suonerà a bassa frequenza.
Il mio problema è che nell'ultimo caso, all'atto pratico, il led 3 continua a lampeggiare piuttosto che restare acceso.
Come posso risolvere questo problema?
Sto utilizzando arduino uno.
grazie mille. :wink: :wink: :wink: :wink: :wink: :wink:

     int triggerPort = 7;
    int echoPort    = 8;
    int Led_1       = 11;
    int Led_2       = 10;
    int Led_3       = 9;
    int alarm      = 6;
    
    void setup() {
    pinMode( triggerPort, OUTPUT );
    pinMode( echoPort, INPUT );
    pinMode( Led_1, OUTPUT );
    pinMode( Led_2, OUTPUT );
    pinMode( Led_3, OUTPUT );
    pinMode( alarm, OUTPUT);
    Serial.begin( 9600 );
    Serial.println( "Sensore Ultrasuoni: ");
    }
    void loop() {
    //porta bassa l'uscita del trigger
    digitalWrite( triggerPort, LOW );
    //invia un impulso di 10microsec su trigger
    digitalWrite( triggerPort, HIGH );
    delayMicroseconds( 10 );
    digitalWrite( triggerPort, LOW );
    long duration = pulseIn( echoPort, HIGH );
    long r = 0.034 * duration / 2;
    Serial.print( "durata: " );
    Serial.print( duration );
    Serial.print( " , " );
    Serial.print( "distanza: " );
    //dopo 38ms è fuori dalla portata del sensore
    if( duration > 38000 )  Serial.println( "fuori portata");
    else { Serial.print( r ); Serial.println( "cm" );
    }
    if (r < 20) { 
    digitalWrite(Led_1, HIGH);
    digitalWrite(alarm, HIGH);
    delay (100);
    digitalWrite(alarm, LOW);
    }
    if( r > 20) {
    digitalWrite(Led_1, HIGH);
    digitalWrite(Led_2, HIGH);    
    digitalWrite(alarm, HIGH);
    delay(400);
    digitalWrite(alarm, LOW); 
    }   
    if (r > 40) {
    digitalWrite(Led_1, HIGH);
    digitalWrite(Led_2,HIGH);
    digitalWrite(Led_3,HIGH);
    digitalWrite(alarm,HIGH);
    delay(800);
    digitalWrite (alarm,LOW);
    }
    //aspetta 150 millisecondi
    delay( 150 );
    //condizione di reset di tutti i led
    digitalWrite(Led_1, LOW);
    digitalWrite(Led_2, LOW);
    digitalWrite(Led_3, LOW);
    }

Penso che dovresti variare il delay

Scusate la mia inesperienza, ma negli altri casi non lo fa?
Perchè a seconda dei cari IF accendi i led, ma poi li riporti tutti in LOW alla fine del loop, e poi il ciclo riparte a quanto riesco a capire io, di conseguenza li riaccende e poi rifà il ciclo.

Trovato l'intoppo!!!
Praticamente quando è vera la condizione >40 è anche vera la condizione >20, quindi arduino le esegue insieme creando un garn casino :cold_sweat:
Basta correggere :
if (r >20); con if ((r>20) && (r<=40)) ;

gazza_mo:
Scusate la mia inesperienza, ma negli altri casi non lo fa?
Perchè a seconda dei cari IF accendi i led, ma poi li riporti tutti in LOW alla fine del loop, e poi il ciclo riparte a quanto riesco a capire io, di conseguenza li riaccende e poi rifà il ciclo.

Se ad ogni ciclo non riportassi tutti i led allo stato basso, questi resterebbero sempre accesi una volta verificatasi la condizione specifica.
In questo modo invece è come se resettassi tutti i led ad ogni cilco di esecuzione del programma.
:wink: