Hallo kann mir jemand weiterhelfen? Unterm Code steht die genaue Fehlerbeschreibung

Danke für eure Tipps. Komme trotzdem nicht weiter. Habe jetzt mal die überflüssigen Sachen aus dem Sketch entfernt und mit einer switch case gearbeitet. Ich hoffe so habt ihr das gemeint??? Leider funktioniert es trotzdem nicht wie erwünscht.

Die Achsen einzeln funktionieren.

Problem ist wie folgt.

(links Kurve) ich komme über den wert Unterschied 3 aus der Y Achse
spingt das Relais von links hoch auf links runter um das darf nicht sein. Es soll links oben an bleiben.

Bei der rechts Kurve besteht das selbe Problem (rechts hoch springt auf rechts runter)um.
kann man das irgendwie abändern?

#include <MPU6050_tockn.h>
#include <Wire.h>
//MPU6050 mpu6050(Wire);
MPU6050 mpu6050(Wire, 0.5, 0.5);
#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif


U8G2_SH1106_128X64_NONAME_2_HW_I2C Display(U8G2_R0, U8X8_PIN_NONE);

float accelerationX = 0;
float accelerationY = 0;
float accelerationZ = 0;

float lastSentAccelerationX = 0;
float lastSentAccelerationY = 0;
float lastSentAccelerationZ = 0;

int xJetztPos = 0;
int yJetztPos = 0;  //float gehts mit kommastelle
float angleZ = 0;

float lastSentAngleX = 0;
float lastSentAngleY = 0;
float lastSentAngleZ = 0;

int Taster_rechts_hoch = 6;
int Taster_rechts_runter = 3;
int Taster_links_hoch = 5;
int Taster_links_runter = 4;

int End_rechts_hoch = 8;
int End_rechts_runter = 7;
int End_links_hoch = 14;
int End_links_runter = 15;
int Wert;
int Endschalter1;
int Endschalter2;
int Endschalter3;
int Endschalter4;

const int Progammschalter = 16;
#define PIN_CALIBRATION_MPU6050 22  // when D10 is LOW with a switch on GND. MPU6050 NOT calibrating on start up \
                                    // the INPUT_PULLUP is going to activated later
#define MPU6050_GET_DATA_EVERY 10   // request data from sensor every 400ms
unsigned long mpu6050Timer = millis();

int unterschied10 = 0;
int unterschied1 = 6;   // links Kurve fängt an zu steuern
int unterschied2 = 6;   // rechts Kurve fängt an zu steuern
int unterschied3 = 14;  //  BUG runter drücken Platten gehen runter
int unterschied9 = 7;   //hier gehen die platten aus Gleitfahrt

const int Rechts_runter = 12;
const int Rechts_hoch = 11;
const int Links_runter = 9;
const int Links_hoch = 10;

bool rechts_hoch_aktiv = false;
bool rechts_runter_aktiv = false;
bool links_hoch_aktiv = false;
bool links_runter_aktiv = false;

void setup() {

  Display.setI2CAddress(0x78);
  Display.setFont(u8g2_font_profont15_tf);  // 7x14_tf verändert die Schriftgröße und Schreibweise

  Display.begin();

  delay(200);

  pinMode(Rechts_runter, OUTPUT);
  pinMode(Rechts_hoch, OUTPUT);
  pinMode(Links_runter, OUTPUT);
  pinMode(Links_hoch, OUTPUT);

  pinMode(End_rechts_hoch, INPUT_PULLUP);
  pinMode(End_rechts_runter, INPUT_PULLUP);
  pinMode(End_links_hoch, INPUT_PULLUP);
  pinMode(End_links_runter, INPUT_PULLUP);

  pinMode(Taster_rechts_hoch, INPUT_PULLUP);    //schaltet - ohne Pullup schaltet +
  pinMode(Taster_rechts_runter, INPUT_PULLUP);  //schaltet - ohne Pullup schaltet +
  pinMode(Taster_links_hoch, INPUT_PULLUP);     //schaltet - ohne Pullup schaltet +
  pinMode(Taster_links_runter, INPUT_PULLUP);   //schaltet - ohne Pullup schaltet +
  pinMode(Progammschalter, INPUT_PULLUP);


  digitalWrite(Rechts_runter, HIGH);
  digitalWrite(Rechts_hoch, HIGH);
  digitalWrite(Links_runter, HIGH);
  digitalWrite(Links_hoch, HIGH);




  Serial.begin(9600);
  pinMode(PIN_CALIBRATION_MPU6050, INPUT_PULLUP);
  Wire.begin();
  mpu6050.begin();

  if (digitalRead(PIN_CALIBRATION_MPU6050) == HIGH) {
    mpu6050.calcGyroOffsets(true);
  }
}

