Increment und Decrement Variable!

allo,

doch du kannst und musst es umändern. Egal wie du rechnest, egal was du machst, egal wie groß der mögliche Wertebereich ist. Irgendwann ist immer Schluss und man muss sich dem anpassen. Du musst verstehen lernen zwischen der internen genauen Rechnung und der Rechnung zur Anzeigekosmetik zu unterscheiden.

Was habe ich hier gemacht? 50ULL * 1000.000.000 / 161.000 Ich habe den Faktor um 1000 vergrößert. Ich sehe kein Problem dies zu tun. Du hast mit unsigned long long 64Bit zur Verfügung. Die Multiplikation darf den 64Bit Wertebereich nicht überschreiten vor der Division. Das ist alles.

Du musst deine Faktoren sowieso anpassen wenn du mit anderen Einheiten rechnest (cm statt m) damit am Ende immer etwas sinnvolles herauskommt. Immer flexibel bleiben.

Okay, ich werde morgen nochmals mich mit dem Codes auseinandersetzen und wenn möglich die Berechnung auf Ganzzahlen umschreiben und danach deinen Code um auf Gleitkomma umrechnen zu können hineinnehmen

Doc_Arduino:
Bedenke, Programmierdefizite kann man nicht durch Hardware ersetzen.
Die Ablenkung in diese Richtung halte ich für komplett falsch und führt zu nichts.

Beim Besuch einer autofreien Nordseeinsel wollte ich diese erkunden. Als unsportlicher Mensch ohne eigenes Fahrrad habe ich mir ein Fahrrad mit Elektromotor geliehen. Verurteile mich, wenn Du magst, aber ich hatte eine schöne Urlaubszeit.

Wenn man ein Ziel erreichen möchte, dann muß jeder den für ihn gangbaren Weg finden. Das ist immer eine Abwägung. Ich sehe meine Aufgabe darin, Möglichkeiten aufzuzeigen und Erfahrungen zu vermitteln.

Ich möchte was lernen, auf geht’s.

7ower3efender:
Kann man den ebenfalls per Arduino IDE programmieren oder ist dies wieder anders und wäre das zum Beispiel der Richtige??

Mit einem Zusatz (Teensyduino) wird der Teensy wie ein UNO in der IDE zur Auswahl angeboten. Der Teensy ist kein Einsteigermodell, weil er mit 32 Bit und 3,3V arbeitet und viele verwirrende Möglichkeiten bietet. Aber ich habe einen 3.2 und kann daher begrenzt Hilfe anbieten. Normal hängt der im Keller und bespaßt APA102-LEDs in der Bar.

Der Link ist richtig, möglich wären Teensy 3.2 ohne Gleitkommaprozessor, 3.5 und 3.6.

7ower3efender:
Das kann ich nicht so einfach umändern wie du es tust da die zeit die ich messe in Mikrosekunden ist also 161000us dabei ist diese Zahl eine ausgedacht Zahl da es auch sein könnte das diese 152789us sein kann das kommt drauf an wie schnell das Projektil fliegt welches durch die beiden Sensoren fliegt. Ich muss in Mikrosekunden messen da es auch mal schneller sein kann da der Abstand am Ende dann keine 50 Meter sind sondern dann 10cm. Die 50Meter wurden nur als Testzwecke verwendet um den Code auszuprobieren ob alles so weit funktioniert da ich ja nicht im Mikrosekundenbereich einen Taster drücken kann.

Basierend auf Deinem Programm aus #9 und den 50 m und 10 cm habe ich mal geschaut, was Deine Berechnungen in OpenOffice ergeben:

Dann habe ich Dein Programm mit den entsprechenden Werten für 50 m und 10 cm laufen lassen:

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

  Serial.print("        Abstand: "); Serial.print(abstand); Serial.println(" cm");
  Serial.print("           Zeit: "); Serial.print(elapsedtime); Serial.println(" us");
  Serial.print("        Gewicht: "); Serial.print(Gewicht * Milli); Serial.println(" g");
  Serial.print("Geschwindigkeit: "); Serial.print(speed); Serial.println(" m/s");
  Serial.print("Geschwindigkeit: "); Serial.print(fps); Serial.println(" FPS");
  Serial.print("        Energie: "); Serial.print(energie); Serial.println(" J");
  Serial.println("=====");
}

