Rilevamento tempo trascorso tra due sensori ad ultrasuoni [Risolto]

Salve a tutti, sto realizzando un progetto che riguarda l'impiego di due sensori HC-SR04, vorrei calcolare il tempo trascorso dalla rilevazione di un ostacolo sul primo sensore e fermarlo al rilevamento di un ostacolo del secondo sensore, fatto ciò desideravo calcolare quindi la variazione di tempo.
Ho provato utilizzando varie librerie e con millis, ma con scarsi risultati, chiedevo alla comunità un consiglio su come calcolare questo "Delta T".
Il programma scritto è il seguente, preciso che i due sensori rilevano in maniera distinta e quindi contemporaneamente gli ostacoli posti davanti a loro.
Ho momentaneamente inserito un display che mi stampa la distanza interposta tra ostacoli e sensori, a puro scopo di controllare il funzionamento dei sensori.

#include <NewPing.h>
#include <Wire.h>  // Libreria di sistema - E' richiesta da I2CIO.cpp
#include <LiquidCrystal_I2C.h> // Libreria LCD I2C

#define TRIGGER_PIN 2 
#define ECHO_PIN 3 
#define MAX_DISTANCE 50

#define TRIGGER_PINA 4
#define ECHO_PINA 5
#define MAX_DISTANCE 50

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
NewPing sonara(TRIGGER_PINA, ECHO_PINA, MAX_DISTANCE);

float SetDistance = 0;
float ValueDist = 0;
float ValueDistA = 0;


void setup() {
 Serial.begin(115200);
 lcd.begin(16,2);
 lcd.clear();
lcd.setCursor(0,0);

}

void loop() {
 delay(50); 
  float uS = sonar.ping(); 
 ValueDist = uS / US_ROUNDTRIP_CM;
 
 Serial.print("Ping1: ");
 Serial.print(ValueDist); 
 Serial.println("cm");
 lcd.setCursor(0,0);
 lcd.print("SENS1");
 lcd.print(" ");
 lcd.print(ValueDist,1);
 lcd.print(" cm ");
 
 delay(60); 
 float uSa = sonara.ping(); 
 ValueDistA = uSa / US_ROUNDTRIP_CM;
 
 Serial.print("Ping2: ");
 Serial.print(ValueDistA); 
 Serial.println("cm");
lcd.setCursor(0,1);
lcd.print("SENS2");
lcd.print(" ");
lcd.print(ValueDistA,1);
lcd.print(" cm ");

}

Basta che salvi il valore di millis() al primo rilevamento, poi quello al secondo e fai la differenza: in quel modo avrai il tempo intercorso in millisecondi.

Vedi se anche il link nella mia firma ti può aiutare.

Non ho capito che senso ha rilevare la differenza di due rilevazioni.

Ho guardato la libreria.
Il ping() é bloccante che significa che la funziona aspetta finche c'é un ritorno di eco oppure é superato il tempo massimo.

A che distanza ci sono i ogetti da rilevare? La distanza é sempre uguale?

Ciao Uwe

Ciao Grazie per le risposte :slight_smile: , Uwe i sensori sono posti ad una certa distanza l'uno dall'altro mi serve che parta un timer alla rilevazione di un ostacolo del primo sensore e che il timer si blocchi una volta che c'è una rilevazione del secondo sensore, e che quindi mi calcoli il tempo impiegato tra le due rilevazioni :), sto provando ad usare millis vediamo come va :slight_smile:

MassimoN:
e che quindi mi calcoli il tempo impiegato tra le due rilevazioni :), sto provando ad usare millis vediamo come va :slight_smile:

Non ti serve nessun timer, hai le due letture dei sensori e dato che sono legate al tempo di volo per semplice differenza ottieni il tempo che intercorre tra i due eventi.

astrobeed:
Non ti serve nessun timer, hai le due letture dei sensori e dato che sono legate al tempo di volo per semplice differenza ottieni il tempo che intercorre tra i due eventi.

Credo di aver capito cosa intendi, forse mi sono espresso male nella descrizione iniziale, devo calcolare il tempo che impiega un oggetto per andare dal primo sensore posto in una distanza x al secondo sensore posto in un altra distanza x, intendevo usare una funzione di tempo in quanto avviandola al primo sensore e fermandola al passaggio del secondo, sarei stato in grado di determinare il tempo impiegato per percorrere la distanza tra i due sensori.
Se magari ho capito male perdonami.

Salve, ho provato a scrivere il programma usando millis, prendendo il primo tempo al passaggio di un oggetto davanti il primo sensore, il secondo tempo quando praticamente l'oggetto è tra i due sensori, ed infine quando arriva davanti al secondo sensore.
Il programma di per se funziona l'unico problema è che all'avvio il programma inizia a contare il tempo in cui non c'è niente quindi tra i due sensori perchè ovviamente è impostato a zero...come posso risolvere? facendo in un certo senso dipendere la seconda rilevazione dalla prima? allego il codice usato, spero di essermi spiegato bene.

