Go Down

Topic: Sorry schon wieder probleme mit meinem Code (Read 607 times) previous topic - next topic

Ace_Dark

Feb 10, 2020, 03:50 pm Last Edit: Feb 10, 2020, 03:57 pm by Ace_Dark
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

Peter-CAD-HST

KISS Q&D - keep calm and carry on - mind the gap - beware of sharks! -

combie

#2
Feb 10, 2020, 04:07 pm Last Edit: Feb 10, 2020, 04:14 pm by combie
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;
Heute war Gestern Morgen.
Heute ist Morgen Gestern.
Morgen ist Heute Gestern.
Gestern war Heute Morgen

Ace_Dark

#3
Feb 10, 2020, 04:11 pm Last Edit: Feb 10, 2020, 10:34 pm by Ace_Dark
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"

MicroBahner

#4
Feb 10, 2020, 04:11 pm Last Edit: Feb 10, 2020, 04:12 pm by MicroBahner
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

Zeig auch mal wo und wie Du diese .h-Datei einbindest. Davon hängt ab, was Du gegebenenfalls zusätzlich einbinden musst.
Gruß, Franz-Peter

michael_x

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?

Serenifly

#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

combie

#7
Feb 10, 2020, 04:18 pm Last Edit: Feb 10, 2020, 04:30 pm by combie
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.
Heute war Gestern Morgen.
Heute ist Morgen Gestern.
Morgen ist Heute Gestern.
Gestern war Heute Morgen

MicroBahner

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.
Gruß, Franz-Peter

Serenifly

#9
Feb 10, 2020, 04:22 pm Last Edit: Feb 10, 2020, 04:23 pm by Serenifly
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

combie

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.
Heute war Gestern Morgen.
Heute ist Morgen Gestern.
Morgen ist Heute Gestern.
Gestern war Heute Morgen

Ace_Dark

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

Tommy56

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
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

postmaster-ino

Hi

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


MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

combie

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

Heute war Gestern Morgen.
Heute ist Morgen Gestern.
Morgen ist Heute Gestern.
Gestern war Heute Morgen

Go Up