[Risolto] Problemi con hc-sr04

Ciao a tutti, ahhh, davvero non c’è la faccio più, è da giorni che sono alla mano di 6 sensori hc-sr04, semplicemente non rilevano le distanze. Esempio “nel caso non mi fossi spiegato bene”. Io lo connetto al computer per fornire l’alimentazione e delle volte funziona mentre delle altre no, inverto i cavi e prima va poi magicamente non più. I sensori sono 6 e sono collegati 4 ad un arduino e 2 ad un altro. Ecco la parte del codice interessata

1o arduino:

long duration1;
int distanc
e1;
int safetyDistance1;
long duration2;
int distance2;
int safetyDistance2;
long duration3;
int distance3;
int safetyDistance3;
long duration4;
int distance4;
int safetyDistance4;
const int trigPin1 = 3;
const int echoPin1 = 5;
const int trigPin2 = 14;
const int echoPin2 = 15;
const int trigPin3 = 18;
const int echoPin3 = 19;
const int ledPin1 = 4;
const int ledPin2 = 7;
const int ledPin3 = 8;
const int ledPin4 = 12;
const int trigPin4 = 17;
const int echoPin4 = 16;

void setup() {
  Serial.begin(9600);
  pinMode(trigPin4, OUTPUT);
  pinMode(echoPin4, INPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);
  pinMode(ledPin3, OUTPUT);
}

