Salve a tutti ragazzi,
Come da titolo sto cercando di rilevare una velocità quando un corpo attraversa due sensori ultrasuoni, una funzione molto semplice, catturo il tempo del 1° sensore con millis(), poi il secondo e dalla differenza dei due ricavo il tempo. In realtà la velocità non mi serve a molto, la uso solo per rilevare un corpo che sta attraversando i due senso perchè al passaggio di un corpo (quindi con vel>0) devo far muore un servo.
Allego il mio codice:
#include <Servo.h>
#include <NewPing.h>
//HC RS04 Sensore ultrasuoni
int triggerPort = 6;
int echoPort = 7;
int triggerPort2 = 8;
int echoPort2 = 9;
void setup() {
pinMode(13, OUTPUT);
pinMode( triggerPort, OUTPUT );
pinMode( echoPort, INPUT );
pinMode( triggerPort2, OUTPUT );
pinMode( echoPort2, INPUT );
Serial.begin( 9600 );
}
void loop() {
delay(10); // Wait 50ms between pings
int t1 = 0;
digitalWrite( triggerPort, LOW );
delayMicroseconds (10);
//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;
int t;
if ( (r>=0 && r<150) ) { // ok. l'oggetto è passato dal via
t = millis(); // Mi segno il tempo di partenza
while ( (millis() - t ) < 10000 ) // tempo massimo ammesso 10 secondi
{
//porta bassa l'uscita del trigger
digitalWrite( triggerPort2, LOW );
delayMicroseconds (10);
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort2, HIGH );
delayMicroseconds( 10 );
digitalWrite( triggerPort2, LOW );
long duration2 = pulseIn( echoPort2, HIGH );
long r2 = 0.034 * duration2 / 2;
if ( (r2>=0 && r2<150) ) { // Ok e' arrivato al secondo sensore
t1 = millis(); // segno il tempo di arrivo
break ; // esco dal while prima che scada
}
t1 = 0 ;
}
if ( !t1 ) {
Serial.println("fuori tempo massimo");
digitalWrite(13, HIGH);
}
}
int tempo = (t1 - t ) ;
//int vel=((3.2*0.01)/(tempo*0.001));
if (tempo > 0 ) {
Serial.print ("Metri/sec ");
Serial.println(tempo);
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
}
else digitalWrite(13, LOW);
}
PROBLEMA: Il codice pare funzionare, se passo la mano con una certa velocità si accende la lampadina (uso un led per simulare la funzione del servo e poi in tal caso sostituirò) il problema è che anche quando non c'è nessun movimento e quindi la velocità=0 segna ugualmente una velocità e di conseguenza il LED si accende anche quando non ce ne è bisogno, quindi anche senza il passaggio di nessun corpo.
GRAZIE in anticipo per il vostro aiuto.