Go Down

Topic: Sensore HC-SR04 e ostacolo davanti a sè per n-secondi (Read 1 time) previous topic - next topic

hyuma

Ho questo problema, vorrei fare in modo che se questo sensore individua un ostacolo davanti a sè per 5 secondi succede una cosa, mentre se l'ostacolo resta solo un secondo ne succede un'altra... Non so se l'HC-SR04 riesce a calcolare il tempo, avete qualche esempio da mostrarmi? grazie mille!


gpb01

Il HC-SR04 è un sensore ad ultrasuoni che ti permette di misurare la distanza di un ostacolo (... e quindi la sua presenza o meno) ... STOP.

Tutto il resto dei farlo tu da codice ...
... vedi che c'è un ostacolo, ti segni il tempo
... verifichi se c'è ancora l'ostacolo e guardi quanto tempo è passato
... se c'è ancora ed è passato il tempo X fai quello che devi fare per tempo X
... se c'è ancora ed è passato il tempo Y ... fai quello che devi fare per il tempo Y

Guglielmo
Search is Your friend ... or I am Your enemy !

hyuma

come faccio a salvare in una variabile se ho un'ostacolo?

gpb01

Hyuma, dalla tua presentazione vedo che all'università hai fatto informatica ...
... NON puoi chiedermi "come faccio a salvare in una variabile se ho un'ostacolo" ... perché mi preoccupi  :smiley-twist:

Guglielmo

P.S.: Occorrendo, una rinfrescatina ... QUI   ;)
Search is Your friend ... or I am Your enemy !

hyuma

va be, non c'era bisogno di fare i saccenti, comunque ok risolvo da solo

gpb01

:o :o :o ... saccenti ? ? ?

Ohi, ma ti rendi conto di quello che scrivi ? ? ?

Ti presenti, dici che hai fatto informatica, ti spiego cosa devi fare da programma ... e mi chiedi "come salvare in una variabile" ? ? ? ... credo che siano le basi non ti pare ?

Guglielmo
Search is Your friend ... or I am Your enemy !

hyuma

Questa cosa di usare il grassetto è alquanto fastidiosa, comunque pensavo di salvarlo con un booleano, ritornando true se detecto un ostacolo

gpb01

... bhe, prima decidi a che distanza consideri un qualche cosa un ostacolo, visto che quel sensore ti permette di misurare la distanza.  O qualsiasi cosa hai davanti, a qualsiasi distanza, è da considerare ostacolo ?

Guglielmo

P.S.: Frequenta il forum e vedrai che faccio sempre abbondante uso della formattazione ... grassetti, italici, sottolineati ... servono ad evidenziare alcuni aspetti ... né più né meno.
Search is Your friend ... or I am Your enemy !

hyuma

Code: [Select]

int led = 12;
int trigger = 5;
int echo = 4;
unsigned long previousMillis = 0;
int interval = 1000;

void setup() {

  pinMode(led, OUTPUT);
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
  Serial.begin(9600);

  // put your setup code here, to run once:

}

void loop() {

  unsigned long currentMillis = millis();

  digitalWrite(trigger, LOW);

  //invia un impulso di 10microsec su trigger
  digitalWrite(trigger, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger, LOW);

  long duration = pulseIn(echo, HIGH);
  long distance = 0.034 * duration / 2;

  if (currentMillis - previousMillis >= interval) {

    if (distance < 10)
    {
      previousMillis = currentMillis; // current time
      ...
    }
  }
}



sono bloccato con la logica, come faccio a sapere se ho ancora un'ostacolo?

hyuma

Code: [Select]

ho fatto un po' di modifiche usando un tempo iniziale:

int led = 12;
int trigger = 5;
int echo = 4;

void setup() {

  pinMode(led, OUTPUT);
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
  Serial.begin(9600);

  // put your setup code here, to run once:

}

void loop() {

  unsigned long startTime = 0;

  digitalWrite(trigger, LOW);

  //invia un impulso di 10microsec su trigger
  digitalWrite(trigger, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger, LOW);

  long duration = pulseIn(echo, HIGH);
  long distance = 0.034 * duration / 2;

  if (distance < 10)
  {
    startTime = millis();
  }
  else {

    if (millis() - startTime > 5000) {
      digitalWrite(led, HIGH);
      delay(250);
      digitalWrite(led, LOW);
    }
  }
}



ho fatto qualche modifica ma ho ancora problemi

gpb01

Guarda, secondo me devi affrontare la cosa diversamente ...

Scrivi una funzione che si occupa esclusivamente di misurare la distanza con il sensore ad ultrasuoni e fai ritornare a questa funzione il valore "true" se c'è un oggetto, "false" se non c'è.

Poi, nel loop(), la chiami e se ti ritorna "true" prendi il tempo (millis()) e continui a chiamarla fino a quando non ritorna "false" o fino ad un tempo massimo da te deciso (... timeout).

Hai così la misura del tempo che l'oggetto è stato davanti al sensore ...

E' un'idea eh ... poi vedi tu ...

Guglielmo
Search is Your friend ... or I am Your enemy !

uwefed

sono bloccato con la logica, come faccio a sapere se ho ancora un'ostacolo?
Forse quando il tempo del eco e percui la distanza del oggetto rilevato é sotto un certo valore??

Ciao Uwe

hyuma

dovrei quasi esserci:

Code: [Select]

  if ( distance < 10 ) {
    if ( startTime == 0 ) {
      // set startTime
      startTime = millis();
      digitalWrite(led1, HIGH);
    } else {
      if ( millis() - startTime > interval ) {  // check if longer than interval
        digitalWrite(led1, LOW);
        digitalWrite(led, HIGH);
      }
    }
  } else {
    // reset startTime = 0
    startTime = 0;
    digitalWrite(led, LOW);
    digitalWrite(led1, LOW);
  }
}

hyuma

riuscite a dirmi cosa sto sbagliando?

Code: [Select]

int led = 12;
int led1 = 9;
int trigger = 5;
int echo = 4;
long interval = 5000;
long curTime = 0;
unsigned long startTime = 0;


void setup() {

  pinMode(led, OUTPUT);
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
  pinMode(led1, OUTPUT);


  // put your setup code here, to run once:

}

void loop() {

  digitalWrite(trigger, LOW);

  digitalWrite(trigger, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger, LOW);

  long duration = pulseIn(echo, HIGH);
  long distance = 0.034 * duration / 2;

  if (distance < 5) {

    if (startTime > 0) {
      curTime = millis();

      if (curTime - startTime > interval) {

        digitalWrite(led1, LOW);
        digitalWrite(led, HIGH);
      } else {

        Serial.println(startTime);
        digitalWrite(led, LOW);
      }
    } else {

      startTime = millis();
    }
  } else {
    startTime = 0;
    if (distance < 10) {

      digitalWrite(led1, HIGH);
      digitalWrite(led, LOW);
    } else {

      digitalWrite(led1, LOW);
      digitalWrite(led, LOW);
    }
  }
}

uwefed

riuscite a dirmi cosa sto sbagliando?
Sí, potrei dirtelo, ma non Ti piacerá. Decidi Tu cosa vuoi che faccia.
Ciao Uwe

Go Up