void loop() {
  //if (digitalRead(Progammschalter)==0 && digitalRead(Progammschalter)==0) loop01();
  if (digitalRead(Progammschalter) == 1 && digitalRead(Progammschalter) == 1) loop00();
}

void loop00()  //mit Automatische Nachstellung
{



  if ((millis() - mpu6050Timer) > MPU6050_GET_DATA_EVERY) {
    mpu6050.update();

    if ((millis() - mpu6050Timer) > (MPU6050_GET_DATA_EVERY + 10)) {
      accelerationX = mpu6050.getAccX();
      accelerationY = mpu6050.getAccY();
      accelerationZ = mpu6050.getAccZ();

      xJetztPos = mpu6050.getAngleX();
      yJetztPos = mpu6050.getAngleY();
      angleZ = mpu6050.getAngleZ();

      mpu6050Timer = millis();

      //mpu6050.update();
      Serial.print("seitliche Bewegung: ");
      Serial.print(xJetztPos);
      Serial.print("   Bug hoch: ");
      Serial.print(yJetztPos);
      Serial.print("   tangleZ: ");
      Serial.println();
    }
  }



 

  switch (xJetztPos < -(unterschied1)) {  // Links Kurve
    case 1:
      digitalWrite(Rechts_runter, LOW);
      digitalWrite(Links_hoch, LOW);

      break;
  }

  switch (xJetztPos > -(unterschied9)) {
    case 1:
      digitalWrite(Rechts_runter, HIGH);

      break;
  }
  switch (xJetztPos > -(unterschied10)) {
case1:

    digitalWrite(Links_hoch, HIGH);

    break;
  }



  switch (xJetztPos > +(unterschied2)) {  // rechts Kurve
    case 1:
      digitalWrite(Rechts_hoch, LOW);
      digitalWrite(Links_runter, LOW);

      break;
  }
  switch (xJetztPos < +(unterschied3)) {
    case 1:
      digitalWrite(Links_runter, HIGH);

      break;
  }
  switch (xJetztPos < +(unterschied10)) {
    case 1:

      digitalWrite(Rechts_hoch, HIGH);

      break;
  }






  switch (yJetztPos < -(unterschied3)) {  // Bug runter drücken Platten gehen runter
    case 1:
      digitalWrite(Rechts_runter, LOW);
      digitalWrite(Links_runter, LOW);
      digitalWrite(Rechts_hoch, HIGH);
      digitalWrite(Links_hoch, HIGH);
      break;
  }
  switch (yJetztPos > -(unterschied3)) {  // Platten gehen hoch
    case 1:
      digitalWrite(Rechts_runter, HIGH);
      digitalWrite(Links_runter, HIGH);
      digitalWrite(Rechts_hoch, LOW);
      digitalWrite(Links_hoch, LOW);
      break;
  }
  switch (yJetztPos > -(unterschied9)) {  // Gleitfahrt
    case 1:
      digitalWrite(Rechts_runter, HIGH);
      digitalWrite(Links_runter, HIGH);
      digitalWrite(Rechts_hoch, HIGH);
      digitalWrite(Links_hoch, HIGH);
      break;
  }
}

Du solltest dir das mit switch nochmal ansehen...

