- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 10

Thema: Unverständliche Konsolen-Anzeige

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242

    Unverständliche Konsolen-Anzeige

    Hallo,

    bitte in die Antwort nicht viel Zeit investieren, ich such selber noch. Aber evtl. fällt euch spontan was ein.
    Der Code ist auch auf das Wesentliche gekürzt

    Code:

    float lzahn2;
    float lzahn2_alt = 98; // Ausfahrlänge von Zahnstange 2 nach Justierung
    float lzahn3;
    float lzahn3_alt = 67; // Ausfahrlänge von Zahnstange 3 nach Justierung
    float x1 = 344.67; // // Koordinaten von Punkt P1, den das Schaufelgelenk ansteuern soll
    float y1 = 184.45; //
    float W4;

    void setup() {

    Serial.begin (250000); // diese Buadrate muss auch in der Konsole (Serieller Monitor) eingestellt sein
    while (!Serial);

    }

    void loop() {


    Serial.print ("Drehwinkel2 = ");
    Serial.println (Drehwinkel2_ber (),4); // Druckt Ergebnis des UPs mit 4 Stellen hinter dem Komma
    Serial.print ("Drehwinkel3 = ");
    Serial.println (Drehwinkel3_ber (),4); // Druckt Ergebnis von lzahn2 mit 4 Stellen hinter dem Komma
    Serial.print ("lzahn2 = ");
    Serial.println (lzahn2); // Druckt Ergebnis von lzahn2
    Serial.print ("lzahn3 = ");
    Serial.println (lzahn3); // Druckt Ergebnis von lzahn3

    delay(2000);

    }


    // **************************************Unterprogram m Drehwinkel2_ber *******************************


    int Drehwinkel2_ber ( ) {

    // hier Berechnung von delta_lzahn2

    int Drehwinkel2 = int(470.0 / 77.0 * delta_lzahn2);

    Serial.print ("Klammer = ");
    Serial.println (470.0 / 77.0 * delta_lzahn2); // Druckt Ergebnis von Klammer
    Serial.println (Drehwinkel2); // Druckt Ergebnis von Drehwinkel2

    delay(5000);
    return Drehwinkel2; // die Ausgabe erfolgt in Grad

    }


    // **************************************Unterprogram m Drehwinkel3_ber *******************************


    float Drehwinkel3_ber ( ) {


    // hier Berechnung von lzahn3 und Drehwinkel3

    int Drehwinkel3 = int(470.0 / 77.0 * delta_lzahn3);

    return Drehwinkel3; // die Ausgabe erfolgt in mm

    }





    Auf der Konsole sehe ich dann sofort:

    Drehwinkel2 = Klammer = 469.53
    469 das ist nch ok

    dann nach 5 s
    13111 woher kommt die ?

    Im Code sind die Befehle, die zu diesen Ausgaben führen fett

    Gruß fredyxx

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    13111 sollte das Ergebnis der Funktion 'Drehwinkel3_ber' sein.
    int Drehwinkel3 = int(470.0 / 77.0 * delta_lzahn3); Wo ist das 'delta_lzahn3' definiert?

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242
    Sehr seltsam! Zunächst dachte ich, ich könnte den Fehler nicht wieder rekonstruieren, denn das Ergebnis entsprach genau meinen Erwartungen, nämlich:

    Drehwinkel2 = Klammer = 469.53
    469
    469
    Drehwinkel3 = 7.00
    lzahn2 = 174.92
    lzahn3 = 68.21

    Dann habe ich noch mal verglichen wie der Code oben genau aussah und festgestellt, dass ich die Angabe der Stellen hinter dem Komma/Punkt in diesen Befehlen weggelassen hatte:

    Serial.println (Drehwinkel2_ber (),4); und
    Serial.println (Drehwinkel3_ber (),4);

    Wenn ich die wieder eintrage, dann ist der Fehler wieder da; nämlich so wie oben

    Drehwinkel2 = Klammer = 469.53
    469
    13111
    Drehwinkel3 = 7.00
    lzahn2 = 174.92
    lzahn3 = 68.21

    Dabei reicht es auch, wenn ich die Stelleangabe nur bei dem Druckbefehl für "Drehwinkel2_ber ()" eintrage.

    Wenn nicht schon vorhanden, kann man bei so einem Fehler graue Haare bekommen.

    Nun fällt mir auch eine Erklärung ein:
    Ich erwarte von einer int-Zahl, dass sie Stellen hinter dem Komma hat; verleitet durch die Parallelrechnung in Excel

    Danke und Gruß
    fredyxx

  4. #4
    HaWe
    Gast
    ich hätte da vlt einen Tipp -
    aber vorher eine Frage: welchen Arduino hast du? einen Mega?

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242
    einen UNO für die Trockenversuche. Später einen MEGA

  6. #6
    HaWe
    Gast
    ok, für einen Uno ist meine Lösung nicht geeignet, wohl aber für einen Mega.

    Es geht um das unsägliche Serial.print mit seinen schauderhaften Formatiermöglichkeiten.

    In C nutzt man für Ausgaben den sehr mächtigen Befehl printf(), wenn man direkt ausgeben will, bzw. sprintf(), wenn man die Ausgabezeile erst einmal in einen Puffer-String kopieren will.
    Da eine direkte printf() Ausgabe bei Arduino Sketch nicht möglich ist, bleibt also nur sprintf(), und dann den Pufferstring per Serial.print (ohne weitere Formatierung).
    Beide C-Funktionen nutzen ein 100% identisches Formatiersystem.

    Aber:
    Die schlauen Arduino-Entwickler haben die Float-Ausgabe für sprintf() bei AVRs unterbunden. Will man sie nutzen, kann man aber die lib patchen.

    Das ist viel Aufwand und eine Menge Holz für einen Anfänger, und unsinnig für einen Uno, da zuwenig Speicher. Für einen Mega ist es den Aufwand aber wert.

    Statt
    Serial.print ("Drehwinkel2 = ");
    Serial.println (Drehwinkel2_ber (),4);

    hättest du dann
    char sbuf[100]; // string buffer
    sprintf(sbuf,"Drehwinkel2 = %.4f \n ", Drehwinkel2_ber () ); // sbuf zusammensetzen, evtl auch mit noch viel mehr Variablen und String-Bezeichnern
    Serial.print(sbuf);


    Das macht bei 1 string und 1 Variablen noch nicht viel aus, erleichtert aber erheblich die Formatierung bei komplexeren Aufgaben.

    Wie gesagt, sehr mächtig, ein wenig aufwändig, aber anschließend höchst effizient, und du siehst leichter, welche Variablen evtl falsch formatiert wurden (int vs. float).
    Hier ist die Beschreibung zu printf und sprintf:

    http://www.cplusplus.com/reference/cstdio/printf/
    http://www.cplusplus.com/reference/cstdio/sprintf/

    Wenn es dich interessiert, poste ich dir auch den Link zum Float-Patch für den Mega.

Ähnliche Themen

  1. [ERLEDIGT] MCP3551 - AD Wandler liefert unverständliche Daten
    Von Lutzacht im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 11.05.2014, 09:23
  2. LCD Anzeige
    Von elkokiller im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 13.05.2008, 13:50
  3. LED-Anzeige
    Von Schnippsel im Forum Elektronik
    Antworten: 21
    Letzter Beitrag: 14.01.2008, 10:36
  4. 2D - LED-Anzeige
    Von squelver im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 23
    Letzter Beitrag: 05.03.2007, 14:29
  5. LED Anzeige
    Von Elektronikus im Forum Elektronik
    Antworten: 24
    Letzter Beitrag: 15.02.2005, 19:10

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad