SR04 - Keine Abstand Messung möglich

Hallo Zusammen,

ich hab ein kleines Problem vielleicht hat hier ja jemand eine gute Idee. Für ein Brettspiel benötige ich einen Zufallsgenerator dieser funktioniert auch schon soweit. Nun möchte ich aber noch das “gewürfelt” wird wenn ich mit der Hand über einen Ultraschallsensor fahre quasi als Startsignal.

Angezeigt wird das ganze über einen Bildschirm, mit den Schaltern 1 & 2 kann die Spieleranzahl und Spiele erhöht werden. Schalter 3 ist aktuell das Startsignal soll dann aber durch den Sensor ersetzt werden.

Mein Problem ist nun das der Ultraschallsensor in diesem Code immer eine 0 ausgibt für den Abstand. In einem Testprogramm ohne meinen ganzen Code funktioniert der Sensor einwandfrei. Heißt ich glaube das etwas an meinem eigenen Code den Sensor beeinflusst.

Vielleicht hat hierzu ja jemand eine gute Idee.

Vielen Dank <3

#include <LiquidCrystal_I2C.h>
#include "SR04.h"

LiquidCrystal_I2C lcd(0x27, 16, 2);
SR04 sr04 = SR04(6,5);

  long abstand;  
  int zufallszahl;
  
  int spieleranzahl;  //Anzahl der aktiven Spieler
  int gegner;         //Gegner
  
  int anzahlspiele;  //Anzahl der aktiven Spiele
  int spiel;         //Welches Spiel wird gespielt

  int schalterzustand1;
  int schalterzustand2;
  int schalterzustand3;


void setup() {
  
  Serial.begin(9600);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  
  spieleranzahl = 0;
  spiel = 0;
  anzahlspiele = 0;
  gegner = 0;

  lcd.begin();
  lcd.backlight();
  lcd.print("Gegner: ");
  lcd.print(gegner);
  lcd.print(" (");
  lcd.print(spieleranzahl);
  lcd.print(")");

  lcd.setCursor(0,1);
  lcd.print("Spiel: ");
  lcd.print(spiel);
  lcd.print(" (");  
  lcd.print(anzahlspiele);
  lcd.print(")");

}

void loop() {
  
   abstand = sr04.Distance();
   Serial.println(abstand);
   delay(100);
  
schalterzustand1 = digitalRead(2);
schalterzustand2 = digitalRead(3);
schalterzustand3 = digitalRead(4);


if (schalterzustand1 == 1) {
  spieleranzahl = spieleranzahl + 1;
  delay(300);
}


if (schalterzustand2 == 1) {
  anzahlspiele = anzahlspiele + 1;
  delay(300);
}


if (schalterzustand1 == 1 && schalterzustand2 == 1) {
  anzahlspiele = 0;
  spieleranzahl = 0;
  delay(300);
}

if (schalterzustand3 == 1) {
  
  gegner = random(1, spieleranzahl+1);
  spiel = random(1, anzahlspiele+1);
  
  lcd.begin();
  lcd.backlight();
  lcd.print("Gegner: ");
  lcd.print(gegner);
  lcd.print(" (");
  lcd.print(spieleranzahl);
  lcd.print(")");

   lcd.setCursor(0,1);
   lcd.print("Spiel: ");
   lcd.print(spiel);
   lcd.print(" (");
   lcd.print(anzahlspiele);
   lcd.print(")");
  }


}

Da ich deine Library nicht kenne, kann ich nicht beurteilen, ob und wo du einen Fehler im Sketch hast. Somit poste bitte einen Link deiner Library.
Und wie misst du mit dem US-Sensor ?
Was und mit welchem Abstand misst du ?

Hier der Link zur Library:

Bisher wäre ich eigentlich nur froh wenn im Seriellen Monitor Zahlen sehen würde. Das Beispiel Programm mit dem der Sensor zahlen ausspuckt wäre dieses hier:

//www.elegoo.com
//2016.12.08
#include "SR04.h"

SR04 sr04 = SR04(6,5);
long a;

void setup() {
   Serial.begin(9600);

}

void loop() {
   a=sr04.Distance();
   Serial.print(a);
   Serial.println("cm");
   delay(100);
}

Du verwendest im ersten Sketch den Pin5 für den Sensor und hast den auch als Input definiert.
Das wird dein Fehler sein.

Dann könnte es sein, dass er pinMode(5, INPUT); in Deinem Code nicht mag.

Gruß Tommy

Hallo,

ich kenne die lib auch nicht , aber in der Zeile :

SR04 sr04 = SR04(6,5);

wird der Sensor sicher auf pin 6 und 5 angeschlossen

ich denke die Zeile

pinMode(5, INPUT);

ist der Übeltäter.

ich könnte mit vorstellen das die PinMode in der lib gemacht wird. Schau dir noch mal das Beispiel zur LIb an

Heinz

Dieter war erster :wink:

PS Tommy war schneller :wink:

Oh mist ihr habt recht die Zeile:

  pinMode(5, INPUT);

war noch ein Überbleibsel aus einer vorherigen Version. Hätte man drauf kommen können :roll_eyes:

VIELEN VIELEN DANK :kissing: :kissing: :kissing:

forster24:
Oh mist ihr habt recht die Zeile:

  pinMode(5, INPUT);

war noch ein Überbleibsel aus einer vorherigen Version. Hätte man drauf kommen können :roll_eyes:

VIELEN VIELEN DANK :kissing: :kissing: :kissing:

Alles klar....gerne.
Funktioniert es jetzt ?

Ja einwandfrei jetzt kommen die Abstandmessungen rein.

Hab die if-schleife mit den Zufallszahlen umgeschrieben auf: abstand < 10.

Jetzt “würfelt” er immer wenn ich mit der Hand über den Sensor fahre. Wahrscheinlich würde das mit anderen Sensoren einfacher gehen und ob man das jetzt braucht ist auch fraglich aber es funktioniert :DD

Vielen Dank :slight_smile:

Ich würde da eher einen Bewegungsmelder nehmen.
Und es gibt keine "if-Schleifen", das sind if-Abfragen.

@TO: Dein Zufall hat immer den gleichen Startwert. Das kann man verbessern:

// Sammelt an einem unbenutzten Analogeingang Werte für den Zufall
void seedRandom32() {
uint32_t wert = analogRead(A0) & 0x1;
  for(uint8_t i = 0; i < 32; i++) {
    wert = wert << 1;
    wert |= analogRead(analogPort) & 0x1;     
  }
  // Startwert für Zufall setzen
  randomSeed(wert);
}

Baue diese Funktion mit ein und rufe sie im setup auf.

Gruß Tommy