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

Nein
Mit einem

Was glaubst Du denn, was bei einem if - else if mit einem boolschen Wert zum Schluß bei else übrig bleibt?
Und woher soll Wert seinen Inhalt bekommen?

Ja natürlich. Aber dann muss das erste if weg und das spätere else if zum einfachen if werden.

Danke du meinst von der Y-Achse

@combie hat eigentlich vorgeschlagen, das if wegzulassen :wink:

combie würde übrigens alle if weglassen, aber das ist (speziell bei Leuten mit wenig Erfahrung) gewöhnungsbedürftig.

Also statt

Wert = digitalRead(End_rechts_runter);
if (Wert == 1)
{
 digitalWrite (Rechts_runter, LOW);
}
else 
{
 digitalWrite (Rechts_runter, HIGH);
}  

kürzer

Wert = digitalRead(End_rechts_runter);
digitalWrite (Rechts_runter, Wert?LOW:HIGH);

oder noch kürzer:
digitalWrite (Rechts_runter, ! digitalRead(End_rechts_runter));

Fragt sich natürlich, ob das tatsächlich so gewollt ist, oder ob es Fälle gibt, wo gar kein digitalWrite stattfinden soll und der Ausgangspin Rechts_runter unverändert bleiben soll.
Oder ob es Fälle gibt, wo er nicht invertiert zum Eingangspin End_rechts_runter gesetzt werden soll.

Für so grundlegende Programmfehler (auf die ich auch hereingefallen bin am Anfang wegen VB) empfehle ich dir.

Arduino-Kompendium: Elektronik, Programmierung und Projekte
Buch von Danny Schreiter

Kein Link, weil es das inzwischen auch schon gebraucht gibt.
Da ist ein Prima Kapitel drin über C Programmierung. Für die Grundkenntnisse reicht das völlig. z.b. Unterschied zwischen = und == . Mir hat das jedenfalls sehr geholfen.

Kleiner Hinweis.
Im Buch ist ein Code für ein Download als PDF / Epub etc. drin, beim Verlag. War bei mir ganz praktisch in der Kur. :wink:

Gruß

Pucki

Wie man C++ am besten lernt, ist sehr individuell. Zum Nachschlagen hat sich inzwischen das Internet bewährt, und auch da gibt es individuelle Unterschiede in der Lieblingsreferenz.
C und C++ sind übrigens zwei verschiedene Sprachen, bei Arduino wird C++ verwendet.
(Auch wenn zum obigen Problem in beiden Sprachen dieselben Antworten gelten)

Alle!
Bis auf die wirklich notwendigen.

Das kann ich ja nachher mal versuchen. Aber ich glaube nicht daß es an den Endschalter liegt die hatte ich schon mal entfernt. Irgendwas stimmt mit der Zeile 154 bis 260 nicht.

Also wenn ich es so gestalten funktioniert es gar nicht. Bei vertauschen von Low und High sind jeweiligen Relais etwa ständig an oder gehen erst gar nicht an. Mit den if Befehl hat es aber funktioniert.

(attachments)

if ist kein Befehl, sondern eher ein Control Statement oder Kontrollstruktur.

Übrigens:
Du glaubst doch nicht Wirklichkeit, das wir hier deine Fotos abtippen um testen zu können?

Also nur mal als ersten Ansatz:

  if (xJetztPos > +(unterschied2))    // Rechts Kurve
  {
    digitalWrite(Rechts_runter, HIGH);
    digitalWrite(Rechts_hoch, LOW);
    digitalWrite(Links_runter, LOW);
    digitalWrite(Links_hoch, HIGH);
    rechts_hoch_aktiv = true;                  // << Stimmt das????
    links_hoch_aktiv = true;                   // << Wenn ich der 
    rechts_runter_aktiv = true;                // << Logik folge....
    links_runter_aktiv = true;                 // << Ist da was falsch
  }

Und dann hab ich einfach mal angefangen das aufzuteilen, damit das ein wenig übersichtlicher wird.
Es sollte noch genauso funktionieren.

#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 = 5; // links Kurve fängt an zu steuern
int unterschied2 = 5; // 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()
{
  !digitalRead(Progammschalter) ? loop01() : loop00();
}

