Vibration zu einem definierten Wert

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


Ja!
Du interessierst dich nicht für die Sprachgrundlagen.
Und nein, die kann man nicht durch ausprobieren lernen.

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. :wink:

Grüße Uwe

Ob ich irgendwas kenne, ist eigentlich gar nicht so wichtig.

Ob die Sprache das kennt, um so mehr!

Und ob sie das kennt, kann man z.B. hier nachlesen:
https://en.cppreference.com/w/

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:

if (sensor.acceleration.x == 3)
{
  digitalWrite(vib, HIGH);
  vibrate1();
}
else
{
  stop();
}

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.

Zeig doch bitte immer den kompletten geänderten Code. Und auch die komplette Fehlermeldung.

Wenn du eine Funktion, wie vibrate1, aufrufen willst, gehört dahinter ein Klammernpaar. vibrate1()

Sonnst geht die IDE von einer Variable/Konstante aus, die ja richtiger Weise angemeckert, nicht deklariert („erstellt“) wurde.

Ja: Dann tue das doch!
Was hält dich ab?

Nein!

Ok, hatte ich so geschlussfolgert anhand des vorherigen Codes. Aber du bist der Profi.

Bin mal gespannt woran es dann wirklich liegt. Natürlich ist dazu der komplette Code und die komplette Fehlermeldung hilfreich.

#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); //Ausgeben der Werte an die Schnittstelle
  {
    digitalWrite(vib, HIGH)
    vibrate1();
  }
  else
  {
    stop();
  }

  if (sensor.acceleration.x == 6); //Ausgeben der Werte an die Schnittstelle
  {
    digitalWrite(vib, HIGH)
    vibrate2();
  }
  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);
}
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'

Der Weg in die Hölle, ist mit falschen Annahmen gepflastert!

Naja....
Eher eine eingewiesene Person mit fundiertem Halbwissen.

Hier mal ein fehlerhaftes/unsinniges Programm, mit seinen Meldungen:


void setup() 
{
  if(true) test1,test2;
  {
    test3;
  }
}

void loop() 
{
}

void test1()
{  
}

void test2()
{  
}

void test3()
{  
}

Und die Meldungen (gekürzt):

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.

Da ist ein Semikolon zu viel. Und es fehlen welche.

Vergleiche mein Codeschnippselbeispiel mit deinen Code

Fehlermeldung bitte auch in CodeTags.

Ich gucke gerade wie ich die Fehlermeldung in CodeTags hinbekomme.

Auf Beitrag ändern, den Text der in CodeTags soll markieren, dann auf </> in der oberen Leiste des Bearbeitungsfensters drücken

Wie würdest du den Sinn/Zweck, die Aufgabe/Wirkung eines Semikolon in C++ beschreiben?

Danke, habe ich gemacht. Kannst Du es lesen?

1 Like

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.

digitalWrite(vib, HIGH) vibrate1();

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.

digitalWrite(vib, HIGH), vibrate1();