Ulreschallsensor liefert falsche Messwerte

Ich wollte eine Alarmanlage bauen, wo der Alarm losgeht wenn etwas näher als 50cm vom Ultraschallsensor/Entfernungsmessgerät entfernt ist. Es funktioniert, dass der Alarm losgeht allerdings hört der Alarm trotz noTone; nach der for Schleife nicht auf und bleibt bei etwa 1000hz stehen. Was habe ich falsch gemacht?
Hier der Code:

int trigger = 6;
int echo = 7;
long dauer = 0;
long entfernung = 0;
void setup()
{
  Serial.begin (9600);
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
}
void loop()
{
  noTone;
  digitalWrite(trigger, LOW);                 //die Entfernung wird Berechnet
  delay(5);
  digitalWrite(trigger, HIGH);
  delay(10);
  digitalWrite(trigger, LOW);
  dauer = pulseIn(echo, HIGH);
  entfernung = (dauer / 2) * 0.03432;
  if (entfernung >= 500 || entfernung <= 0) //dann wird die Entfernung oder "kein Messwert" ausgegebn
  {
    Serial.println("Kein Messwert");
  }
  else
  {
    Serial.print(entfernung);
    Serial.println(" cm");
  }
  if (entfernung < 50) {                    //wenn etwas weniger als 50cm vom Ultraschallsensor entfern ist soll der Alarm am Lautsprecher losgehen
    for (int i = 100; i < 1000; i++) {
      tone(3, i);
      delay(3);
      noTone;
    }
  }
  noTone;
}

edit: Dieses Problem ist gelöst, jetzt hab ich ein neues und habe dazu den Titel geändert

Meinst du den Funktionsaufruf

noTone(3);

?
In C++ ist einiges erlaubt, was nicht sehr sinnvoll ist, zB nur ein Funktionsname, statt die Funktion aufzurufen.

Ok danke das war das Problem glaub ich. Wie dumme Fehler ich manchmal mache.

Jetzt hab ich ein neues Problem:
Und zwar hab ich nichts vor den Sensor gehalten einfach nur dastehen lassen, und es gab falsche Messwerte:

Damit das Programm schneller läuft hab ich z.B. delay(10); durch delayMicroseconds(10) ersetzt aber wirklich schneller ist es nicht. Woran liegt das?
Hier mein ganzer Code:

#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

byte trigger = 6;
byte echo = 7;

bool ultra = true;
long code = 0;
int dauer = 0;
int entfernung = 0;

void setup() {
  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();

  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
}

void loop() {
  if ( mfrc522.PICC_IsNewCardPresent()) {
    rfid();
  }
  schranke();
  if (entfernung < 50) {
    alarm();
  }
}

bool rfid() {

  if (  mfrc522.PICC_ReadCardSerial()) {
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      code = ((code + mfrc522.uid.uidByte[i]) * 10);
    }

    Serial.print("Die Kartennummer lautet:");
    Serial.println(code);

    if (code == 2412160) {
      noTone(3);
      delay(5000);
      loop();
    }
  }
}

int schranke() {
  digitalWrite(trigger, LOW);
  delayMicroseconds(5);
  digitalWrite(trigger, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger, LOW);
  dauer = pulseIn(echo, HIGH);
  entfernung = (dauer / 2) * 0.03432;
  Serial.println(entfernung);
  return entfernung;
}

int alarm() {
  while (true) {
    for (int i = 100; i < 1000; i++) {
      tone(3, i);
      if (  mfrc522.PICC_ReadCardSerial()) {
        rfid();
      }
    }
    noTone(3);

  }
}

Reduziere mal Deine Debug-Ausgaben, die können den ganzen Controller blockieren.

Bringt nichts der Lautsprecher läuft trotzdem einfach los. Wahrscheinlich wegen falschen Messwerten.

Was genau meinst du mit "schneller laufen" ?
Und was soll der loop-Aufruf in der Funktion rfid ?

Wenn jemand während dem Alarm die richtige rfid Karte dranhält soll der Alarm ausgehen. Und durch den loop aufruf spare ich mir eine Abfrage in der Alarm Methode ob es den der richtige Code ist.
Mit schneller meine ich dass nicht eine Pause von 40ms zwischen den Entfernungsmessungen habe.

Das liegt wohl an deiner rfid-Routine.
Kommentiere die mal raus und teste neu.

