Forum: Compiler & IDEs Probleme Interrupt Arduino Uno


von Simon K. (simon_k96)


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
}

: Bearbeitet durch User
von Helmut H. (helmuth)


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
}

von Karl H. (kbuchegg)


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
}

von Simon K. (simon_k96)


Lesenswert?

Dankeschön für die schnellen Antworten!
Ich muss dazu sagen, dass ich erst seit ein paar Wochen mich mit Arduino 
beschäftige, aber ich werde es gleich mal testen.
mfg Simon K.

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.