void getAGM()
{
  static uint8_t state = 0;

  if ((millis() - mpu6050Timer) > MPU6050_GET_DATA_EVERY)
  {
    mpu6050Timer = millis();

    switch (state)
    {
      case 0:
        mpu6050.update();
        state = 1;
        break;

      case 1:
        accelerationX = mpu6050.getAccX();
        accelerationY = mpu6050.getAccY();
        accelerationZ = mpu6050.getAccZ();
        xJetztPos = mpu6050.getAngleX();
        yJetztPos = mpu6050.getAngleY();
        angleZ = mpu6050.getAngleZ();
        Serial.print("seitliche Bewegung: ");
        Serial.print(xJetztPos);
        Serial.print("\\  Bug hoch : ");
        Serial.print(yJetztPos);
        Serial.print("\\   tangleZ : ");
        Serial.println();
        state = 0;
        break;
    }
  }
}
//
void loop00() //mit Automatische Nachstellung
{
  getAGM();

  if (xJetztPos < -(unterschied1))    // Links Kurve
  {
    digitalWrite(Rechts_runter, LOW);
    digitalWrite(Rechts_hoch, HIGH);
    digitalWrite(Links_runter, HIGH);
    digitalWrite(Links_hoch, LOW);
    rechts_hoch_aktiv = true;
    links_hoch_aktiv = true;
    rechts_runter_aktiv = true;
    links_runter_aktiv = true;
  }
  else
  {
    // Relais ausschalten, wenn sich die Position in den Nullbereich bewegt
    if (rechts_runter_aktiv && xJetztPos <= -unterschied1)   // Relay geht aus
    {
      digitalWrite(Rechts_runter, HIGH);
      rechts_runter_aktiv = true;
    }

    if (links_hoch_aktiv && xJetztPos >= -unterschied10)    // Relay geht aus
    {
      digitalWrite(Links_hoch, HIGH);
      links_hoch_aktiv = true;
    }
  }

  if (xJetztPos > +(unterschied2))    // Rechts Kurve
  {
    digitalWrite(Rechts_runter, HIGH);
    digitalWrite(Rechts_hoch, LOW);
    digitalWrite(Links_runter, LOW);
    digitalWrite(Links_hoch, HIGH);
    rechts_hoch_aktiv = true;                  // << Stimmt das????
    links_hoch_aktiv = true;                   // <<
    rechts_runter_aktiv = true;                // <<
    links_runter_aktiv = true;                 // <<
  }
  else
  {
    // Relais ausschalten, wenn sich die Position in den Nullbereich bewegt
    if (rechts_hoch_aktiv && xJetztPos <= -unterschied10)          //Relay geht aus
    {
      digitalWrite(Rechts_hoch, HIGH);
      rechts_hoch_aktiv = true;
    }

    if (links_runter_aktiv && xJetztPos >= -unterschied2)         // Relay geht aus
    {
      digitalWrite(Links_runter, HIGH);
      links_runter_aktiv = true;
    }
  }

  checkEndSwitch();
  checkTasterPin();
  debugData();
  displayData();
}

void displayData()
{
  //Variante Ausgabe auf OledDisplay1 Direktanschluss
  Display.clearBuffer();
  Display.firstPage();

  do
  {
    Display.setCursor(2, 10);
    Display.print("Seitliche Bewegung ");
    Display.setCursor(60, 27);
    Display.print(xJetztPos) ;
    Display.setCursor(2, 42);
    Display.print("Bug hoch/runter ");
    Display.setCursor(58, 60);
    Display.print(yJetztPos) ;
    Display.setCursor(2, 27);
    Display.print("End");
    Display.setCursor(30, 27);
    Display.print(Wert = digitalRead(End_links_hoch)) ;
    Display.setCursor(2, 60);
    Display.print("End");
    Display.setCursor(30, 60);
    Display.print(Wert = digitalRead(End_links_runter)) ;
    Display.setCursor(96, 27);
    Display.print("End");
    Display.setCursor(122, 27);
    Display.print(Wert = digitalRead(End_rechts_hoch)) ;
    Display.setCursor(96, 60);
    Display.print("End");
    Display.setCursor(122, 60);
    Display.print(Wert = digitalRead(End_rechts_runter)) ;
    Display.sendBuffer();
  } while (Display.nextPage());

  //delay(150);
}

void checkEndSwitch()
{
  digitalWrite (Rechts_runter, !digitalRead(End_rechts_runter));
  digitalWrite (Links_runter, !digitalRead(End_links_runter));
  digitalWrite (Links_hoch, !digitalRead(End_links_hoch));
  digitalWrite (Rechts_hoch, !digitalRead(End_rechts_hoch));
}