Immernoch langsam und die Messwerte sind auch falsch.

Dann machst du einen Fehler, den wir nicht sehen.

Nimm mal alles raus und verwende nur den US-Sensor und die Messroutine dazu.

Funktioniert. Zwar langsam aber es kommen immer die richtigen Messwerte und der Alarm geht auch los.

int trigger = 6;
int echo = 7;
long dauer = 0;
long entfernung = 0;
void setup()
{
  Serial.begin (9600);
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
}
void loop()
{

  digitalWrite(trigger, LOW);                 //die Entfernung wird Berechnet
  delayMicroseconds(5);
  digitalWrite(trigger, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger, LOW);
  dauer = pulseIn(echo, HIGH);
  entfernung = (dauer / 2) * 0.03432;
  if (entfernung >= 500 || entfernung <= 0) //dann wird die Entfernung oder "kein Messwert" ausgegebn
  {
    Serial.println("Kein Messwert");
  }
  else
  {
    Serial.print(entfernung);
    Serial.println(" cm");
  }
  if (entfernung < 50) {                    //wenn etwas weniger als 50cm vom Ultraschallsensor entfern ist soll der Alarm am Lautsprecher losgehen
    for (int i = 100; i < 1000; i++) {
      tone(3, i);
      delay(3);

    }
  }      noTone(3);

}
[code]

[/code]
Der Code ist von Funduino nur hab ich das mit dem Lautsprecher ergänzt.
Aber was ich nicht verstehe ist: Wieso ist der Code so langsam?

Na dann weist du ja, wo der Fehler zu suchen ist.
Du musst die rfid-Routine optimieren.

Und die Bremse liegt vermutlich in der for-Schleife in der Enfernungsauswertung <50.

Aber ohne rfid ist der Code auch langsam.

Ich habe jetzt selbst keine Messwerte des US-Sensors. Eine gewisse Zeit braucht der Sensor ja, um den Schall wieder zu empfangen. Was sagt den das Datenblatt dazu ?

900 x 3ms = langsam, Hotsystems hat es ja schon geschrieben.

for (int i = 100; i < 1000; i++) {
      tone(3, i);
      delay(3);
    }

Gruß André

HotSystems:
Ich habe jetzt selbst keine Messwerte des US-Sensors. Eine gewisse Zeit braucht der Sensor ja, um den Schall wieder zu empfangen. Was sagt den das Datenblatt dazu ?

Stimmt das habe ich ganz vergessen. Danke

Hi

Sind noch serielle Ausgaben drin?
Mit 9600Baud wird Das auch nicht zum Geschwindigkeitsgewinn beitragen - pro übertragenes Zeichen geht ca. eine Millisekunde flöten (jedes Byte braucht hier 10 Bit, macht bei knapp 10000 Bit/Sekunde ziemlich genau 1000 Zeichen pro Sekunde, was eben dieser Millisekunde entspricht).
FOR-Schleifen helfen hier auch nicht, Zeit einzusparen.
Das könntest Du via State-Maschine genau so machen, weiter kannst Du dann auch 'in jedem Durchlauf' auf neue RFID-Karten reagieren - in wie fern der RFID-Kram blockiert, müsste man noch schauen.

MfG

Mit 9600Baud wird Das auch nicht zum Geschwindigkeitsgewinn beitragen

Wenn man nicht mehr überträgt als über die Leitung geht, bremst es nicht. Und so schnell kann man eh nicht lesen (ich jedenfalls schaffe keine 1000 Zeichen/sec)

Hi

Soweit schon klar - aber man braucht sich nicht über Laufzeiten von zig Millisekunden wundern, wenn man ebenfalls zig Zeichen ausgibt.
Je nach Informationsgehalt der Zeichen gehen aber auch 1000/Sek - wenn der Status statt einem . eine Ziffer wird, lässt sich Das sehr gut erkennen - Das hängt natürlich nicht proportional mit der Fülle an übertragenen Zeichen zusammen - man könnte auch einfach nur bei Änderung senden und sonst ein Heart-Beat, was zumindest die durchschnittliche Laufzeit wieder wesentlich besser aussehen lässt.
Zum Debuggen ist's aber meist eh wurscht - man sollte sich nur bewusst sein, wo hier überall gebremst wird.

MfG