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
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);
}
}
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.
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 ?
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 ?
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.
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)
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.