Hallo zusammen,
ich habe mich bereits mit einigen Themen auseinandergesetzt. Jetzt habe ich versucht das der Beschleunigungssensor zu einem bestimmten Wert ein Wert an das Vibrationsmodul gibt. Dieses soll nur einmal zu dem jeweiligen Wert 3 oder 6 ausgegeben werden. Bei dem Wert 3 des ADXL soll vibrate1 und bei dem Wert 6 soll vibrate2 aufgerufen werden und jeweils nur einmal ausgegeben werden.
Kann mir jemand sagen, wo der Fehler ist und wie ich den ändern kann. Oder bin ich ganz falsch mit dem Programm unterwegs?
#include <Adafruit_ADXL345_U.h> //einbinden der Adafriut Sensoren Bibliothek
#include <Adafruit_Sensor.h> //einbinden der Adafruit ADXL 345 Bibliothek
Adafruit_ADXL345_Unified Sensor = Adafruit_ADXL345_Unified(); //Erstellen des Sensors mit dem Namen Sensor
//Definition für Vibration an Port 9
#define vib 9
void setup()
{
Serial.begin(9600); //starten der seriellen Kommunikation mit 9600er Übetragung (Standard)
pinMode(vib, OUTPUT); //Pin 9 als Ausgang definiert
Sensor.begin(); //Starten des Sensors
}
// Vibrieren zu einem bestimmten Wert
void loop()
{
sensors_event_t sensor; //Messung der Werte
Sensor.getEvent(&sensor); //Hinzufügen der Werte zum Sensor
if (sensor.acceleration.x == 3) digitalWrite(vib, HIGH), then vibrate1; //Ausgeben der Werte an die Schnittstelle
else
{
stop();
}
if (sensor.acceleration.x == 6) digitalWrite(vib, HIGH), then vibrate2; //Ausgeben der Werte an die Schnittstelle
else
{
stop();
}
Serial.println(sensor.acceleration.x);
}
void vibrate1()
{
digitalWrite(vib, HIGH);
delay(800);
digitalWrite(vib, LOW);
delay(400);
}
void vibrate2()
{
digitalWrite(vib, HIGH);
delay(800);
digitalWrite(vib, LOW);
delay(400);
digitalWrite(vib, HIGH);
delay(800);
digitalWrite(vib, LOW);
delay(400);
}
void stop()
{
digitalWrite(vib, LOW);
}
2 Programmiersprachen mixen macht den Sketch nicht doppelt so gut.
digitalWrite(vib, HIGH), then vibrate1;
"then" kenne ich noch vom Basic auf dem zx81 und C64. In C /C++ hab ich's aber nie gesehen. Das könnte aber sein daß ich C/C++ nicht perfekt behersche??
Wenns combie es aber nicht kennt, then gibt es es nicht.
Da ist es immer gut, anzugeben was du erwartest und was stattdessen passiert.
Bei deinem Code gibt es eine Fehlermeldung, die dir zur Behebung des Fehlers hilft. Auch das zeigen der Fehlermeldung, kann Helfern helfen, dir zu helfen.
Dinge, die ausgeführt werden sollen, wenn eine if-Abfrage wahr ist, gehören in einen Block, also in geschweifte Klammern. So ein Block, wie du es schon bei else angelegt hast. Daher wäre dieses zielführender:
Dazu bietet sich eine Variable an, in der du hinterlegst, ob die Funktion schon ausgeführt wurde. Auch solltest du dir Gedanken machen, ab wann die Funktion wieder ausgeführt werden darf, und dementsprechend den Wert der Variable zu diesem Zeitpunkt wieder zurück setzen.
Nachdem ich anfangs auch "then" weggenommen habe und es auf vibrate zugewiesen habe, kam keine Fehlermeldung.
Danke für deine Tipps. Aktuell bekomme ich die Fehlermeldung das vibrate1 deklariert werden muss.
Arduino: 1.8.19 (Windows 10), Board: "Arduino Uno"
Test_Vibration.ino: In function 'void loop()':
Test_Vibration.ino:22:34: warning: suggest braces around empty body in an 'if' statement [-Wempty-body]
if (sensor.acceleration.x == 3); //Ausgeben der Werte an die Schnittstelle
^
Test_Vibration:25:5: error: expected ';' before 'vibrate1'
vibrate1();
^~~~~~~~
Test_Vibration:27:3: error: 'else' without a previous 'if'
else
^~~~
Test_Vibration.ino:32:34: warning: suggest braces around empty body in an 'if' statement [-Wempty-body]
if (sensor.acceleration.x == 6); //Ausgeben der Werte an die Schnittstelle
^
Test_Vibration:35:5: error: expected ';' before 'vibrate2'
vibrate2();
^~~~~~~~
Test_Vibration:37:3: error: 'else' without a previous 'if'
else
^~~~
exit status 1
expected ';' before 'vibrate1'
E:\Programme\arduino\portable\sketchbook\sketch_aug19d\sketch_aug19d.ino: In function 'void setup()':
E:\Programme\arduino\portable\sketchbook\sketch_aug19d\sketch_aug19d.ino:4:12: warning: left operand of comma operator is a reference, not call, to function 'test1' [-Waddress]
4 | if(true) test1,test2;
| ^~~~~
E:\Programme\arduino\portable\sketchbook\sketch_aug19d\sketch_aug19d.ino:4:12: warning: left operand of comma operator has no effect [-Wunused-value]
E:\Programme\arduino\portable\sketchbook\sketch_aug19d\sketch_aug19d.ino:4:23: warning: right operand of comma operator is a reference, not call, to function 'test2' [-Waddress]
4 | if(true) test1,test2;
| ^
E:\Programme\arduino\portable\sketchbook\sketch_aug19d\sketch_aug19d.ino:4:23: warning: right operand of comma operator has no effect [-Wunused-value]
E:\Programme\arduino\portable\sketchbook\sketch_aug19d\sketch_aug19d.ino:6:5: warning: statement is a reference, not call, to function 'test3' [-Waddress]
6 | test3;
| ^~~~~
E:\Programme\arduino\portable\sketchbook\sketch_aug19d\sketch_aug19d.ino:6:5: warning: statement has no effect [-Wunused-value]
---------------------------
Der Sketch verwendet 440 Bytes (1%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes.
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, 2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
Es geht also so durch!
Tut aber sicherlich nicht das, was sich der imaginäre Programmierer dabei gedacht haben mag.
Schön!
Jetzt müsste man wissen, wie so ein if Konstrukt in C++ auszusehen hat!
Dann könnte man auch die Meldung verstehen.
Mir fehlen garantiert die Fachwörter. Das Semikolon beendet eine Anweisung/Befehl.
if (sensor.acceleration.x == 3);
In diesem Beispiel ist die if-Abfrage überflüssig, da wenn sie wahr ist, kein folgender Code mehr ausgeführt wird, da das Semikolon die Zeile beendet.
digitalWrite(vib, HIGH)
vibrate1();
Das fehlende Semikolon, bewirkt, als wären die zwei Zeilen eine Anweisung/Befehl. Und diese ergibt dann keinen Sinn.
So ist es!
if erwartet zwingend eine Anweisung!
Das Semikolon beendet eine Anweisung.
Auch eine leere Anweisung ist eine gültige Anweisung und wird so beendet.
Zeilenende haben wenig Auswirkung in C++. Nur in ausgewählten Fällen.
Eigentlich bewirkt das Semikolon dort, dass der If Teil des Statements leer ist.
Es wird danach ein else erwartet, oder weitere Anweisungen, welche dann losgelöst vom if exisiteren.
So ist auch der (im original Code) folgende Anweisungsblock losgelöst vom if. Was bestimmt nicht beabsichtigt ist.
Zudem steht das irgendwann folgende else so ohne if da, was Geschrei zur Folge hat.
Hier wäre ein Anweisungsverkettungs Operator möglich.
Nicht unbedingt sinnvoll, aber möglich.