Forum: Mikrocontroller und Digitale Elektronik HC-SR04 Interrupt


von A=Anfänger (Gast)


Lesenswert?

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?

von chris (Gast)


Lesenswert?

Quellcode?

von Bernhard S. (b_spitzer)


Lesenswert?

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.

von A=Anfänger (Gast)


Lesenswert?

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.

von A=Anfänger (Gast)


Lesenswert?

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.

von A=Anfänger (Gast)


Lesenswert?

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

von Bernhard S. (b_spitzer)


Lesenswert?

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.

von Mike A. (Gast)


Lesenswert?

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.

von johann1979 (Gast)


Lesenswert?

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

von johann1979 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.