Increment und Decrement Variable!

Tommy56: Deine Zahlen mit führenden Leerzeichen formatieren, so dass die immer an der gleichen Stelle enden. Entweder händisch, wenn der Speicher knapp wird oder mit printf (Seriell) / sprintf (Puffer).

Gruß Tommy

Ich meine wenn sich die Zahlen (Variablen) ändern, dann ändern sich die längen der Variablen und somit verschieben sich die Texte die hinter den Zahlen stehen aber ich möchte das diese Texte Fix stehen egal wie lang die Zahl ist oder wird

Ja, habe ich Dir doch geschrieben. Nachdenken musst Du selbst.

Du legst fest, wie lang maximal die Zahl wird, z.B. 6 Zeichen vor dem .
Dann formatierst Du 12.34 zu 000012.34 und 112.34 zu 000112.34 oder Leerzeichen anstelle von 0. Damit bleibt das Ende der Zahl immer an der gleichen Stelle.
Schaue Dir die Doku zu printf an.

Gruß Tommy

Meinst Du sowas?

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB
  }
  berechnung(5000UL, 161000UL);
  berechnung(10UL, 322UL);
}

void loop() {}

void berechnung(unsigned long abstand, unsigned long elapsedtime) {
  const double Milli = 1000.0;
  const double Micro = 1000000.0;
  const double Gewicht = 0.0002;            // Gewicht in Kilogramm
  const double Multiplikator = 0.5;
  const double FPS = 3.2808399;            // Umrechnungsfaktor (so genau wie möglich)
  double time = (double) elapsedtime / Micro;
  double speed = (double) abstand / 100 / time;
  double fps = speed * FPS;
  double energie = Multiplikator * Gewicht * (speed * speed);

  ausgabe("        Abstand:", abstand, " cm");
  ausgabe("           Zeit:", elapsedtime, " us");
  ausgabe("        Gewicht:", Gewicht * Milli, " g");
  ausgabe("Geschwindigkeit:", speed, " m/s");
  ausgabe("Geschwindigkeit:", fps, " FPS");
  ausgabe("        Energie:", energie, " J");
  Serial.println("=====");
}
void ausgabe(const char* text1, double wert, const char* text2) {
  Serial.print(text1);
  double max = 100000;
  for (byte j = 0; j < 6; j++) {
    Serial.print(' ');
    if (wert >= max) break;
    max /= 10;
  }
  Serial.print(wert);
  Serial.println(text2);
}

agmue:
Meinst Du sowas?

void setup() {

Serial.begin(9600);
 while (!Serial) {
   ; // wait for serial port to connect. Needed for native USB
 }
 berechnung(5000UL, 161000UL);
 berechnung(10UL, 322UL);
}

void loop() {}