void loop() {
  digitalWrite(trigPin4, LOW);
  delayMicroseconds(5);

  digitalWrite(trigPin4, HIGH);
  delayMicroseconds(5);
  digitalWrite(trigPin4, LOW);

  duration4 = pulseIn(echoPin4, HIGH);

  distance4 = duration4 * 0.034 / 2;

  safetyDistance4 = distance4;
  if (safetyDistance4 <= 15) {
    digitalWrite(ledPin4, HIGH);
  }
  else {
    digitalWrite(ledPin4, LOW);
  }
Serial.print("Distance4: ");
Serial.println(distance4);

digitalWrite(trigPin1, LOW);
  delayMicroseconds(5);

  digitalWrite(trigPin1, HIGH);
  delayMicroseconds(5);
  digitalWrite(trigPin1, LOW);

  duration1 = pulseIn(echoPin1, HIGH);

  distance1 = duration1 * 0.034 / 2;

  safetyDistance1 = distance1;
  if (safetyDistance1 <= 15) {
    digitalWrite(ledPin1, HIGH);
  }
  else {
    digitalWrite(ledPin1, LOW);
  }
Serial.print("Distance1: ");
Serial.println(distance1);

  digitalWrite(trigPin2, LOW);
  delayMicroseconds(5);

  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(5);
  digitalWrite(trigPin2, LOW);

  duration2 = pulseIn(echoPin2, HIGH);

  distance2 = duration2 * 0.034 / 2;

  safetyDistance2 = distance2;
  if (safetyDistance2 <= 15) {
    digitalWrite(ledPin2, HIGH);
  }
  else {
    digitalWrite(ledPin2, LOW);
  }
Serial.print("Distance2: ");
Serial.println(distance2);

  digitalWrite(trigPin3, LOW);
  delayMicroseconds(5);

  digitalWrite(trigPin3, HIGH);
  delayMicroseconds(5);
  digitalWrite(trigPin3, LOW);

  duration3 = pulseIn(echoPin3, HIGH);

  distance3 = duration3 * 0.034 / 2;

  safetyDistance3 = distance3;
  if (safetyDistance3 <= 15) {
    digitalWrite(ledPin3, HIGH);
  }
  else {
    digitalWrite(ledPin3, LOW);
  }
  Serial.print("Distance3: ");
Serial.println(distance3);`
2o: const int trigPin1 = 22;
const int echoPin1 = 23;
const int trigPin3 = 44;
const int echoPin3 = 45;
long duration1;
int distance1;
int safetyDistance1;
long duration3;
int distance3;
int safetyDistance3;
const int ledPin1 = 39;
const int ledPin2 = 40;
const int ledPin3 = 41;


void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
  
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);
  pinMode(ledPin3, OUTPUT);
}

void loop() {
digitalWrite(trigPin1, LOW);
  delayMicroseconds(5);

  digitalWrite(trigPin1, HIGH);
  delayMicroseconds(5);
  digitalWrite(trigPin1, LOW);

  duration1 = pulseIn(echoPin1, HIGH);

  distance1 = duration1 * 0.034 / 2;

  safetyDistance1 = distance1;
  if (safetyDistance1 <= 15) {
    digitalWrite(ledPin1, HIGH);
  }
  else {
    digitalWrite(ledPin1, LOW);
  }
Serial.print("Distance1: ");
Serial.println(distance1);
  digitalWrite(trigPin3 , LOW);
  delayMicroseconds(5);

  digitalWrite(trigPin3, LOW);
  delayMicroseconds(5);

  digitalWrite(trigPin3, HIGH);
  delayMicroseconds(5);
  digitalWrite(trigPin3, LOW);

  duration3 = pulseIn(echoPin3, HIGH);

  distance3 = duration3 * 0.034 / 2;

  safetyDistance3 = distance3;
  if (safetyDistance3 <= 15) {
    digitalWrite(ledPin3, HIGH);
  }
  else {
    digitalWrite(ledPin3, LOW);
  }
  Serial.print("Distance3: ");
Serial.println(distance3);

Per “non funziona” intendo che rilevano valore 0 all’improvviso
Spero mi possiate rispondere il prima possibile perchè non capisco proprio dove sbaglio.
Ps mi scuso per non aver utilizzato il giusto font per il codice ma non capisco dove si trova con la nuova interfaccia. Grazieee

Per il codice devi editare il tuo post, selezionare il codice e premere sul bottone </> (quello dopo le vrigolette ")

@federicofrasca : in conformità al REGOLAMENTO, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post) e racchiudere il codice all’interno dei tag CODE.

In pratica, devi selezionare il tuo codice e poi usare il bottone </> per metterlo nell’apposita area dedicata al codice.

Ah, prima però DEVI formattarlo decentemente … lo prendi nell’IDE, premi CTRL T (formattazione automatica), lo reincolli nel post che editi e lo racchiudi nei tag code. Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non avrai sistemato il codice, nel rispetto del suddetto regolamento nessuno ti risponderà, quindi ti consiglio di farlo al più presto. :wink:

Ok fatto, mi scuso per l’accaduto

E’ una cosa (almeno per me) stranota da alcuni anni: gli SR04 fanno SCHIFO, io ne provai almeno 4 o 5 e tutti avevano esattamente quel problema ossia ogni tanto si “bloccavano” sullo zero e non si schiodavano fino a che non li resetti! A suo tempo scrissi anche una libreria per aggirare il problema, ma da quel momento ho sempre acquistato gli SRF05 (e la libreria l’ho adattata anche a loro, quantomeno per renderla “duale”) che costano alcuni cent in più ma non mi hanno mai dato problemi, per cui credo che tu possa risolvere con gli SRF05.

Per la cronaca, su GitHub trovi pure la libreria che scrissi a suo tempo, nella documentazione trovi tutto:
SRF05

Grazie, da oggi in poi non li comprerò più allora, se davvero sono meglio gli SRF05 e costano poco più allora perchè non usarli, io però ho un problema più grande, io ho comprato un kit da 5 e 1 non funziona, il problema è che non ho la garanzia quindi mi potresti gentilmente inviare questa libreria. Grazie

La libreria puoi scaricarla al link GitHub che ti ho indicato (clicca sul pulsante “Code” quindi “Download ZIP”), installala usando l’IDE (“Aggiungi libreria da file ZIP”) poi vedi gli esempi per capire come usarla.

PS: in ogni caso te la metto anche come allegato: SRF05-master.zip (17.8 KB)

non si schiodavano fino a che non li resetti! A suo tempo scrissi anche una libreria per aggirare il problema

Ahhh, peccato avevo pensato avessi scritto una libreria per far funzionare correttamente gli SR04, per questo te l’ho chiesta, vb grazie lo stesso. Nel caso valuto la possibilità di acquistare un SRF05 ed utilizzare la tua libreria.

No, no, leggi bene la documentazione, c’è nella libreria proprio una opzione per cercare di aggirare proprio il blocco degli SR04…

Stupido me, ah ah, avevo solo letto il titolo e dato uno sguardo superficiale, non sapevo fosse contenuto nella stessa cartella. Grazie infinite

Accidenti, ho caricato il codice e funzionava, poi ho staccato e una volta che si prova a visualizzare la distanza succede questo (foto allegata)

Da come risultato 0.05 o 0.07 in maniera casuale

Se metti MaxDist=9999 annulli di fatto il timeout della lettura (9999 cm sono 99 metri, ben al di sopra del ranfe del sensore!), e puoi prendere qualsiasi eco riflesso di ping inviati in precedenza, soprattutto perché i ping nell’esempio non hanno un delay quindi li “spara” rapidamente. Imposta MaxDist ad un valore ragionevole per te, ad esempio 200 (2 metri) e metti un delay() (diciamo tra 100 e 500) tra una lettura e la successiva, e fammi sapere.

Grazie, finalmente ho risolto, ho adattato il codice al mio progetto e modificato alcune cose, come ho già detto in alcuni post in precedenza questi sensori mi servono per una Arduino Car. I problemi erano 2, uno quello che viene detto nel mio primo post e due, una singola batteria da 9 volt non era sufficiente e quindi ne ho inserite due (ovviamente su due Arduino differenti). Riporto il codice per chi in futuro fosse interessato:

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include <SRF05.h>

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
SRF05 Sensor1(3, 5, 200, 5);
SRF05 Sensor2(14, 15, 200, 5);
SRF05 Sensor3(18, 19, 200, 5);
int led1;
int led2;
int led3;

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(9600);
  Sensor1.Unlock = true;
  Sensor2.Unlock = true;
  Sensor3.Unlock = true;

  if (!myDFPlayer.begin(mySoftwareSerial)) {
    while (true);
  }
  myDFPlayer.volume(15);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}

void loop() {
  static unsigned long timer = millis();

  if (millis() - timer > 900000) {
    timer = millis();
    myDFPlayer.next();
  }
  if ( Sensor1.Read() > -1 ) {
    if ( Sensor1.Distance == 0 ) {
      Serial.println("Out of range");
    } else if (Sensor1.Distance <= 15) {
      digitalWrite(led1, HIGH);
      Serial.print("Dist1: ");
      Serial.print(Sensor1.Distance);
      Serial.println(" cm");
    }
    else if (Sensor1.Distance > 14) {
      digitalWrite(led1, LOW);
      Serial.print("Dist1: ");
      Serial.print(Sensor1.Distance);
      Serial.println(" cm");
    }
  }
  if ( Sensor2.Read() > -1 ) {
    if ( Sensor2.Distance == 0 ) {
      Serial.println("Out of range");
    } else if (Sensor2.Distance <= 15) {
      digitalWrite(led2, HIGH);
      Serial.print("Dist2: ");
      Serial.print(Sensor2.Distance);
      Serial.println(" cm");
    }
    else if (Sensor2.Distance > 14) {
      digitalWrite(led2, LOW);
      Serial.print("Dist2: ");
      Serial.print(Sensor2.Distance);
      Serial.println(" cm");
    }
  }
  if ( Sensor3.Read() > -1 ) {
    if ( Sensor3.Distance == 0 ) {
      Serial.println("Out of range");
    } else if (Sensor3.Distance <= 15) {
      digitalWrite(led3, HIGH);
      Serial.print("Dist3: ");
      Serial.print(Sensor3.Distance);
      Serial.println(" cm");
    }
    else if (Sensor3.Distance > 14) {
      digitalWrite(led3, LOW);
      Serial.print("Dist3: ");
      Serial.print(Sensor3.Distance);
      Serial.println(" cm");
    }
  }
}

In questo vi è anche l’uso di uno speaker in combo con un
DFPlayer_Mini_SKU_DFR0299-DFRobot

#include <AFMotor.h>
#include <SRF05.h>

AF_DCMotor m1(1);
AF_DCMotor m2(2);
AF_DCMotor m3(3);
AF_DCMotor m4(4);

int i = 0;
int j = 0;
char state;
int vSpeed = 255 ;

SRF05 Sensor1(23, 22, 200, 5);
SRF05 Sensor2(26, 27, 200, 5);
SRF05 Sensor3(51, 50, 200, 5);
int led1;
int led2;
int led3;

void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
  m1.run(RELEASE);
  m2.run(RELEASE);
  m3.run(RELEASE);
  m4.run(RELEASE);
  Sensor1.Unlock = true;
  Sensor2.Unlock = true;
  Sensor3.Unlock = true;
}

void loop() {
  if ( Sensor1.Read() > -1 ) {
    if ( Sensor1.Distance == 0 ) {
      Serial.println("Out of range");
    } else if (Sensor1.Distance <= 15) {
      digitalWrite(led1, HIGH);
      Serial.print("Dist1: ");
      Serial.print(Sensor1.Distance);
      Serial.println(" cm");
    }
    else if (Sensor1.Distance > 14) {
      digitalWrite(led1, LOW);
      Serial.print("Dist1: ");
      Serial.print(Sensor1.Distance);
      Serial.println(" cm");
    }
  }
  if ( Sensor2.Read() > -1 ) {
    if ( Sensor2.Distance == 0 ) {
      Serial.println("Out of range");
    } else if (Sensor2.Distance <= 15) {
      digitalWrite(led2, HIGH);
      Serial.print("Dist2: ");
      Serial.print(Sensor2.Distance);
      Serial.println(" cm");
    }
    else if (Sensor2.Distance > 14) {
      digitalWrite(led2, LOW);
      Serial.print("Dist2: ");
      Serial.print(Sensor2.Distance);
      Serial.println(" cm");
    }
  }
  if ( Sensor3.Read() > -1 ) {
    if ( Sensor3.Distance == 0 ) {
      Serial.println("Out of range");
    } else if (Sensor3.Distance <= 15) {
      digitalWrite(led3, HIGH);
      Serial.print("Dist3: ");
      Serial.print(Sensor3.Distance);
      Serial.println(" cm");
    }
    else if (Sensor3.Distance > 14) {
      digitalWrite(led3, LOW);
      Serial.print("Dist3: ");
      Serial.print(Sensor3.Distance);
      Serial.println(" cm");
    }
  }

  m1.setSpeed(vSpeed);
  m2.setSpeed(vSpeed);
  m3.setSpeed(vSpeed);
  m4.setSpeed(vSpeed);
  if (Serial1.available() > 0) {
    state = Serial1.read();
    Serial.println(state);
  }


  /***********************Forward****************************/
  //If state is equal with letter 'A', car will go forward!
  if (state == 'A') {
    m1.run(FORWARD);
    m2.run(FORWARD);
    m3.run(FORWARD);
    m4.run(FORWARD);

  }
  /***********************Backward****************************/
  //If state is equal with letter 'I', car will go backward
  else if (state == 'I') {
    m1.run(BACKWARD);
    m2.run(BACKWARD);
    m3.run(BACKWARD);
    m4.run(BACKWARD);
  }
  /***************************Left*****************************/
  //If state is equal with letter 'S', wheels will turn left
  else if (state == 'S') {
    m1.run(FORWARD);
    m2.run(BACKWARD);
    m3.run(BACKWARD);
    m4.run(FORWARD);
  }
  /***************************Right*****************************/
  //If state is equal with letter 'D', wheels will turn right
  else if (state == 'D') {
    m1.run(BACKWARD);
    m2.run(FORWARD);
    m3.run(FORWARD);
    m4.run(BACKWARD);
  }
  /************************Bonus*****************************/

  /************************Bonus*****************************/

  /************************Bonus*****************************/

  /**********************Bonus***************************/

  /************************Bonus*****************************/
  //If state is equal with letter 'S', stop the car
  else if (state == 'P') {
    m1.run(RELEASE);
    m2.run(RELEASE);
    m3.run(RELEASE);
    m4.run(RELEASE);
  }

}

In questo codice invece c’è in aggiunta il controllo dei motori tramite bt. Grazie ancora @docdoc

Molto bene, felice di essere stato utile.

Però occhio, nel secondo listato che hai messo mancano gli “Unlock”… :wink: