Probleme Interrupt Arduino Uno

OP #3380843
Lesenswert?
• ▲
▼
Hallo Community,

Ich bin gerade dabei eine Entfernungsmessung mit einem Ultraschallsensor 
(HC-SR04) und einem Interrupt in Arduino zu programmieren. Die 
Entfernungsmessung ansich funktioniert mithilfe eines "delay()", aber 
sobald ich das mit einem Interrupt austausche, kommt beim Compillieren 
folgende Fehlermeldung:

"sketch_okt23a.ino: In function 'void loop()':
sketch_okt23a:24: error: 'Distance' was not declared in this scope
sketch_okt23a:34: error: a function-definition is not allowed here 
before '{' token"

Ich würde mich sehr über Hilfe oder Lösungsvorschlage dazu freuen.
mfg Simon K.

Code:
1
const int trigPin =12;      //Trig Pin
2
const int echoPin = 13;     //Echo Pin
3
unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
4
unsigned long interval = 1000;    // Interval zwischen zwei Änderungen//Echo Pin
5
long Duration = 0;
6

7
void setup(){
8
  pinMode(trigPin,OUTPUT);
9
  pinMode(echoPin,INPUT);
10
  Serial.begin(9600);
11
}
12

13
void loop()
14
{
15
  digitalWrite(trigPin, LOW);
16
  delayMicroseconds(2);
17
  digitalWrite(trigPin, HIGH);
18
  delayMicroseconds(10);
19
  digitalWrite(trigPin, LOW);
20

21
  Duration = pulseIn(echoPin,HIGH);
22

23
  long Distance_mm = Distance(Duration);
24

25
  Serial.print("Distance = ");
26
  Serial.print(Distance_mm);
27
  Serial.println(" mm");
28

29
  if (millis() - previousMillis > interval)
30
  {
31
    previousMillis = millis();   // aktuelle Zeit abspeichern
32
    long Distance(long time)
33
    {
34
      long DistanceCalc;
35
      DistanceCalc = ((time /2.9) / 2);
36
      return DistanceCalc;
37
    }
38
  }
39
}
#3380904
Lesenswert?
• ▲
▼
Sehe nichts was mit interrupts zu tun hat...
Damit das kompiliert du musst die Funktion Distance  aus der loop() 
herausnehmen.

Würde das klarer strukturieren (ohne Gewähr)
1
...
2
long messen() {
3
    // gibt dauer des impulses zurück
4
    digitalWrite(trigPin, LOW);
5
    delayMicroseconds(2);
6
    digitalWrite(trigPin, HIGH);
7
    delayMicroseconds(10);
8
    digitalWrite(trigPin, LOW);
9
    return pulseIn(echoPin,HIGH);
10
}
11

12
void zeige_mm(long time)       {
13
    // rechnet zeit in mm um und gibt aus
14
    long Distance_mm= ((time /2.9) / 2);
15
    Serial.print("Distance = ");
16
    Serial.print(Distance_mm);
17
    Serial.println(" mm");
18
}
19

20

21
void loop() {
22

23
    if (millis() - previousMillis > interval)
24
    {
25
        previousMillis = millis();   // aktuelle Zeit abspeichern
26
        zeige_mm(messen());
27
    }
28
}
#3380962
Lesenswert?
• ▲
▼
Simon K. schrieb:

> sketch_okt23a:24: error: 'Distance' was not declared in this scope

Es gibt als keine Funktion oder Variable names Distance. Zumindest hat 
der Compiler in Zeile 24 noch nie etwas davon gehört

> sketch_okt23a:34: error: a function-definition is not allowed here
> before '{' token"

Deine Einrücktiefe zeigt es ohnehin recht deutlich
>
1
>   if (millis() - previousMillis > interval)
2
>   {
3
>     previousMillis = millis();   // aktuelle Zeit abspeichern
4
>     long Distance(long time)
5
>     {
6
>       long DistanceCalc;
7
>       DistanceCalc = ((time /2.9) / 2);
8
>       return DistanceCalc;
9
>     }
10
>   }
11
> }
12
>

Du kannst nicht innerhalb einer Funktion eine weitere 
Funktiondefinieren. Funktionen stehen immer für sich alleine.
Also nicht
1
void foo()
2
{
3
  ...
4
  void bar()
5
  {
6
    ...
7
  }
8
}

sondern
1
void foo()
2
{
3
 ...
4
}
5

6
void bar()
7
{
8
 ...
9
}

UNd wenn du dann beim Schreiben des Textes auch noch berücksichtigst, 
dass der COmpiler den Text genauso wie du auch von oben nach unten liest 
(und zwar nur ein einziges mal), dann ist es auch logisch, dass es eine 
gute Idee wäre, eine Funktionsdefinition vor ihre erste Verwendung (also 
den Aufruf) zu verschieben.

Also nicht
1
void foo()
2
{
3
  bar();
4
}
5

6
void bar()
7
{
8
  ...
9
}

sondern
1
void bar()
2
{
3
  ...
4
}
5

6
void foo()
7
{
8
  bar();
9
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.