#include <NewPing.h>
#include <Wire.h>  // Libreria di sistema - E' richiesta da I2CIO.cpp
#include <LiquidCrystal_I2C.h> // Libreria LCD I2C

#define TRIGGER_PIN 2 // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN 3 // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 20 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

#define TRIGGER_PINA 4
#define ECHO_PINA 5
#define MAX_DISTANCE 20

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
NewPing sonara(TRIGGER_PINA, ECHO_PINA, MAX_DISTANCE);

float SetDistance = 0;
float ValueDist = 0;
float ValueDistA = 0;

long t = 0.0;
long t1 = 0.0;
long t2 = 0.0;
long tempo = 0.0;
void setup() {
  Serial.begin(115200);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);

}

void loop() {
  delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
  float uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
  ValueDist = uS / US_ROUNDTRIP_CM;

  delay(60); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
  float uSa = sonara.ping(); // Send ping, get ping time in microseconds (uS).
  ValueDistA = uSa / US_ROUNDTRIP_CM;

  if (ValueDist > 10) {
    t = millis();
  }
   if(ValueDist == 0) {
    t1 = millis();
  }
  if(ValueDistA > 10) {
    t2 = millis();
  }
  tempo = (t + t1 - t2) / 1000;
  Serial.println(tempo);
}

Non basta fare la stampa (e il calcolo) solo se t2 > 0? Anzi, meglio ancora se t2 > t1.

SukkoPera:
Non basta fare la stampa (e il calcolo) solo se t2 > 0? Anzi, meglio ancora se t2 > t1.

Scusami a quale parte di programma ti riferisci?

Alle ultime righe, dove calcoli e stampi il risultato.

Vuoi allora misurare il tempo di un ogetto per arrivare dal primo sensore al secondo.

Di che tempi stiamo parlando? Le distanze sensore ultrasuoni - oggetto sono sempre uguali?

Usa delle fotocelle che sono molto piú veloci nella rilevazione del oggetto.

Ciao Uwe

uwefed:
Vuoi allora misurare il tempo di un ogetto per arrivare dal primo sensore al secondo.

Di che tempi stiamo parlando? Le distanze sensore ultrasuoni - oggetto sono sempre uguali?

Usa delle fotocelle che sono molto piú veloci nella rilevazione del oggetto.

Ciao Uwe

Si esattamente, per quanto riguarda i tempi siamo nell'ordine dei secondi e si le distanze sono sempre uguali :slight_smile: purtroppo non ho fotocelle a disposizione, pensavo di emulare in qualche modo con questi sensori che comunque essendo usati a distanze relativamente piccole funzionano bene per quello che devo realizzare :slight_smile:

Il tempo lo devi prendere subito dopo la lettura di ogni sensore, non alla fine come fai tu

if (ValueDist > 10) {
    t = millis();  }
   if(ValueDist == 0) {
    t1 = millis();  }
  if(ValueDistA > 10) {
    t2 = millis();  }

ovvero, una cosa cosi'

delay(50); // Wait 50ms between pings
  t1 = 0 ;
  int uS = sonar.ping_cm(); legge la distanza in cm
  if ( uS > 0 ) { // ok. l'oggetto è passato dal via
    t = millis();  // Mi segno il tempo di partenza
    while ( (millis() - t ) < 10000 ) // tempo massimo ammesso 10 secondi
    {
      uS = sonara.ping_cm(); legge la distanza in cm
      if ( uS > 0 ) { // 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");
    }
  }
  tempo = (t1 - t ) ;
  if (tempo  > 0 ) {
    Serial.print ("Millisecondi  ");
    Serial.println(tempo);
  }

Se la distanza é fissa allora metterei un timout della misura della distanza in modo che il sensore sia pronto per una successiva misura piú velocemente possibile. È da controllare che non ci siano eco di parti lontane che potrebbero influenziare una sucessica misura. È anche possibile che metti un target a una distanza piú lunga in modo da avre un eco dopo una certo tempo e uno piú corto col oggetto davanti.

Ciao Uwe

Brunello:
Il tempo lo devi prendere subito dopo la lettura di ogni sensore, non alla fine come fai tu

if (ValueDist > 10) {

t = millis();  }
  if(ValueDist == 0) {
    t1 = millis();  }
  if(ValueDistA > 10) {
    t2 = millis();  }





ovvero, una cosa cosi'



delay(50); // Wait 50ms between pings
  t1 = 0 ;
  int uS = sonar.ping_cm(); legge la distanza in cm
  if ( uS > 0 ) { // ok. l'oggetto è passato dal via
    t = millis();  // Mi segno il tempo di partenza
    while ( (millis() - t ) < 10000 ) // tempo massimo ammesso 10 secondi
    {
      uS = sonara.ping_cm(); legge la distanza in cm
      if ( uS > 0 ) { // 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");
    }
  }
  tempo = (t1 - t ) ;
  if (tempo  > 0 ) {
    Serial.print ("Millisecondi  ");
    Serial.println(tempo);
  }

Adesso ho capito dov'era il problema :slight_smile: ora funziona perfettamente, grazie ancora a tutti per le risposte:)