Code:
while ( digitalRead(ECHO_PIN) == 0 );
t1 = micros();
while ( digitalRead(ECHO_PIN) == 1);
t2 = micros();
pulse_width = t2 - t1;
Warum wird die Zeit gesmessen wo der Sender sendet ??
Absolut unnötig, du fragst den Echopin auf 0 ab und machst gar nix in dieser Zeit. Sind nun die 8x40kHz durch,
wird der Echopin auf 1 gesetzt dieser bleibt solange 1 bis ein Echo empfangen wird.
Interrupts GLOBAL deaktivieren
Trigger = 1
warte 50µs
Trigger = 0
EchoPin = 0
warte bis Echopin = 1
starte Timer wenn Echopin = 1
warte bis Echopin = 0
Interrupts GLOBAL aktivieren
Auslesen des Zeitwertes.
Nun kommt der zweite Kasusknacksus
Entweder wird jetzt die gemessene Zeit (in µs) mal Schallgeschwindigkeit(343 m/s) genommen = Weg (in µm)
welcher nur noch halbiert werden muss. SKALIERUNG beachten m/cm/mm/µm
Ebenso kann auch erst die Zeit halbiert werden so das der Weg gleich ein absolutes Endergebnis ist
ODER
man setzt den Timer so das ein Timerbit 58µs entspricht damit kann man die Rechnung umgehen. Auflösung beträgt dann nur 1cm/bit.
Wird der Timer auf 5,8µs / Bit gesetzt beträgt die Auflösung 1mm/bit.
Hier ist auf eine Wiederholrate zu achten vom Messungsabstand von mindestens 20ms
Solltest du den hc-sr04 direkt an eine Versorgungspannung angeschloßen haben die mehr als 5V lieferte besteht die Möglichkeit das dieser defekt ist
Lesezeichen