void checkTasterPin()
{
  if (!digitalRead(Taster_rechts_hoch))
  {
    // der Mikroschalter wurde gedrückt
    digitalWrite (Rechts_hoch, LOW);
    digitalWrite (Rechts_runter, HIGH);
  }
  else
  {
    // der Mikroschalter wurde losgelassen
    digitalWrite (Rechts_hoch, HIGH);
    digitalWrite (Rechts_runter, LOW);
  }

  if (!digitalRead(Taster_rechts_runter))
  {
    // der Mikroschalter wurde gedrückt
    digitalWrite (Rechts_runter, LOW);
    digitalWrite (Rechts_hoch, HIGH);
  }
  else
  {
    // der Mikroschalter wurde losgelassen
    digitalWrite (Rechts_runter, HIGH);
    digitalWrite (Rechts_hoch, LOW);
  }

  if (!digitalRead(Taster_links_hoch))
  {
    // der Mikroschalter wurde gedrückt
    digitalWrite (Links_hoch, LOW);
    digitalWrite (Links_runter, HIGH);
  }
  else
  {
    // der Mikroschalter wurde losgelassen
    digitalWrite (Links_hoch, HIGH);
    digitalWrite (Links_runter, LOW);
  }

  if (!digitalRead(Taster_links_runter))
  {
    // der Mikroschalter wurde gedrückt
    digitalWrite (Links_runter, LOW);
    digitalWrite (Links_hoch, HIGH);
  }
  else
  {
    // der Mikroschalter wurde losgelassen
    digitalWrite (Links_runter, HIGH);
    digitalWrite (Links_hoch, LOW);
  }
}

void debugData()
{
  Serial.println();
  Serial.print("       ");
  Serial.print("Seitliche Bewegung ");
  Serial.print(xJetztPos);
  Serial.print("       ");
  Serial.print("Bug hoch/runter ");
  Serial.print(yJetztPos);
  Serial.print("       ");
  Serial.print("Rechts/ Links Bewegung ");
  // Serial.println(zJetztPos);
  Serial.println();
  Serial.print("Taster links hoch  ");
  Serial.print(Wert = digitalRead(Taster_links_hoch)) ;
  Serial.println(" ");
  Serial.print("Taster links runter  ");
  Serial.print(Wert = digitalRead(Taster_links_runter)) ;
  Serial.println(" ");
  Serial.print("Taster rechts hoch  ");
  Serial.print(Wert = digitalRead(Taster_rechts_hoch)) ;
  Serial.println(" ");
  Serial.print("Taster rechts runter  ");
  Serial.print(Wert = digitalRead(Taster_rechts_runter)) ;
  Serial.println(" ");
  Serial.println();
  Serial.print("End links hoch  ");
  Serial.print(Wert = digitalRead(End_links_hoch)) ;
  Serial.println(" ");
  Serial.print("End links runter  ");
  Serial.print(Wert = digitalRead(End_links_runter)) ;
  Serial.println(" ");
  Serial.print("End rechts hoch  ");
  Serial.print(Wert = digitalRead(End_rechts_hoch)) ;
  Serial.println(" ");
  Serial.print("End rechts runter  ");
  Serial.print(Wert = digitalRead(End_rechts_runter)) ;
  Serial.println(" ");
  Serial.println();
}

//************************************* AB HIER NICHT BEARBEITEN

void loop01()    // Automatische Nachstellung deaktiviert
{
  Endschalter1 = digitalRead(End_rechts_runter );

  if ((digitalRead(Taster_rechts_runter) == LOW) && (Endschalter1 == HIGH))
  {
    digitalWrite(Rechts_runter, LOW);
  }
  else
  {
    digitalWrite(Rechts_runter, HIGH);
  }

  Endschalter2 = digitalRead(End_rechts_hoch );

  if ((digitalRead(Taster_rechts_hoch) == LOW) && (Endschalter2 == HIGH))
  {
    digitalWrite(Rechts_hoch, LOW);
  }
  else
  {
    digitalWrite(Rechts_hoch, HIGH);
  }

  Endschalter3 = digitalRead(End_links_runter );

  if ((digitalRead(Taster_links_runter) == LOW) && (Endschalter3 == HIGH))
  {
    digitalWrite(Links_runter, LOW);
  }
  else
  {
    digitalWrite(Links_runter, HIGH);
  }

  if (digitalRead(Taster_links_hoch) == LOW)
  {
    if (digitalRead(End_links_hoch) == HIGH)
    {
      digitalWrite(Links_hoch, LOW);
    }
    else
    {
      digitalWrite(Links_hoch, HIGH);
    }
  }

  Serial.print("Taster links hoch  ");
  Serial.print(Wert = digitalRead(Taster_links_hoch)) ;
  Serial.println(" ");
  Serial.print("Taster links runter  ");
  Serial.print(Wert = digitalRead(Taster_links_runter)) ;
  Serial.println(" ");
  Serial.print("Taster rechts hoch  ");
  Serial.print(Wert = digitalRead(Taster_rechts_hoch)) ;
  Serial.println(" ");
  Serial.print("Taster rechts runter  ");
  Serial.print(Wert = digitalRead(Taster_rechts_runter)) ;
  Serial.println(" ");
  Serial.println();
  Serial.print("End links hoch  ");
  Serial.print(Wert = digitalRead(End_links_hoch)) ;
  Serial.println(" ");
  Serial.print("End links runter  ");
  Serial.print(Wert = digitalRead(End_links_runter)) ;
  Serial.println(" ");
  Serial.print("End rechts hoch  ");
  Serial.print(Wert = digitalRead(End_rechts_hoch)) ;
  Serial.println(" ");
  Serial.print("End rechts runter  ");
  Serial.print(Wert = digitalRead(End_rechts_runter)) ;
  Serial.println(" ");
  Serial.println();
  Display.clearBuffer();
  Display.firstPage();

  do
  {
    Display.setCursor(2, 10);
    Display.print("Seitliche Bewegung ");
    Display.setCursor(58, 27);
    Display.print("M.") ;
    Display.setCursor(2, 42);
    Display.print("Bug hoch/runter ");
    Display.setCursor(58, 60);
    Display.print("M.") ;
    Display.setCursor(2, 27);
    Display.print("End");
    Display.setCursor(30, 27);
    Display.print(Wert = digitalRead(End_links_hoch)) ;
    Display.setCursor(2, 60);
    Display.print("End");
    Display.setCursor(30, 60);
    Display.print(Wert = digitalRead(End_links_runter)) ;
    Display.setCursor(96, 27);
    Display.print("End");
    Display.setCursor(122, 27);
    Display.print(Wert = digitalRead(End_rechts_hoch)) ;
    Display.setCursor(96, 60);
    Display.print("End");
    Display.setCursor(122, 60);
    Display.print(Wert = digitalRead(End_rechts_runter)) ;
    Display.sendBuffer();
  } while (Display.nextPage());

  //delay(500);
}

Und dann erklär mal, was das schlussendlich ist, oder machen soll, damit man sich irgendwas vorstellen kann.

Danke für deine Mühe. Ich habe gerade deine abgeänderte Version hochgespielt, leider gehen jetzt nur noch Relais links und rechts hoch.

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???

Was mir gerade aufgefallen ist. Die Y-Achse wird zwar angezeigt ist aber nicht in den Schalthandlung im Programm vorhanden.

Sowas ähnliches habe ich mir schon gedacht....
Du hast Dir selbst ein Bein gestellt.

Deine Tasterabfrage überschreibt Deine Automatik, bzw. Deine Automatik überschreibt Deine Taster.

Du hörst nur das Klicken Deiner Relais nicht, weil das viel zu schnell abläuft.

Es wird darauf rauslaufen, dass Du das ganz neu denken musst und zum debuggen unbedingt mit dem seriellen Monitor arbeitest.

Eigentlich funktioniert das Programm wie erwünscht nur, wenn ich die Zeilen einfüge behindert das die x pos. Wie kann ich das umgehen und bekomme die Platten hoch?

    
     if (yJetztPos < -(unterschied9)) {  // Bug hoch Minus Bereich
        digitalWrite(Rechts_runter, HIGH);
        digitalWrite(Rechts_hoch, LOW);
        digitalWrite(Links_runter, HIGH);
        digitalWrite(Links_hoch, LOW);
rechts_hoch_aktiv = true;
links_hoch_aktiv = true;
rechts_runter_aktiv = true;
links_runter_aktiv = true;    
} else {
        // Relais ausschalten, wenn sich die Position in den Nullbereich bewegt
        if (rechts_hoch_aktiv && yJetztPos >= -unterschied9)
        {
            digitalWrite(Rechts_hoch, HIGH);
            rechts_hoch_aktiv = true;
        }
       
        if (links_hoch_aktiv && yJetztPos >= -unterschied9)
         {
            digitalWrite(Links_hoch, HIGH);
            links_hoch_aktiv = true;
        }
       }

Dann bin ich raus.

Du solltest Dir schon über die gewünschte Logik Deines Systems im Klaren sein und den Vorschlag des Kollegen prüfen und ggf. anpassen oder Hinweise geben.

@my_xy_projekt hatte extra zu den - aus Deinem Code übernommenen - Zeilen einen Kommentar verfasst:

// << Stimmt das????

Mir scheint es merkwürdig wenn Flags zur Steuerung eines Ablaufs gleichzeitig für hoch und runter aktiviert werden. Ein Ding (nennen wir es Fahrstuhl) kann entweder hoch oder aber runter fahren - niemals beides gleichzeitig.

Ich habe mir schon über eure Tipps Gedanken gemacht sind auch gut erklärt. Leider komme ich auf keine Lösung wie man das Problem beheben kann. Vielleicht habt ihr eine Idee???

Hmm...
evt. endliche Automaten bauen?!

zunächst formatiere deinen Sketch, das ist mit CTRL-T nur ein einziger Tastendruck:

Wenn du nun den Ablauf noch beschreibst - besser du machst ein State Diagram, dann kann ich dir weiterhelfen. Wobei es @combie schon geschrieben hat, bau das ganze als State Machine auf!