Arduino Forum

International => Deutsch => Topic started by: Ace_Dark on Feb 10, 2020, 03:50 pm

Title: Sorry schon wieder probleme mit meinem Code
Post by: Ace_Dark on Feb 10, 2020, 03:50 pm
Bei der Frage https://forum.arduino.cc/index.php?topic=656054.0 (kann mir jemand Sagen wie man das zu nem anklickbaren link macht) wurde mir empfohlen bei meinem code Strukturen zu nutzen naja das versuche ich im Moment und verstehe nicht warum
Code: [Select]
'boolean' does not name a type und dasselbe für byte und ebenfalls so ein probleme für
Code: [Select]
millis() bekomme. Hier mein code in dem eigenen Tap Motor.h
Code: [Select]
#include <Servo.h>


class Motor {
    Servo myservo;

  private:
    boolean Fertig;
    int StepTime;
    int LastTime = 0;
  public:
    boolean Time1[100];
    int Time2[100];
    byte NewPosition[100];
    byte OldPosition;
    byte pin;
    int PostureNumber;

    void Attaching() {
      myservo.attach(pin);
    }


    boolean goPosition() {
      if (NewPosition[PostureNumber] == OldPosition) {
        return true;
        Fertig = true;
      }

      else {
        return false;
        if (Fertig = true) {
          if (Time1[PostureNumber] == true) {
            StepTime = Time2[PostureNumber];
          }
          if (Time1[PostureNumber] == false) {
            if (OldPosition < NewPosition[PostureNumber]) {
              StepTime = (Time2[PostureNumber] / (NewPosition[PostureNumber] - OldPosition));
            }
            if (OldPosition > NewPosition[PostureNumber]) {
              StepTime = (Time2[PostureNumber] / (OldPosition - NewPosition[PostureNumber]));
            }
          }
          Fertig = false;
        }
        if (millis() - LastTime > StepTime) {
          if (OldPosition > NewPosition[PostureNumber]) {
            OldPosition++;
            myservo.write(OldPosition);
            LastTime = millis();
          }
          if (OldPosition < NewPosition[PostureNumber]) {
            OldPosition--;
            myservo.write(OldPosition);
            LastTime = millis();
          }
        }

      }
    }//Ende der Funktion

};//Ende der Strucktur



Muss ich vielleicht wenn ich nicht direkt im "sketch" (weiß nicht wie ich das anders nennen soll) programmiere irgendeine libary einfügen?
schonmal vielen Dank an alle
Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: Peter-CAD-HST on Feb 10, 2020, 04:05 pm
Moin

Und guck mal hier

https://www.arduino.cc/reference/en/language/variables/data-types/bool/


br

Peter
Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: combie on Feb 10, 2020, 04:07 pm
Quote
und verstehe nicht warum
Typen welche genutzt werden wollen, müssen auch definiert/eingebunden werden!

Quote
Muss ich vielleicht wenn ich nicht direkt im "sketch" (weiß nicht wie ich das anders nennen soll) programmiere irgendeine libary einfügen?
In der Hauptübersetzungseinheit passiert das automatisch.
In allen anderen Übersetzungseinheiten musst du das händisch tun,

Code: [Select]
#include <Arduino.h>
#include <Servo.h>


