Arduino Fehlercode: expected ')' before ';'?
Hallo!
Habe bei meinem Arduino Code diesen Fehlercode:
exit status 1
Compilation error: expected ')' before ';' token
Der Sketch sieht so aus:
const int RELAIS = 13; //Relais Pin
#define BUTTON_PIN 5; //Pin für Knopf
void setup() {
pinMode(RELAIS, OUTPUT); //Relais Pins --> Ausgang
pinMode(BUTTON_PIN, INPUT); //Pin für Knopf --> Eingang
}
void loop() {
if (digitalRead(BUTTON_PIN) == HIGH){
digitalWrite(RELAIS, LOW);
}
if (digitalRead(BUTTON_PIN) == LOW){
digitalWrite(RELAIS, HIGH);
delay(500);
}
delay(1000);
}
Wo liegt da das Problem? Habe nichts gesehen wo eine ) vor dem ; fehlt.
(Rot markiert werden übrigens das "#define", das "pinMode(BUTTON_PIN, INPUT);" und beide if-Funktionen)
4 Antworten
Ein define endet normalerweise nicht in einem ; - schaue da nochmal in die Docs, ob das etwas Arduino-spezifisches ist.
D.h. in Deinem restlichen Source wird BUTTON_PIN durch 5; ersetzt.
Hier noch zur Demonstration, damit Du es nachvollziehen kannst:
# 0 "test.c"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 0 "<command-line>" 2
# 1 "test.c"
const int RELAIS = 13;
void setup() {
pinMode(RELAIS, OUTPUT);
pinMode(5;, INPUT);
}
void loop() {
if (digitalRead(5;) == HIGH){
digitalWrite(RELAIS, LOW);
}
if (digitalRead(5;) == LOW){
digitalWrite(RELAIS, HIGH);
delay(500);
}
delay(1000);
}
Das ist die Ausgabe des Präprozessors, wie der Compiler es dann als Source erhält. Daher die etwas verwirrende Fehlermeldung.
Der #define Command ist in diesem Zusamenhang unpassend, und so wie du ihn definiert hast ist der Compiler verwirrt.
#define Command = Setzt den wert der angegeben Wurde, also "BUTTON_PIN" durch "5;" aus, vor dem compilern. Das Problem scheint and dem ";" zu liegen, dies ist bei # Befehlen nie benötigt da # Befehle, Befhele des Comilers sind. Als Lösing verwende einfach:
const int RELAIS = 13; //Relais Pin
const in BUTTON_PIN 5; //Pin für Knopf
void setup() {
pinMode(RELAIS, OUTPUT); //Relais Pins --> Ausgang
pinMode(BUTTON_PIN, INPUT); //Pin für Knopf --> Eingang
}
void loop() {
if (digitalRead(BUTTON_PIN) == HIGH){
digitalWrite(RELAIS, LOW);
}
if (digitalRead(BUTTON_PIN) == LOW){
digitalWrite(RELAIS, HIGH);
delay(500);
}
delay(1000);
}
Das mit dem #define ist ja nun geklärt, aber der Code ist wenig elegant, weil delay() keine gute Wahl ist. Wenn du den Knopf drückst, wären eines delay() bleibt der Druck unbeachtet.
Außerdem hast du das Prellen der Button nicht beachtet.
Ich schreibe in c++ für Mikrocontroller lieber
const int pin = 5;
Das int übersetzt mein Compiler int16_t.
Ich entprelle, indem ich einen externen Interrupt nehme, der bei steigende Flanke auslöst. Erst wenn über eine gewisse Zeit dann der Interrupt nicht mehr auslöst, werte ich den Tastendruck nicht aus. Je Qualität des Tasters sind das 20-150ms.
Zum Anfang schaue mal hier https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
und google mal nach Taste entprellen Arduino.
Ah, das ist natürlich chich, wenn es zur Verfügugn steht. Ich hätte sonst ggf. noch nen asynchronen Timer als "Totmannschalter' in Erwägugn gezogen - Ist gelegentlich ja auch praktisch/erwünscht.
Etwas oversized. Wenn du einen Attiny15 oder 45 programmieren willst, kämpfst du um jedes Byte.
Der Fehler liegt bei der Zeile:
#define BUTTON_PIN 5;
Hier sollte es eigentlich ohne Semikolon aussehen:
#define BUTTON_PIN 5
Wenn Sie ein Semikolon hinzufügen, wird der Compiler es als eine Anweisung interpretieren und nicht als Definition einer Konstante. So kann es zu einem Fehler wie dem oben genannten kommen.
Ändern Sie also die Zeile wie folgt:
#define BUTTON_PIN 5
Nach dieser Änderung sollte Ihr Code kompilieren und fehlerfrei ausgeführt werden.
Danke, daß Du gleich noch jenseits der Syntax andere Problembereiche aufgezeigt hast.
Wie würde man das Prellen am Arduino verhindern? Zustandsvariable, bei Erkennung vom Tastendruck flippen und erst beim nächsten Wechsel zurückflippen und diese in die boolschne Ausdrücke aufnehmen? Oder geht es eleganter?