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