Ausgabe UNO:

  Abstand: 5000 cm
           Zeit: 161000 us
        Gewicht: 0.20 g
Geschwindigkeit: 310.56 m/s
Geschwindigkeit: 1018.89 FPS
        Energie: 9.64 J
=====
        Abstand: 10 cm
           Zeit: 322 us
        Gewicht: 0.20 g
Geschwindigkeit: 310.56 m/s
Geschwindigkeit: 1018.89 FPS
        Energie: 9.64 J
=====

Ausgabe Teensy 3.2:

  Abstand: 5000 cm
           Zeit: 161000 us
        Gewicht: 0.20 g
Geschwindigkeit: 310.56 m/s
Geschwindigkeit: 1018.89 FPS
        Energie: 9.64 J
=====
        Abstand: 10 cm
           Zeit: 322 us
        Gewicht: 0.20 g
Geschwindigkeit: 310.56 m/s
Geschwindigkeit: 1018.89 FPS
        Energie: 9.64 J
=====

Jetzt komme ich ins Grübeln, denn nun kann ich keinen Fehler sehen :confused:

OpenOffice.png

agmue:

Quote from: Doc_Arduino on 22-05-2019, 19:50:34 Bedenke, Programmierdefizite kann man nicht durch Hardware ersetzen. Die Ablenkung in diese Richtung halte ich für komplett falsch und führt zu nichts.

Beim Besuch einer autofreien Nordseeinsel wollte ich diese erkunden. Als unsportlicher Mensch ohne eigenes Fahrrad habe ich mir ein Fahrrad mit Elektromotor geliehen. Verurteile mich, wenn Du magst, aber ich hatte eine schöne Urlaubszeit.

ach Andreas, dass ist doch fehl interpretiert. Welche Voraussetzung muss man haben um Fahrrad zufahren? Wenn du Radfahren kannst und dir nur die Kraft fehlt für weitere Strecken, dann ist das kein Problem es durch ein eBike zuersetzen. Nur was nützt dir ein eBike wenn du nicht Radfahren kannst, weil du laufend hinfällst.

Übrigens verwundern mich die gleichen Ergebnisse nicht. ;)

Ich wurde extra gewarnt, da viele eBike-Fahrer mit dem Hubschrauber ins Krankenhaus geflogen werden. Das konnte ich glücklicherweise vermeiden.

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

Das Programm aus #9 gibt auch die richtigen Werte aus:

Gewicht: 0.20g
Geschwindigkeit: 310.56m/s
Geschwindigkeit: 1018.89fps
Energie: 9.64J

Much Ado About Nothing?

Er findet das Programm halt einfach nicht schön Programmiert er hätte es wohl lieber statt mit Gleitkomma mit Ganzzahlen aber wenn ich ehrlich sein soll dann bin ich über den Code den ich gepostet habe sehr zufrieden. Da er die Ergebnisse liefert ich haben möchte. Daher habe ich ja auch gesagt falls ihn jemand hässlich findet da er sich besser auskennt und die Zeit und die Freude daran hat dann kann er ihn umprogrammieren. Da ihr mir aber gesagt habt das es genauer wäre wenn ich nur mit Ganzzahlen rechne. Zum Schluss erst diese auf Gleitkomma umwandle, bin ich gerade dabei den Code umzuschreiben doch dies wird für mich eine harte Angelegenheit da ich natürlich kein Profi darin bin und ich meist nur Sensoren abfrage und irgendwas damit schalten lasse und somit nicht das Know - How habe und es für mich auch relativ schwierig ist die meisten Codes klar zu verstehen obwohl ich zwar verstehe was jetzt welcher Befehl tut. Also solange nicht jemand einen Code schreibt und danach eine kleine Beschreibung dazu tut kann ich nur durch Fragen stellen und probieren mir die Beschreibung zusammenwürfeln und nicht einmal das schaffe ich ordentlich.

So Leute eine letzte und abschließende Frage hätte ich noch. Ich gebe Text1-Variable-Text2 aus und als Frage hätte ich ob man Text 2 irgendwie Fixieren könnte so das zum Beispiel "Speed: 1000.00 m/s" die m/s immer Fix sind und sich nicht je nach größe der Variable ändern??

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

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)
{ }