Also funktioniert das nicht so

Zumindest nicht so, wie du es verwendest,

Wie mache ich es richtig

Schau dir doch bitte dazu die Beispiele in der IDE an.
Hinter case muss ein Wertstehen, der auch in der Switch-Variable vorkommt.
Und sicher nicht immer "1".

Da werden einfach nur if durch switch/case ersetzt, das ist nicht der Sinn der Sache.

Sollte doch If,s einkürzen. Zumindest habe ich das hin bekommen :grin:. Könnt ihr mir nicht mal ein Beispiel zeigen wie ich es richtig mache. Will ja nicht dumm sterben. Und das Internet ist zwar voll aber wie wende ich es richtig in meinem Projekt an?

Verstehe ich nicht.
Beispiele sind doch in der IDE, hatte ich auch schon geschrieben.

Ja!
Ich halte if Konstruktionen für unübersichtlich.
Und dennoch ist ein switch Case Dingen kein wirklicher Ersatz für ein einzelnes If.

Erst bei mehreren case macht switch Sinn.

Ich sagte eben schon:

Und das meine ich auch!

Beim Bau solcher Automaten kann switch/case helfen, aber es gibt noch viel mehr Möglichkeiten.
Die Theorie dazu: Endlicher Automat – Wikipedia
In der Praxis ist es nicht so schwer.
Es erfordert "nur" klare Gedanken und einen guten Plan.

Bisher konnte ich aus dem gesamten Thread noch nicht entnehmen, was dein Programm wirklich tun soll.
Zumindest noch nicht genau genug um einen solchen Plan zu bauen.

Das ist leichter gesagt als getan. Ich habe leider keine Kenntnisse in der Programmierung. Eigentlich ist es nur probieren und vom Internet was einfügen. Ich habe doch schon mal eine Beschreibung reingestellt was ich gern hätte. Nur scheitert es bei mir an der Umsetzung. Vielleicht könnt ihr mir weiterhelfen?

Sorry, da muss ich passen.
Da ich dein komplettes Programm nicht verstehe. Ich vermisse eine erkennbare Struktur und dann ist es für mich schwer da einzusteigen.

Das hast du jetzt schon ein paar mal gesagt!
Leider wirst du um so fester daran glauben, dass dem auch so ist, je öfter du das sagst.
Zudem vermittelst du so den Eindruck, dass du das auch nicht lernen willst.

Wie du siehst, ist das nicht der goldene Weg.

Ich habe leider nichts gefunden, was in mein Hirn passt.
Im Grunde solltest du dein Vorhaben mal vollständig beschreiben.
Dann kann man auch evt. konkrete Verbesserungen vorschlagen.

Meine Gedanken sind.

Eine automatische Trimmsteuerung für ein Boot zu basteln.

z.B.

Wenn beim Beschleunigen das Bug(Spitze) vom Boot hoch geht sollen Trimmplatten am Heck rechts und links runter gehen um eine perfekte Gleitfahrt zu bekommen.

Wenn ich eine links Kurve fahre soll die linke hoch und die rechte runtergehen.

Wenn ich eine rechts Kurve fahre soll die rechte hoch und die linke runtergehen.

Die Motoren sind jeweils mit 2 Endschalter versehen oberer und unterer Punkt.

Zur manuellen Steuerung jeweils die Taster

Ich hoffe ihr könnt mir da weiterhelfen???

Wie soll die Umschaltung automatisch manuell geschehen?

Soll das digital oder analog geschehen?

Das alles hast du in #32 schon gesagt.
Es ist nicht ausreichend.

Analog. Der Bereich wurde auch von diesem Programm erstmal entfernt zwecks Vereinfachung. Es geht nur um die automatische Nachsteuerung den Rest bekomme ich glaube alleine hin.

Scheinbar ja nicht: Nochmal: wie erfolgt die Umschaltung Manuell / Automatik?

Es wird immer rätselhafter.

Wieviel Tonnen Wasserverdrängung hat das Boot?