Rilevamento velocità con sensore ultrasuoni HC-SR04

Salve,
sto realizzando un progetto che utilizza un sensore a ultrasuoni HC-SR04 per rilevare oggetti in avvicinamento.
Mi servirebbe uno sketch che permetta ad uno speaker di suonare solo quando il tempo che intercorre tra un primo rilevamento (ad esempio 4m) ed un secondo rilevamento (es 1m) da parte del sensore a ultrasuoni, è sotto una data soglia di tempo (ad es. 10 secondi). Nel caso questa soglia di tempo fosse superiore ai 10 sec, allora lo speaker non dovrebbe suonare.
Ad esempio, partendo da un progetto simile a questo

si riesce a modificare il codice in modo utile?

#include <Ultrasonic.h>

#define speaker 4
#define red 7
#define green 8
#define TRIGGER_PIN  12
#define ECHO_PIN     13

int x;


Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);

void setup(){
//             Serial.begin(9600);
             pinMode(speaker, OUTPUT);
             pinMode(red, OUTPUT);
             pinMode(green, OUTPUT);
}

void loop(){
            float cmMsec, inMsec;
            long microsec = ultrasonic.timing();
          
            cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
            inMsec = ultrasonic.convert(microsec, Ultrasonic::IN);
//            Serial.print("MS: ");
//            Serial.print(microsec);
//            Serial.print(", CM: ");
//            Serial.print(cmMsec);
//            Serial.print(", IN: ");
//            Serial.println(inMsec);
//            
            if(cmMsec>=30) 
            digitalWrite(green, HIGH);
            
            if(cmMsec<30){
                           digitalWrite(green,LOW);
                           digitalWrite(red, HIGH);
                           
                           do{
                           long microsec = ultrasonic.timing();
                           cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
                           inMsec = ultrasonic.convert(microsec, Ultrasonic::IN);
                           x=map(cmMsec, 30, 0, 0, 500);
                           tone(speaker, x, 12);
                           
                             } while(cmMsec<=30);
                           
                           digitalWrite(red,LOW);
                         }

Grazie in anticipo!

Ciao e benvenuta. Ti invito alla lettura del regolamento, normalmente il primo post si usa per presentarsi e non per fare delle richieste. ;)

Ciao, scusa, ho rimediato presentandomi nell'apposita sezione.

Lasciando perdere le misurazioni a distanze fisse che complicano il problema, potresti risolvere con una funzione come

float speedcalc(void){
  long microsecA, microsecB;
  int delaytime = 50.0; // time between two consecutive measurements
  microsecA = ultrasonic.timing();
  delay(delaytime);
  microsecB = ultrasonic.timing();
  float distance = ultrasonic.convert(microsecA, Ultrasonic::CM) - ultrasonic.convert(microsecB, Ultrasonic::CM);
  return (distance * 10.0 / (float)delaytime); // speed --> m/s
 }

associandogli un IF se il valore della velocità è maggior o minore di una certa soglia.

È piú semplice fare le misure in intervalli costanti (con millis() ) e rilevare la differenza di distanza. facendo la differenza tra 2 letture consecutive. Ci dai il link alla libreria Ultrasonic.h? Ciao Uwe

uwefed: È piú semplice fare le misure in intervalli costanti (con millis() ) e rilevare la differenza di distanza. facendo la differenza tra 2 letture consecutive. Ci dai il link alla libreria Ultrasonic.h? Ciao Uwe

Eccolo: http://dl.dropbox.com/u/85784775/Libreria%20%2B%20Programma%20Ultrasuoni/%5BHC-SR04%5D%20Libreria%20%2B%20Programma.zip

PaoloP: Lasciando perdere le misurazioni a distanze fisse che complicano il problema, potresti risolvere con una funzione come

float speedcalc(void){
  long microsecA, microsecB;
  int delaytime = 50.0; // time between two consecutive measurements
  microsecA = ultrasonic.timing();
  delay(delaytime);
  microsecB = ultrasonic.timing();
  float distance = ultrasonic.convert(microsecA, Ultrasonic::CM) - ultrasonic.convert(microsecB, Ultrasonic::CM);
  return (distance * 10.0 / (float)delaytime); // speed --> m/s
 }

associandogli un IF se il valore della velocità è maggior o minore di una certa soglia.

Adesso provo... Intanto grazie! :)