void berechnung(unsigned long abstand, unsigned long elapsedtime) {
 const double Milli = 1000.0;
 const double Micro = 1000000.0;
 const double Gewicht = 0.0002;            // Gewicht in Kilogramm
 const double Multiplikator = 0.5;
 const double FPS = 3.2808399;            // Umrechnungsfaktor (so genau wie möglich)
 double time = (double) elapsedtime / Micro;
 double speed = (double) abstand / 100 / time;
 double fps = speed * FPS;
 double energie = Multiplikator * Gewicht * (speed * speed);

ausgabe("        Abstand:", abstand, " cm");
 ausgabe("           Zeit:", elapsedtime, " us");
 ausgabe("        Gewicht:", Gewicht * Milli, " g");
 ausgabe(“Geschwindigkeit:”, speed, " m/s");
 ausgabe(“Geschwindigkeit:”, fps, " FPS");
 ausgabe("        Energie:", energie, " J");
 Serial.println("=====");
}
void ausgabe(const char* text1, double wert, const char* text2) {
 Serial.print(text1);
 double max = 100000;
 for (byte j = 0; j < 6; j++) {
   Serial.print(’ ');
   if (wert >= max) break;
   max /= 10;
 }
 Serial.print(wert);
 Serial.println(text2);
}

So Ungefähr. Ich meine das zum Beispiel Abstand soll ganz Rechts stehen die Variable selber soll in der Mitte stehen da sie sich in ihrer länge ändert und die Einheiten ganz Rechts aber die Einheiten sollen trotzdem so nahe wie möglich mit maximal einem Abstand neben der Zahl stehen

Edit: ausgabe (“Abstand: “, abstand,” cm”)
ungefähr so

Ich gebs auf.

Gruß Tommy

7ower3efender: So Ungefähr. Ich meine das zum Beispiel Abstand soll ganz Rechts stehen die Variable selber soll in der Mitte stehen da sie sich in ihrer länge ändert und die Einheiten ganz Rechts aber die Einheiten sollen trotzdem so nahe wie möglich mit maximal einem Abstand neben der Zahl stehen

Edit: ausgabe ("Abstand: ", abstand," cm") ungefähr so

Das Problem ist bei mir aber wenn ich es mit Abständen mache dann verschiebt sich die Einheit nach hinten und nicht das die Zahl einfach nach vorne hin sich verschiebt??

Ausgabe von #62:

        Abstand:   5000.00 cm
           Zeit: 161000.00 us
        Gewicht:      0.20 g
Geschwindigkeit:    310.56 m/s
Geschwindigkeit:   1018.89 FPS
        Energie:      9.64 J
=====

dtostrf() ist auch eine Option um Floats zu formatieren:

https://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga060c998e77fb5fc0d3168b3ce8771d42

agmue: Wenn Dich die gleichen Ergebnisse nicht verwundern, wo ist dann das Problem? Sehe ich es nicht oder gibt es das nicht?

Hallo,

ich weiß nicht wie du auf die Zahlen gekommen bist die du in deiner Rechnung verwendest. Aber wenn beide Zahlen das gleiche Verhältnis darstellen, dann spielt der Rest der Formel keine Rolle. 5000 / 161000 = 0,0310559... 10 / 322 = 0,0310559...

agmue: Ausgabe von #62:

        Abstand:   5000.00 cm
           Zeit: 161000.00 us
        Gewicht:      0.20 g
Geschwindigkeit:    310.56 m/s
Geschwindigkeit:   1018.89 FPS
        Energie:      9.64 J
=====

genau so meine ich es doch da ich es ja nicht am Serielmonitor sondern am Oled Display ausgebe ist es für mich etwas komplizierter.

Doc_Arduino: ich weiß nicht wie du auf die Zahlen gekommen bist die du in deiner Rechnung verwendest.

Durch Dreisatz der Werte aus #50, daher müssen die Werte per Taschenrechner auch identisch sein. Ich hatte das Thema möglicherweise mißverstanden, weil ich annahm, die Rechnung mittels float auf dem UNO sei ungenau.

Macht ja nichts, so wurde mein Teensy mal wieder entstaubt.

Wo Integerarethmetik eine Verbesserung gegenüber float bringen soll, erschließt sich mir nicht, da float doch hinreichend genug rechnet, oder?

7ower3efender: genau so meine ich es doch da ich es ja nicht am Serielmonitor sondern am Oled Display ausgebe ist es für mich etwas komplizierter.

Verwendest Du eine proportionale Schrift?

agmue: Wo Integerarethmetik eine Verbesserung gegenüber float bringen soll, erschließt sich mir nicht, da float doch hinreichend genug rechnet, oder?

Von der Sache sollte dem TO die Genauigkeit mit float ausreichend sein. Will ja eh nur 2 Kommastellen. Da er jedoch betonte das er [u]höchstmögliche[/u] Genauigkeit in seiner Rechnung haben möchte wurde die ganze Geschichte mit der Ganzzahlrechnung ins Leben gerufen. Deswegen machen wir den "Mist" hier. Die Rundungsfehler mit float sieht man nicht sofort. Aber wenn du mit float 2-3x hin und her rechnest bekommst du ein Problem. Wenn du mit dem Wert weiterrechnest ...... . Dabei ist es egal welche Genauigkeit float hat, dass Ergebnis stimmt einfach nicht.

void setup(void) {
  Serial.begin(9600);
  float x = 33.0;
  x = x/10.0;
  x = x-3.0;
  x = x*10.0;
  Serial.println(x,10);
}

void loop(void)
{ }

Ergebnis UNO: 2.9999995231

Ergebnis Teensy mit double: 3.0000000000