class Motor {
    Servo myservo;
Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: Ace_Dark on Feb 10, 2020, 04:11 pm
Danke funktioniert jetzt soweit ich hatte leider nur einen älteren post gefunden wo es hieß das diese libary eingefügt werden muss: #include "WProgram.h"
Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: MicroBahner on Feb 10, 2020, 04:11 pm
https://forum.arduino.cc/index.php?topic=656054.0 (kann mir jemand Sagen wie man das zu nem anklickbaren link macht)
Indem Du das nicht einfach in den Text kopierst, sondern dazu den link-Button nutzt ( 12.Button oben im Editor:https://forum.arduino.cc/index.php?topic=656054.0 (https://forum.arduino.cc/index.php?topic=656054.0)

Zeig auch mal wo und wie Du diese .h-Datei einbindest. Davon hängt ab, was Du gegebenenfalls zusätzlich einbinden musst.
Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: michael_x on Feb 10, 2020, 04:13 pm
Quote
Muss ich vielleicht wenn ich nicht direkt im "sketch" (weiß nicht wie ich das anders nennen soll) programmiere irgendeine libary einfügen?
Ja.
Aber warum schreibst du keine .ino Datei, oder warum verwendest du boolean in einer .cpp?
Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: Serenifly on Feb 10, 2020, 04:16 pm
#include "WProgram.h"
Das gibt es schon lange nicht mehr

Und der korrekte C++ Datentyp ist nunmal bool. boolean hat man wahrscheinlich mal eingeführt weil es das in Java gibt. Aber das ist nur ein typedef in der Arduino Software
Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: combie on Feb 10, 2020, 04:18 pm
Ja.
Aber warum schreibst du keine .ino Datei, oder warum verwendest du boolean in einer .cpp?
Hmmm...

Libraries bestehen gerne aus eigenständigen Übersetzungseinheiten.
Also aus *.h und *.cpp Dateien.

Dann ist das Pflicht.

Gegen eigenständigen Übersetzungseinheiten gibt es grundsätzlich nichts einzuwenden, denke ich mal.

Beschleunigt sogar den Übersetzungsvorgang, erst beim zweiten Mal, aber immerhin.
Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: MicroBahner on Feb 10, 2020, 04:19 pm
Aber das ist nur ein typedef in der Arduino Software
Wobei sie selbst inziwschen davon abraten, ihn zu verwenden:
Quote
boolean is a non-standard type alias for bool defined by Arduino. It's recommended to instead use the standard type bool, which is identical.
Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: Serenifly on Feb 10, 2020, 04:22 pm
Anfangs war boolean sogar mal as unsigned char definiert. Das hat in bestimmten Situationen zu Fehlern im Vergleich mit true/false geführt. Deshalb habe ich das nie verwendet
Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: combie on Feb 10, 2020, 04:26 pm
Ja, boolean ist veraltet.
bool ist der neue Standard.


AVR gcc:

stdbool.h (liegt dem Compiler bei)
#define bool _Bool

Und _Bool ist ein,  dem Compiler innewohnender, nativer Datentype.
Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: Ace_Dark on Feb 10, 2020, 10:30 pm
ok danke also bool statt boolean nutzen also das Folgende ist der komplette code schon verbessert bin jetzt noch auf Fehler Suche da er noch nicht richtig funktioniert schicke ihn jetzt mal zur Vollständigkeit halber rein (konstruktive Kritik natürlich gerne) 

also Motor.h:

Code: [Select]
#include <Servo.h>
#include <Arduino.h>

class Motor {
    Servo myservo;

  private:
    boolean Fertig = true;
    int StepTime;
    int LastTime = 0;
  public:
    boolean Time1[10];
    int Time2[10];
    byte NewPosition[10];
    byte OldPosition;
    byte pin;
    int PostureNumber;

    Motor (int pi) {
      pin = pi;
    }

    void Al(char NM2, char a, char b, char c) {
      Time1[NM2] = a;
      Time2[NM2] = b;
      NewPosition[NM2] = c;
    }

    boolean goPosition() {
      myservo.attach(pin);
      if (NewPosition[PostureNumber] == OldPosition) {
        Fertig = true;
        Serial.println("Abgeschlossen");
        return true;
      }

      else {
        if (Fertig == true) {
          if (Time1[PostureNumber] == true) {
            StepTime = Time2[PostureNumber];
          }
          if (Time1[PostureNumber] == false) {
            if (OldPosition < NewPosition[PostureNumber]) {
              StepTime = (Time2[PostureNumber] / (NewPosition[PostureNumber] - OldPosition));
            }
            if (OldPosition > NewPosition[PostureNumber]) {
              StepTime = (Time2[PostureNumber] / (OldPosition - NewPosition[PostureNumber]));
            }
          }
          Fertig = false;
          Serial.println(StepTime);
        }

        if (millis() - LastTime > StepTime) {
          if (OldPosition > NewPosition[PostureNumber]) {
            OldPosition++;
            myservo.write(OldPosition);
            LastTime = millis();
          }
          if (OldPosition < NewPosition[PostureNumber]) {
            OldPosition--;
            myservo.write(OldPosition);
            LastTime = millis();
          }
        }
return false;
      }
    }//Ende der Funktion

};//Ende der Strucktur



und der "Maincode":

Code: [Select]
#include "motor.h"

boolean proof[5];
short T = 3000;


Motor M0(3);
Motor M1(5);
Motor M2(6);
Motor M3(9);
Motor M4(10);


void R() {
  if (proof[0] && proof[1] && proof[2] && proof[3] && proof[4]) {
    M0.PostureNumber++;
    M1.PostureNumber++;
    M2.PostureNumber++;
    M3.PostureNumber++;
    M4.PostureNumber++;
    proof[0] = false;
    proof[1] = false;
    proof[2] = false;
    proof[3] = false;
    proof[4] = false;
  }
  else {
    if (proof[0] == false) {
      proof[0] = M0.goPosition();
    }
    if (proof[1] == false) {
      proof[1] = M1.goPosition();
    }
    if (proof[2] == false) {
      proof[2] = M2.goPosition();
    }
    if (proof[3] == false) {
      proof[3] = M3.goPosition();
    }
    if (proof[4] == false) {
      proof[4] = M4.goPosition();
    }
  }
}

void Allocation(byte PN, byte w1, byte w2, byte w3, byte w4, byte w5, byte w6, byte w7, byte w8, byte w9, byte w10, byte w11, byte w12, byte w13, byte w14, byte w15) {
  M0.Al(PN, w1, w2, 3);
  M1.Al(PN, w4, w5, 6);
  M2.Al(PN, w7, w8, 9);
  M3.Al(PN, w10, w11, 12);
  M4.Al(PN, w13, w14, 15);
}

void setup() {

  Serial.begin(9600);
  Serial.println("Los");

  M0.OldPosition = 90;
  M1.OldPosition = 90;
  M2.OldPosition = 90;
  M3.OldPosition = 90;
  M4.OldPosition = 90;

  Allocation(1, false, T, 160, false, T, 85, false, T, 5, false, T, 50, false, T, 180);
  Allocation(2, false, T, 170, false, T, 85, false, T, 7, false, T, 57, false, T, 180);
  Allocation(3, false, T, 179, false, T, 98, false, T, 20, false, T, 32, false, T, 180);
  Allocation(4, false, T, 170, false, T, 110, false, T, 25, false, T, 40, false, T, 180);
  Allocation(5, false, T, 160, false, T, 100, false, T, 23, false, T, 49, false, T, 180);
  Allocation(6, false, T, 145, false, T, 95, false, T, 20, false, T, 49, false, T, 180);
  Allocation(7, false, T, 145, false, T, 80, false, T, 2, false, T, 49, false, T, 180);




}

void loop() {
 R();

}


Ich schicke ihn natürlich rein wenn ich ihn zuende korrigiert habe also hoffentlich in den nächsten Tagen kann es aber nicht versprechen
Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: Tommy56 on Feb 10, 2020, 10:41 pm
Also Funktionsnamen wie R() und alles ohne Kommentar, was welche Funktion tun soll, das werden sich die Leser wohl kaum antun.
Aus Erfahrung: In 3 Wochen verstehst Du es auch nicht mehr.

Gruß Tommy
Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: postmaster-ino on Feb 10, 2020, 10:44 pm
Hi

OldPosition=90 - riecht nach Servos.
Das R steht dann wohl für 'Rest', weil der Rest ist wohl eher ...


MfG
Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: combie on Feb 10, 2020, 11:01 pm
Quote
Code: [Select]
Motor M0(3);
Motor M1(5);
Motor M2(6);
Motor M3(9);
Motor M4(10);
Das lässt sich auch noch aufpolieren!


Code: [Select]
Motor M[] {3,5,6,9,10};

Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: postmaster-ino on Feb 10, 2020, 11:03 pm
Hi

Da polierst Du aber trotzdem länger dran - befürchte, einstampfen und neu basteln kommt billiger.
Und bei dem Zug direkt ein/zwei Kommentare einflechten.

MfG
Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: Ace_Dark on Feb 11, 2020, 07:34 am
Ok Danke Neu schreiben werde ich den Code vermutlich erstmal nicht aber ich kümmere mich um Kommentare.
Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: combie on Feb 11, 2020, 11:11 am
Quote
aber ich kümmere mich um Kommentare.
Ein kleiner Tipp:
Schreibe in den Kommentaren, nicht was du da tust, sondern warum du es so tust.
Title: Re: Sorry schon wieder probleme mit meinem Code
Post by: Ace_Dark on Feb 16, 2020, 11:10 pm
Ok Danke combie komme momentan leider nicht dazu den Code zu verbessern poste das dann wenn ich es habe sorry