Hallo Ich habe ein kleines Problem mit meinem Projekt und hoffe hier auf bestmögliche Hilfe. Ich habe ein kleines laufende Programm und möchte mit Hilfe eines HC-SR04 Ultraschallsensor das laufende Programm stoppen, ein kleines Unterprogramm ablaufen lassen und zum Hauptprogramm zurückkehren. Ich habe an Interrupts gedacht doch irgendwie keine Ahnung wie ich das Programm schreiben soll. Kann mir einer helfen oder Tipps geben wie ich das Programm schreiben kann?
Der HC-SR04 erzeugt einen Echoimpuls, dessen DAUER dem Abstand entspricht (Abstand = (V_luft * Zeit) /2). Du musst dabei also die Zeitdauer bestimmen, wie lange der Impuls auf 1 war. Bei einem Abstand von 1m braucht das Echo ca. 6ms - nur mal so als Größenordnung. Beliebig weit kann der Sensor auch nicht messen. Spätestens nach 200ms geht das Echo-Signal wieder auf 0. Wenn Du weisst, wie Du mit deinem Controller (welcher ist es denn?) eine Zeitdauer in µs-Auflösung messen kannst, dann kannst Du mit dem HC-SR04 anfangen. Vorher macht das noch wenig Sinn.
Ich habe einen Arduino UNO und das Unterprogramm könnte doch eine blinkende LED sein und durch die Annäherung an den Sensor soll vielleicht die zweite LED blinken.
Einen Quellcode habe ich noch nicht geschrieben, für mein kleines Beispielprogramm mit den LED´s. Ich habe keine Ahnung wie ich das mit den Sensor verbinden muss. Der Sensor muss mit ein Triggersignal dauerhaft gespeist werden und auf das Echosignal über die Interrupts reagieren. Im Hauptprogramm blinkt eine LED1 und wenn man sich dem Sensor nährt soll das Hauptprogramm unterbrochen werden und ein Unterprogram, LED2 blinken, gestartet werden. So lange bis ich den Sensor aktiviere. Ich kann mir nicht vorstellen wie ich beginnen soll.
Ich habe es mal mit einen Schalter versucht aufzubauen, soweit ganz gut. Nur möchte ich jetzt das statt der Schalter dies ein Ultraschallsensor macht. Hauptprogramm unterbrechen, Unterprogramm durchführen und zum Hauptprogramm zurückkommen. Ich habe keine leise Idee wie ich das anstellen kann. Ich habe mal den Code mit beigefügt und hoffe auf hilfe. int pin = 13; int pin1 = 8; volatile int state = LOW; void setup() { pinMode(pin, OUTPUT); pinMode(pin1, OUTPUT); attachInterrupt(0, blink, CHANGE); } void loop() { digitalWrite(pin, HIGH); delay(1000); digitalWrite(pin, LOW); delay(1000); } void blink() { state = !state; if (state == HIGH) { digitalWrite(pin1, HIGH); } else { digitalWrite(pin1, LOW); } }
Schön, jetzt blinken vermutlich beide LEDs immer. Der Sensor gibt dir in jedem Fall irgendwann ein Echo zurück (im Fehlerfall bei zu großem Abstand nach max. 200ms). Du bekommst also nur 2 blinkende LEDs, die etwas Zeitversetzt sind... Versuche erst einmal, den Sensor überhaupt zu verstehen, bevor du mit Interrupt und 2 parallelen Blinkprozessen ankommst. Benenne in deinem Programm die Pins sinnvoll. z.B. Trigger und Echo Dann einen kurzen Impuls an Trigger erzeugen, danach warten und mitzählen z.b. while (Echo == 0) { Zaehler++; warte_100us(); } Jetzt hast du die Messung auf 0,1ms genau und kannst mit dem Zählerstand den Abstand berechnen (Schallgeschwindigkeit ~ 340m/s, doppelte Laufzeit für das Echo). Jetzt kannst Du anhand des Abstandes irgend was auslösen.
A=Anfänger schrieb: > Hauptprogramm unterbrechen, Unterprogramm durchführen und zum > Hauptprogramm zurückkommen. Wenn das Hauptprogramm unterbrochen werden soll, brauchst du einen Interrupt. A=Anfänger schrieb: > ... und möchte mit Hilfe eines HC-SR04 Ultraschallsensor das laufende > Programm stoppen, Wie stellst du dir das vor. Wenn das bei Annäherung passieren soll, muss der HC-SR04 dauernd die Entfernung messen und bei Unterschreitung eines bestimmten Wertes eine Aktion veranlassen. Als erstes solltest du dann deinen Arduino dazu bewegen, den Abstand per US-Modul unter Nutzung eines Timers zu messen.
Du hast also einen UNO und einen Ultraschallsensor. Ich gehe davon aus, du möchtest abhängig vom Abstand etwas steuern/schalten.. Probier mal das...ist zwar ohne ISR, aber die würde dir hier eh nix bringen. [CODE] int trigPin = 14; int inPin = 15; long duration, cm; void setup() { Serial.begin(115200); pinMode(trigPin, OUTPUT); digitalWrite(trigPin, LOW); pinMode(inPin, INPUT); } void loop() { digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(inPin, HIGH); cm = (int)(duration / 58); if(cm > 100) { /*do this*/ } else { /*do that*/ } } LG Johann
Hoppla...den cast brauchst du nicht...mein Fehler Falsch > cm = (int)(duration / 58); Besser > cm = duration / 58;
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.