Arduino Forum

International => Deutsch => Topic started by: 7ower3efender on May 21, 2019, 04:42 pm

Title: Increment und Decrement Variable!
Post by: 7ower3efender on May 21, 2019, 04:42 pm
Hallo liebe Community!
Ich habe ein kleines Problem und finde es nicht heraus wie ich diesen Code umschreiben müsste um die Variable "Gewicht" genau bei 0,2g zu stoppen doch er hüpft immer beim Dekrementieren auf 0,19g und sobald ich wieder Inkrementieren auf 0,21g und nicht auf 0,2g  :smiley-confuse:

Ich hoffe irgendwer kann mir dabei weiterhelfen.

Code: [Select]
const int  buttonPin = 2;
const int  buttonPin1 = 3;
const double Milli = 1000.0;
double Gewicht = 0.0002; 
int buttonState5 = 0;
int buttonState6 = 0;
int lastButtonState = 0;

void setup() { 
   pinMode(buttonPin, INPUT);
   pinMode(buttonPin1, INPUT);
   Serial.begin(115200);
}


void loop() {
   buttonState5 = digitalRead(buttonPin);
   if (buttonState5 != lastButtonState) {
     if (buttonState5 == HIGH){
      Gewicht = Gewicht + 0.00001;
      Serial.println(String("Gewicht: ")+Gewicht*Milli+String("g"));
     }
     delay(100);
   }
   lastButtonState = buttonState5;
   
   buttonState6 = digitalRead(buttonPin1);
   if (buttonState6 != lastButtonState) {
     if (buttonState6 == HIGH){
      Gewicht = Gewicht - 0.00001;
      Serial.println(String("Gewicht: ")+Gewicht*Milli+String("g"));
     }
     delay(100);
     if (Gewicht < 0.00019){
      Gewicht = 0.0002;   
     }
   }
   lastButtonState = buttonState6;
}
Title: Re: Increment und Decrement Variable!
Post by: Serenifly on May 21, 2019, 04:55 pm
Gleitkommazahlen haben systembedingt Rundungsfehler:
https://www.h-schmidt.net/FloatConverter/IEEE754de.html (https://www.h-schmidt.net/FloatConverter/IEEE754de.html)

0.0002 ist z.B. nicht genau darstellbar sondern wird zu 0.00019999...
Title: Re: Increment und Decrement Variable!
Post by: Doc_Arduino on May 21, 2019, 05:11 pm
Hallo,

das mit float dachte ich auch erst, dass klappt hier jedoch. Das Problem liegt in der Reihenfolge der Abfrage, der Wertzuweisung auf 0.2 und der Anzeige. Die Anzeige kommt vor der Wertänderung. Intern ist alles korrekt nur man sieht es nicht. Beim nächsten + kommt 0.01 zu 0.2 dazu. Der Sketch arbeit so wie er aufgebaut ist 100% korrekt. Nimm das *Milli raus, dann siehste das besser.

Ich würde dennoch wie schon von Serenifly angesprochen alles soweit es geht in Ganzzahlen rechnen und erst für die Anzeige in Kommastellen darstellen/umrechnen. Bei Ganzzahlen gibts keine Rundungsfehler. Es ist ja kein Problem intern mit Zahlen von 2000 für Gramm zu hantieren für eine Anzeige von 2kg.
Title: Re: Increment und Decrement Variable!
Post by: uwefed on May 21, 2019, 05:22 pm
Es gibt nicht nur Rundungsfehler sondern auch , wenn 2 verschieden große Gleitkommazahlen zusammengezählt werden einen Punkt wo das Dazuaddieren die größere Zahl nicht mehr verändert.
Ok, das ist auch ein Rundungsfehler aber daran denkt man nicht.
Grüße Uwe
Title: Re: Increment und Decrement Variable!
Post by: Doc_Arduino on May 21, 2019, 05:52 pm
Hallo,

habe mir mal erlaubt das umzubauen mit Tendenz zum aufräumen. Kann als Basis zum weiteren Ausbau dienen.

Code: [Select]
unsigned long Gewicht = 20;

struct Taster
{
  byte pin;
  bool zustand = false;
};

Taster taster2;
Taster taster3;

void setup() {

  taster2.pin = 2;
  taster3.pin = 3;
  
  pinMode(taster2.pin, INPUT);
  pinMode(taster3.pin, INPUT);
  Serial.begin(115200);
}


void loop() {

  update_Taster();
  
  if (taster2.zustand) {
    Gewicht++;
    taster2.zustand = false;
  }

  if (taster3.zustand) {
    Gewicht--;
    if (Gewicht < 20) {
      Gewicht = 20;
    }
    taster3.zustand = false;
  }

  anzeige(Gewicht);
}



void update_Taster ()
{
  static unsigned long last_ms = 0;
  unsigned long ms = millis();

  if (ms - last_ms >= 40) {
    last_ms = ms;

    taster2.zustand = digitalRead(taster2.pin);
    taster3.zustand = digitalRead(taster3.pin);
  }
}


void anzeige (unsigned long gewicht)
{
  static unsigned long altesGewicht = 0;

  if (gewicht != altesGewicht)
  {
    Serial.print(F("Gewicht: "));
    Serial.print(gewicht);
    Serial.print("g");
    Serial.print("\t\t");
    Serial.print((gewicht/1000.0),3);
    Serial.println("kg");
    altesGewicht = gewicht;
  }
}

Edit: Anzeige verfeinert
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 21, 2019, 06:12 pm
Okay Danke für die Hilfe werde es gleich mal ausprobieren und halt wie ihr gesagt habt den Code etwas Umschreiben

Vielen Dank für die Hilfe derweil!
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 21, 2019, 06:21 pm
Hallo,

habe mir mal erlaubt das umzubauen mit Tendenz zum aufräumen. Kann als Basis zum weiteren Ausbau dienen.

Code: [Select]
unsigned long Gewicht = 20;

struct Taster
{
  byte pin;
  bool zustand = false;
};

Taster taster2;
Taster taster3;

void setup() {

  taster2.pin = 2;
  taster3.pin = 3;
 
  pinMode(taster2.pin, INPUT);
  pinMode(taster3.pin, INPUT);
  Serial.begin(115200);
}


void loop() {

  update_Taster();
 
  if (taster2.zustand) {
    Gewicht++;
    taster2.zustand = false;
  }

  if (taster3.zustand) {
    Gewicht--;
    if (Gewicht < 20) {
      Gewicht = 20;
    }
    taster3.zustand = false;
  }

  anzeige(Gewicht);
}



void update_Taster ()
{
  static unsigned long last_ms = 0;
  unsigned long ms = millis();

  if (ms - last_ms >= 40) {
    last_ms = ms;

    taster2.zustand = digitalRead(taster2.pin);
    taster3.zustand = digitalRead(taster3.pin);
  }
}


void anzeige (unsigned long gewicht)
{
  static unsigned long altesGewicht = 0;

  if (gewicht != altesGewicht)
  {
    Serial.print(F("Gewicht: "));
    Serial.print(gewicht);
    Serial.print("g");
    Serial.print("\t\t");
    Serial.print((gewicht/1000.0),3);
    Serial.println("kg");
    altesGewicht = gewicht;
  }
}

Edit: Anzeige verfeinert
Funktioniert Eins A nur mir etwas zu schnell um von 1Gramm auf 2 Gramm umschalten zu können es sollte Machbar sein es mit einem Taster zu um eins zu erhöhen und verringern.
Muss ich dazu einfach ein Delay im Code setzen oder??
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 21, 2019, 06:27 pm
Habe gerade herausgefunden das ich einfach die Zahl die du vergleichst in "update_Taster" einfach erhöhen muss um die Reaktionszeit zu verringern.
Habe ich dabei Recht oder ist meine Vermutung dabei Falsch??
Title: Re: Increment und Decrement Variable!
Post by: Doc_Arduino on May 21, 2019, 06:33 pm
Hallo,

genau das hatte ich mir auch soeben gedacht das es stören könnte.
Delay? Um Himmelswillen, bloss nicht.  Dann wäre der Aufwand mit millis für die Katz.
Das bekommste hier nebenbei frei Haus geliefert.

Zum Verständnis warum, weshalb und wie:
Theseus erklärt millis()
http://forum.arduino.cc/index.php?topic=400102.msg2752141#msg2752141 (http://forum.arduino.cc/index.php?topic=400102.msg2752141#msg2752141)

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung
http://forum.arduino.cc/index.php?topic=423688.0 (http://forum.arduino.cc/index.php?topic=423688.0)

Hier der geänderte Code. Ich verwende Pullup und muss dann immer nochmal vorm posten umarbeiten. Müssen deine Taster auf High reagieren? Ich hoffe ich habe nichts vergessen. Es reagiert nur auf erneuten Tastendruck. Rasselt also nicht mehr durch.

Code: [Select]

unsigned long Gewicht = 20;

struct Taster
{
  byte pin;
  bool read = false;
  bool oldRead = false;
  bool state = false;
};

Taster taster2;
Taster taster3;

void setup() {

  taster2.pin = 2;
  taster3.pin = 3;

  pinMode(taster2.pin, INPUT);
  pinMode(taster3.pin, INPUT);
  Serial.begin(115200);
}


void loop() {

  update_Taster();

  if (taster2.state) {
    Gewicht++;
    taster2.state = false;
  }

  if (taster3.state) {
    Gewicht--;
    if (Gewicht < 20) {
      Gewicht = 20;
    }
    taster3.state = false;
  }

  anzeige(Gewicht);
}



void update_Taster ()
{
  static unsigned long last_ms = 0;
  unsigned long ms = millis();

  taster2.state = false;
  taster3.state = false;

  if (ms - last_ms >= 40) {
    last_ms = ms;

    taster2.read = digitalRead(taster2.pin);
    taster3.read = digitalRead(taster3.pin);

    if (taster2.read && (!taster2.oldRead) ) {
      taster2.state = true;
    }
    
    if (taster3.read && (!taster3.oldRead) ) {
      taster3.state = true;
    }

    taster2.oldRead = taster2.read;
    taster3.oldRead = taster3.read;
  }
}


void anzeige (unsigned long gewicht)
{
  static unsigned long altesGewicht = 0;

  if (gewicht != altesGewicht)
  {
    Serial.print(F("Gewicht: "));
    Serial.print(gewicht);
    Serial.print("g");
    Serial.print("\t\t");
    Serial.print((gewicht/1000.0), 3);
    Serial.println("kg");
    altesGewicht = gewicht;
  }
}


Wenn es läuft, mach das Beste daraus. Verstehe den Ablauf.   ;)

Edit:
wegen "der Erhöhung", probiere es aus, spiele rum, damit lernt man auch, teste auch größere Werte und merke was sich in der Bedienung verändert. Danach kannste den neuen Code testen.

Edit 2:
mal wieder was "vergessen", die Zeilen 31 und 39 können raus, dass rücksetzen auf false macht die update_Taster Funktion schon
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 21, 2019, 06:45 pm
Also ich muss sagen das Verständnis hätte ich ja wenn ich mir so den Code anschaue und nebenbei es praktisch Überprüfe aber so alleine ist es für mich etwas schwierig vor allem so einen Code wie diesen zu schreiben :D

So nun habe ich noch eine kurze Frage.
Ich habe noch einen Code und ich möchte nun den Code den @Doc_Arduino mit diesen hier verbinden um das Gewicht (Varibale) per Tasten druck zu erhöhen oder verringern. Um anschließend bei der Auslösung der beiden Sensoren (Zeitmessung) die richtige Berechnung zu erhalten.

Code: [Select]
#define Button1  2
#define Button2  3
long int elapsedtime, starttime;
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 Abstand = 50.0;              // Abstand in Meter
const double fps = 3.2808399;            // Umrechnungsfaktor (so genau wie möglich)
double Time;
double Speed;
double Energie;
double FPS;
 
void setup() {
 pinMode(Button1, INPUT);
 pinMode(Button2, INPUT);
 Serial.begin(115200);
}
 
void loop() {
  while (digitalRead(Button1) == false){
  }

    starttime = micros();

  while (digitalRead(Button2) == false){  
  }

    elapsedtime = (micros() - starttime);
    Time = elapsedtime / Micro;
    Speed = Abstand / Time;
    FPS = Speed * fps;
    Energie = Multiplikator * Gewicht * (Speed * Speed);

  Serial.println("");
  Serial.println(String("Gewicht: ")+Gewicht*Milli+String("g"));
  Serial.println("");
  Serial.println(String("Geschwindigkeit: ")+Speed+String("m/s"));
  Serial.println("");
  Serial.println(String("Geschwindigkeit: ")+FPS+String("fps"));
  Serial.println("");
  Serial.println(String("Energie: ")+Energie+String("J"));
  Serial.println("");
}


Edit: Falls hier in diesem Code schon irgendwas euch auffallen sollte bitte verbessert mich :d
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 21, 2019, 06:53 pm
Edit: Es ist eigentlich egal ob es Pullup oder Pulldown wäre ich habe es nur deswegen da ich es in diesem Code so Programmiert habe sonst wäre es egal.
Title: Re: Increment und Decrement Variable!
Post by: Doc_Arduino on May 21, 2019, 07:00 pm
Hallo,

ich hoffe das war nun alles nicht umsonst.

Schau dir den Code an, schau wie die update_Taster Funktion arbeitet.
Warum überhaupt Funktionen? Code ist lesbarer und einfacher wartbar.

Wenn das verstanden ist, ist die Ergänzung der Zeitmessung mit 2 weiteren Taster ein Kinderspiel.
Viel machen musst du eigentlich nicht, nur abgucken und sanft erweitern.

Pullup:
gut, dann die Pullup Variante. Macht vieles leichter, weil das bei den meisten Programmierern die Standardeinstellung ist. Spart den externen Widerstand, Taster zwischen Pin und Masse.
Code: [Select]

// https://forum.arduino.cc/index.php?topic=617098.0

unsigned long Gewicht = 20;

struct Taster
{
  byte pin;
  bool read = true;
  bool oldRead = true;
  bool state = false;
};

Taster taster2;
Taster taster3;

void setup() {

  taster2.pin = 2;
  taster3.pin = 3;

  pinMode(taster2.pin, INPUT_PULLUP);
  pinMode(taster3.pin, INPUT_PULLUP);
  Serial.begin(115200);
}


void loop() {

  update_Taster();

  if (taster2.state) {
    Gewicht++;
  }

  if (taster3.state) {
    Gewicht--;
    if (Gewicht < 20) {
      Gewicht = 20;
    }
  }

  anzeige(Gewicht);
}


void update_Taster ()
{
  static unsigned long last_ms = 0;
  unsigned long ms = millis();

  taster2.state = false;
  taster3.state = false;

  if (ms - last_ms >= 40) {
    last_ms = ms;

    taster2.read = digitalRead(taster2.pin);
    taster3.read = digitalRead(taster3.pin);

    if (!taster2.read && (taster2.oldRead) ) {
      taster2.state = true;
    }
   
    if (!taster3.read && (taster3.oldRead) ) {
      taster3.state = true;
    }

    taster2.oldRead = taster2.read;
    taster3.oldRead = taster3.read;
  }
}


void anzeige (unsigned long gewicht)
{
  static unsigned long altesGewicht = 0;

  if (gewicht != altesGewicht)
  {
    Serial.print(F("Gewicht: "));
    Serial.print(gewicht);
    Serial.print("g");
    Serial.print("\t\t");
    Serial.print((gewicht/1000.0), 3);
    Serial.println("kg");
    altesGewicht = gewicht;
  }
}
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 21, 2019, 07:22 pm
Okay ich werde mich mal damit bis morgen auseinandersetzen. Falls ich noch fragen habe oder ich es nicht Akzeptabel zusammen bringe hoffe ich das ich auf die Hilfe der Community zählen kann?? :D
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 21, 2019, 07:37 pm
Was bedeutet "long int"??
Ist damit gemeint das die erste Variable den Datentyp "Long" besitzt und die zweite dann den Datentype "Int" oder bedeutet das was anderes??
Title: Re: Increment und Decrement Variable!
Post by: Serenifly on May 21, 2019, 07:52 pm
"long int" ist nur eine umständliche Schreibweise für "long". Du kannst auch "signed long int" schreiben um es noch deutlicher zu machen
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 21, 2019, 08:01 pm
Achso also sind beide Variablen zwei einfache Long Datentypen
Title: Re: Increment und Decrement Variable!
Post by: postmaster-ino on May 21, 2019, 08:15 pm
Hi

Oder Du schreibst int32_t (für signed) oder uint32_t (für unsigned).
Gleiches geht auch mit 64,16,8 und bestimmt, wie viele Bit diese Variable breit ist.
Das U sagt, daß die Variable kein Vorzeichen hat, also keine negativen Werte annehmen kann.
Byte (=uint8_t) 0...255 (8 Bit)
char (=int8_t) -128...127 (8 Bit, davon 7 für den Wert und das MSB für das Minus)

Persönlich finde ich diese Schreibweise 'eingängiger'/logischer.
Ein int ist hier auf dem normalem Arduino 16 Bit, auf den ARM-Typen 32, wenn ich das Gelesene recht interpretiert habe.
Mein uint16_t bleibt 16 Bit, egal auf welcher Hardware.

MfG
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 21, 2019, 09:20 pm
So habe eine kleine Frage da ich schon fast fertig bin mit dem Umschreiben der beiden Codes. Wie würde der Code aussehen das ich einen Taster abfragen kann der schon benutzt ist ob dieser statt nur einmal zweimal in einer kurzen Zeit gedrückt wurde??
Möchte nämlich eine Variable auf True setzen wenn dies zutrifft und wenn ich dann den Taster nochmals in kurzer Zeit doppelt Drücke wieder zurück auf False.

Edit: Dabei wäre es oder besser gesagt möchte ich den Taster mit dem ich Inkrementiere verwenden.
Title: Re: Increment und Decrement Variable!
Post by: postmaster-ino on May 21, 2019, 09:38 pm
Hi

Du merkst Dir, wann Du zuletzt den Tastendruck erkannt hast.
Wenn zwischen dem Letzten und diesem Tastendruck eine vorgegebene Zeit nicht überschritten wurde, ist Das Dein Doppel-Klick.
Was Du dann machst, unterliegt einzig Deiner Phantasie.
Klar: Wenn Doppelklick, dann keine Einzel-Klick-Events auslösen.

Das gibt's aber bereits fertig, such Mal nach "Button" in den Libs in der IDE - dort sollte sich was finden lassen.

MfG
Title: Re: Increment und Decrement Variable!
Post by: agmue on May 21, 2019, 09:40 pm
Du könntest Dir die Bibliothek OneButton ansehen.
Title: Re: Increment und Decrement Variable!
Post by: michael_x on May 21, 2019, 11:23 pm
Das eigentliche Problem ist, einen Einfachklick zu erkennen, falls dessen Funktion beim Doppelklick nicht vorher ausgeführt werden soll. Das kann nur zu einem Zeitpunkt erkannt werden, wenn eigentlich gar nichts passiert.
Aber, wie schon gesagt, schau dir die erwähnten Bibliotheken an.

Oder hier: forum.arduino.cc/index.php?topic=14479.0 (https://forum.arduino.cc/index.php?topic=14479.0) : Vier Arten einen Taster zu drücken:  kurz / doppelt / lang / dauernd
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 22, 2019, 03:02 pm
So sieht bis nun der Code aus. Doch ich weiß nicht wie ich diesen jetzt umschreiben sollte das ich die "OneButton" Bibliothek verwenden kann??

Code: [Select]
#define Button1 4
#define Button2 5
unsigned long Gewicht = 20;
unsigned long elapsedtime;
unsigned long starttime;
const double Milli = 1000.0;
const double Micro = 1000000.0;
const double Faktor1 = 100000.0;
const double Faktor2 = 100.0;
const double Multiplikator = 0.5;
const double Abstand = 50.0;
const double fps = 3.2808399;
double Time;
double Speed;
double Energie;
double FPS;
double Weight1;
double Weight2;
boolean rightweight = false;

struct Taster
{
  byte pin;
  bool read = true;
  bool oldRead = true;
  bool state = false;
};

Taster taster2;
Taster taster3;

void setup() {

  taster2.pin = 2;
  taster3.pin = 3;

  pinMode(taster2.pin, INPUT_PULLUP);
  pinMode(taster3.pin, INPUT_PULLUP);
  pinMode(Button1, INPUT);
  pinMode(Button2, INPUT);
  Serial.begin(115200);
}


void loop() {

  update_Taster();

  if (taster2.state) {
    Gewicht++;
  }

  if (taster3.state) {
    Gewicht--;
    if (Gewicht < 20) {
      Gewicht = 20;
    }
  }
  Weight1 = Gewicht / Faktor1;
  Weight2 = Gewicht / Faktor2;
  anzeige(Gewicht);
  zeit();
}


void update_Taster ()
{
  static unsigned long last_ms = 0;
  unsigned long ms = millis();

  taster2.state = false;
  taster3.state = false;

  if (ms - last_ms >= 40) {
    last_ms = ms;

    taster2.read = digitalRead(taster2.pin);
    taster3.read = digitalRead(taster3.pin);

    if (!taster2.read && (taster2.oldRead) ) {
      taster2.state = true;
    }
   
    if (!taster3.read && (taster3.oldRead) ) {
      taster3.state = true;
    }

    taster2.oldRead = taster2.read;
    taster3.oldRead = taster3.read;
  }
}


void anzeige (unsigned long gewicht)
{
  static unsigned long altesGewicht = 0;

  if (gewicht != altesGewicht)
  {
    Serial.println("");
    Serial.print(F("Gewicht: "));
    Serial.print(Weight2);
    Serial.print("g");
    Serial.println("");
    altesGewicht = gewicht;
  }
}

void zeit ()
{
  if(rightweight == true)
  {
    while (rightweight == false)
    {
      while (digitalRead(Button1) == false){
      }
 
      starttime = micros();

      while (digitalRead(Button2) == false){
      }

      elapsedtime = (micros() - starttime);
      Time = elapsedtime / Micro;
      Speed = Abstand / Time;
      FPS = Speed * fps;
      Energie = Multiplikator * Weight1 * (Speed * Speed);

      Serial.println("");
      Serial.println(String("Gewicht: ")+Gewicht/Faktor2+String("g"));
      Serial.println("");
      Serial.println(String("Geschwindigkeit: ")+Speed+String("m/s"));
      Serial.println("");
      Serial.println(String("Geschwindigkeit: ")+FPS+String("fps"));
      Serial.println("");
      Serial.println(String("Energie: ")+Energie+String("j"));
      Serial.println("");
    }
  }
}
Title: Re: Increment und Decrement Variable!
Post by: Tommy56 on May 22, 2019, 04:26 pm
Dazu solltest Du Dir die OneButton-Lib und vor allem deren Beispiele anschauen, ausprobieren und somit ein Gefühl für die Lib bekommen.

Gruß Tommy
Title: Re: Increment und Decrement Variable!
Post by: Doc_Arduino on May 22, 2019, 04:32 pm
Hallo,

sorry, aber wenn ich das mit ansehen muss bin ich beleidigt.
Den alten Mist um den modernisierten Code drumherum gebaut.
Es werden wieder neue Taster wild in die Gegend gewurfen.
Die OneButton Lib kann man sich anschauen, Bsp. testen usw., wurde erst gar nicht versucht nehme ich an.
Es werden wieder Floatvariablen eingeführt, obwohl alle am Threadanfang erklärt haben warum man das nicht machen soll. Es wurde nicht einmal Ansatzweise versucht es zuverstehen. Klar ist das Neuland keine Frage, aber wenn es wieder nur blind vermischt wird, dann habe ich darauf keine Lust mehr. Gegen die Wand renne ich nicht. Schade um die Mühe gestern.
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 22, 2019, 04:45 pm
Hallo,

sorry, aber wenn ich das mit ansehen muss bin ich beleidigt.
Den alten Mist um den modernisierten Code drumherum gebaut.
Es werden wieder neue Taster wild in die Gegend gewurfen.
Die OneButton Lib kann man sich anschauen, Bsp. testen usw., wurde erst gar nicht versucht nehme ich an.
Es werden wieder Floatvariablen eingeführt, obwohl alle am Threadanfang erklärt haben warum man das nicht machen soll. Es wurde nicht einmal Ansatzweise versucht es zuverstehen. Klar ist das Neuland keine Frage, aber wenn es wieder nur blind vermischt wird, dann habe ich darauf keine Lust mehr. Gegen die Wand renne ich nicht. Schade um die Mühe gestern.
Das Problem ich brauche die "Float" Variablen um Kommas darstellen und um damit Rechnen zu können und so gut bin ich auch wieder nicht. Die neuen Taster sind eigentlich Infrarotlichtschranken die ich anders nicht verwenden kann.
Title: Re: Increment und Decrement Variable!
Post by: Serenifly on May 22, 2019, 04:50 pm
Du kannst statt kg in Gramm rechnen. So wird 0.2kg zu 200g und man kann Integer verwenden. Die Darstellung mit Komma braucht man nur am Ende für die Anzeige. Da kann man das einmal umrechnen
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 22, 2019, 04:54 pm
Du kannst statt kg in Gramm rechnen. So wird 0.2kg zu 200g und man kann Integer verwenden. Die Darstellung mit Komma braucht man nur am Ende für die Anzeige. Da kann man das einmal umrechnen
Ist zwar eine gute Idee müsste es aber trotzdem in Float umwandeln da ich im Milligramm bereich es bräuchte also ich müsste bei der Formel mit Gramm rechnen also mit 0.2g.
Title: Re: Increment und Decrement Variable!
Post by: Serenifly on May 22, 2019, 05:03 pm
Dann passe das entsprechend an. Man kann auch sagen dass 1 = 100 mg und 10 = 1g. Da gibt es viele Optionen, je nach Bedarf
Title: Re: Increment und Decrement Variable!
Post by: Doc_Arduino on May 22, 2019, 05:08 pm
Hallo,

das kann man von [g] zu [kg] auf [mg] zu [g] abändern und intern statt mit [g] alles in [mg] Ganzzahl rechnen.
Wo klemmt es? Ob du nun mit 1000g oder 1000'000mg rechnest ist doch nun egal. Erst für die Anzeige wird es schick gemacht.

Code: [Select]

void anzeige (unsigned long gewicht)
{
  static unsigned long altesGewicht = 0;

  if (gewicht != altesGewicht)
  {
    Serial.print(F("Gewicht: "));
    Serial.print(gewicht);
    Serial.print("g");
    Serial.print("\t\t");
    Serial.print((gewicht/1000.0), 3);
    Serial.println("kg");
    altesGewicht = gewicht;
  }
}
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 22, 2019, 05:29 pm
Hallo,

das kann man von [g] zu [kg] auf [mg] zu [g] abändern und intern statt mit [g] alles in [mg] Ganzzahl rechnen.
Wo klemmt es? Ob du nun mit 1000g oder 1000'000mg rechnest ist doch nun egal. Erst für die Anzeige wird es schick gemacht.

Code: [Select]

void anzeige (unsigned long gewicht)
{
  static unsigned long altesGewicht = 0;

  if (gewicht != altesGewicht)
  {
    Serial.print(F("Gewicht: "));
    Serial.print(gewicht);
    Serial.print("g");
    Serial.print("\t\t");
    Serial.print((gewicht/1000.0), 3);
    Serial.println("kg");
    altesGewicht = gewicht;
  }
}


Das Problem ist hier bei der Rechnung es sollte halt so genau wie möglich sein daher habe ich Float genommen aber ich Blick es gerade überhaupt nicht mehr durch wie ich das ganze jetzt mit Ganzzahlen machen könnte das ich trotzdem auf die gleichen Werte komme :smiley-confuse:
Dieses Programm funktioniert geanu so wie ich es haben möchte aber halt nur ohne das ich das Gewicht verstellen kann.
 
Edit: Habe diesen Code in einem Extra Sketch probiert auf Ganzzahlen um zu schreiben doch die Ausgabe (Berechnungen) stimmen nicht :(

Code: [Select]
#define Button1  4
#define Button2  5
long int elapsedtime, starttime;
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 Abstand = 50.0;              // Abstand in Meter
const double fps = 3.2808399;
double Time;
double Speed;
double Energie;
double FPS;
 
void setup() {
 pinMode(Button1, INPUT);
 pinMode(Button2, INPUT);
 Serial.begin(115200);
}
 
void loop() {
  while (digitalRead(Button1) == false){
  }

    starttime = micros();

  while (digitalRead(Button2) == false){ 
  }

    elapsedtime = (micros() - starttime);
    Time = elapsedtime / Micro;
    Speed = Abstand / Time;
    FPS = Speed * fps;
    Energie = Multiplikator * Gewicht * (Speed * Speed);

  Serial.println("");
  Serial.println(String("Gewicht: ")+Gewicht*Milli+String("g"));
  Serial.println("");
  Serial.println(String("Geschwindigkeit: ")+Speed+String("m/s"));
  Serial.println("");
  Serial.println(String("Geschwindigkeit: ")+FPS+String("fps"));
  Serial.println("");
  Serial.println(String("Energie: ")+Energie+String("J"));
  Serial.println("");
}
Title: Re: Increment und Decrement Variable!
Post by: Tommy56 on May 22, 2019, 05:37 pm
Das Problem ist hier bei der Rechnung es sollte halt so genau wie möglich sein daher habe ich Float genommen
Dann hast Du es nicht verstanden.

Float kann maximal 6 signifikante Stellen darstellen.
Das Maximum von unsigned long ist 4.294.967.295, also bis zu 10 signifikanten Stellen. Damit ist die Ganzzahldarstellung wesentlich genauer.

Gruß Tommy
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 22, 2019, 05:50 pm
Dann hast Du es nicht verstanden.

Float kann maximal 6 signifikante Stellen darstellen.
Das Maximum von unsigned long ist 4.294.967.295, also bis zu 10 signifikanten Stellen. Damit ist die Ganzzahldarstellung wesentlich genauer.

Gruß Tommy

Das Problem ist ich kann zwar mit Ganzzahlen berechnen aber im Schluss sind die meisten Ergebnisse dann keine Ganzzahlen mehr und die 10 Signifikanten Stellen sind bei der Berechnung bei mir sehr schnell voll da ich die Nachkommastellen ja auch in Ganzzahlen umwandle.
Title: Re: Increment und Decrement Variable!
Post by: Doc_Arduino on May 22, 2019, 06:28 pm
Hallo,

ich würde mich wirklich gern nochmal aufrappeln, aber ich verstehe dein Gedankenproblem wirklich nicht um es zu korrigieren. Zudem du jetzt zusätzlich die Nachkommastellen wieder in Ganzzahlen umwandeln möchtest. Da bietet es sich doch regelrecht an alles in Ganzzahlen zu rechnen und dann entsprechend zu splitten. Alles ganz ohne Fließkommarechnung.
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 22, 2019, 06:31 pm
Hallo,

ich würde mich wirklich gern nochmal aufrappeln, aber ich verstehe dein Gedankenproblem wirklich nicht um es zu korrigieren. Zudem du jetzt zusätzlich die Nachkommastellen wieder in Ganzzahlen umwandeln möchtest. Da bietet es sich doch regelrecht an alles in Ganzzahlen zu rechnen und dann entsprechend zu splitten. Alles ganz ohne Fließkommarechnung.
Wie kann ich zum Beispiel das mit Ganzzahlen Berechnen wenn ich 50Meter durch 200 000 Mikrosekunden dividiere bekomm ich ja wieder eine Kommazahl raus die erst wenn ich es Multipliziere mit 1 000 000 stimmen würde aber so weit komme ich gar nicht da er es gar nicht rechnet??

Zu Mikrosekunden würde ich es ja gleich so weiter rechnen das kein Komma entsteht aber das Ergebnis wäre bevor ich es Multipliziere eine Kommazahl.
Title: Re: Increment und Decrement Variable!
Post by: Doc_Arduino on May 22, 2019, 06:59 pm
Hallo,

multipliziere erst 50m * 1000.000 und teile dann durch 200.000µs.
Der µC rechnet alles der Reihenfolge nach wenn keine Klammern angegeben sind.
Vielleicht war das der Knackpunkt.
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 22, 2019, 07:08 pm
Hallo,

multipliziere erst 50m * 1000.000 und teile dann durch 200.000µs.
Der µC rechnet alles der Reihenfolge nach wenn keine Klammern angegeben sind.
Vielleicht war das der Knackpunkt.
Das passt zwar aber wie kann ich da dann das Ergebnis splitten das ich dann auch Kommastellen anzeigen kann??
Title: Re: Increment und Decrement Variable!
Post by: agmue on May 22, 2019, 07:10 pm
Das passt zwar aber wie kann ich da dann das Ergebnis splitten das ich dann auch Kommastellen anzeigen kann??
Code: [Select]
void setup() {
  Serial.begin (9600);
  float fWert = 1234.56;
  float fErgebnis = fWert / 2;
  Serial.print("fErgebnis: ");
  Serial.print(fErgebnis);
  unsigned long iWert = 123456; // 1234.56*100
  unsigned long iErgebnis = iWert / 2;
  Serial.print("\tiErgebnis: ");
  Serial.print(iErgebnis / 100.0);
  Serial.println();
}

void loop() {}

"100.0" wandelt das Ergebnis in Fließkomma.
Title: Re: Increment und Decrement Variable!
Post by: Doc_Arduino on May 22, 2019, 07:10 pm
Hallo,

wie hättest du denn das Ergebnis 250 dargestellt?
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 22, 2019, 07:15 pm
Hallo,

wie hättest du denn das Ergebnis 250 dargestellt?

Also so so das halt zwei Nachkommastellen dargestellt werden also zum Besipiel "250","00" m/s
Also so das ich halt dann auf zwei Nachkommastellen genau das Ergebnis Ausgeben kann aber dazu fehlt mir das Know-How da ich nicht so viel mit Arduino oder besser geasgt generell mit Programmieren am Hut habe.

Edit: Und wenn ich mit der Zahl ja dann weiter Rechne habe ich ja dann auch wieder einen Verlust der Genauigkeit oder nicht??
Wie schaffe ich es dann mit zwei Nachkommastellen weiter zu rechnen??
Ich habe es gerade probiert die zahl 50 statt mit 1 000 000 zu Multiplizieren mit 100 000 000 zu Multiplizieren und diese Zahl dann am Schluss per Serial Monitor mit 100.0 zu Dividieren doch er dividiert durch 10 statt durch 100.
Title: Re: Increment und Decrement Variable!
Post by: agmue on May 22, 2019, 07:29 pm
... aber dazu fehlt mir das Know-How ...
Dann kaufe Dir einen Teensy 3.5 (https://www.exp-tech.de/plattformen/teensy/7786/teensy-3.5) mit Gleitkommaprozessor, der rechnet dann wie ein Taschenrechner.
Title: Re: Increment und Decrement Variable!
Post by: Doc_Arduino on May 22, 2019, 07:31 pm
Hallo,

wenn man rein mit Ganzzahl rechnet würde ich das so machen, man nutzt das was der µC mit abschneiden macht zu seinem Vorteil.
Code: [Select]

void setup(void) {
  Serial.begin(9600);

  dreiStellen(123456789);
  dreiStellen(4123456789);
  dreiStellen(1234);

  zweiStellen(123456789);
  zweiStellen(4123456789);
  zweiStellen(1234);
}

void loop(void) {
  
}

// ****** Funktionen ******
void dreiStellen (unsigned long var)
{
  unsigned long zahl = var/1000;          
  unsigned long komma = var-(zahl*1000);
  Serial.print(zahl);
  Serial.print('.');
  Serial.println(komma);
}

void zweiStellen (unsigned long var)
{
  unsigned long zahl = var/1000;        
  //unsigned long komma = (var-(zahl*1000))/10;         // ohne runden
  unsigned long komma = (var-(zahl*1000))*1.0/10+0.5; // mit runden
  Serial.print(zahl);
  Serial.print('.');
  Serial.println(komma);
}
Title: Re: Increment und Decrement Variable!
Post by: Serenifly on May 22, 2019, 07:34 pm
32-Bit Prozessoren generell haben schon mal eine höhere Genauigkeit da die mit 64-Bit Gleitkommazahlen arbeiten. Eine extra Gleitkomma-Einheit dient eher der Geschwindigkeit
Title: Re: Increment und Decrement Variable!
Post by: agmue on May 22, 2019, 07:37 pm
@Serenifly: Danke für den Hinweis, werde ich mit meinem Teensy 3.2 mal testen.
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 22, 2019, 07:41 pm
Dann kaufe Dir einen Teensy 3.5 (https://www.exp-tech.de/plattformen/teensy/7786/teensy-3.5) mit Gleitkommaprozessor, der rechnet dann wie ein Taschenrechner.

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

Link: https://www.reichelt.at/teensy-3-5-usb-teensy-3-5-p191452.html
Title: Re: Increment und Decrement Variable!
Post by: Doc_Arduino on May 22, 2019, 07:50 pm
Bedenke, Programmierdefizite kann man nicht durch Hardware ersetzen.
Die Ablenkung in diese Richtung halte ich für komplett falsch und führt zu nichts.
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 22, 2019, 07:55 pm
Bedenke, Programmierdefizite kann man nicht durch Hardware ersetzen.
Die Ablenkung in diese Richtung halte ich für komplett falsch und führt zu nichts.
Das Stimmt aber da ich so genau sein möchte wie möglich glaube ich wäre dieser Mikrocontroller sicher eine Idee für später wenn das hier auf dem Arduino mal läuft
Title: Re: Increment und Decrement Variable!
Post by: Doc_Arduino on May 22, 2019, 08:05 pm
Hallo,

präziser wie Ganzzahl geht nicht. Der Teensy macht auch Rundungsfehler mit float. Nur etwas später in der Kommastelle. Ein Taschenrechner rechnet intern hundert pro auch mit Ganzzahlen und mehreren Zwischenspeichern dafür, ähnlich wie in meinem Bsp. Sonst käme man rückwärts nie wieder auf das gleiche Ergebnis.
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 22, 2019, 08:16 pm
Okay, aber irgendwie schafft mein Arduino nicht das er 50Meter * 1000000 / 161000Mikrosekunden
zu rechnen wenn ich dann deinen Code etwas über nehme dann schreibt er zum Beispiel 0.31 raus obwohl das ja 310.55 oder so heißen sollte ?? Habe ich da deinen Code Falsch verstanden das var die Auszugebende variable ist?? und zahl die Zahl vorm Komma und komma dann nach dem Komma??
Title: Re: Increment und Decrement Variable!
Post by: postmaster-ino on May 22, 2019, 08:47 pm
Hi

float hat NICHTS mit Genauigkeit zu tun - eher mit Ungenauigkeit - beim Arduino sind's 6 signifikante Stellen - mehr nicht.
1002,04 geht
1,00204 geht auch
100204,1 geht NICHT - zumindest nicht, wenn Du damit rechnen willst.

Was aber geht, nennt sich Festkommaarithmetik (https://www.mikrocontroller.net/articles/Festkommaarithmetik)
Dabei benutzt man so viele Stellen, wie man braucht und rechnet damit.
Man könnte damit sogar 'von Hand' mit beliebig vielen Stellen rechnen (man braucht für jede Stelle mindestens ein halbes Byte RAM).
ERST für die Anzeige wird da irgendwo ein Komma zwischen angezeigt.
Aus 102936223454237687243658362934 wird plötzlich
1029362234542376872436.58362934 - wow, Zauberei ... verbrennt Ihn ...
Wenn Du hier 100000000 hinzu addierst, wird intern daraus
102936223454237687243758362934
Und dann zur Ausgabe, hex hex:
1029362234542376872437.58362934

Und Das ist um Welten genauer, als Deine float - auch bei 64Bit.

Wenn Du in humaneren Zahlenbereichen bleibst, reicht Dir vll. uint32_t - da braucht der Arduino 4 Byte für Zahlen bis zu 4'294'967'295 (DAS plus 1 ergibt aber dann Null).
Wenn's MEHR werden müssen, wären 64 Bit noch möglich 18'446'744'073'709'551'615
20 Stellen - also 19 'frei nutzbare Stellen'.
Sofern Du nicht wie ein Weltmeister mit gerade sinnfrei ausgedachte Zahlen multiplizieren willst, sollte Das schon eine Weile reichen.

Das Arduino-Terminal kann 'von Haus aus' nur bis 32 Bit als Dezimal ausgeben - combie hatte hier in den Tiefen des Forum Mal ein template (?) ausgearbeitet, wo man beliebige bis 64 Bit breite Zahlen in ein beliebiges Zahlenformat ausgeben konnte.

MfG
Title: Re: Increment und Decrement Variable!
Post by: Doc_Arduino on May 22, 2019, 08:48 pm
Hallo,

das kommt davon weil du wahllos mit Einheiten und Potenzen um dich wirfst.
Du musst nur die Ganzzahlrechnung anpassen. In deine gewünschte "Einheiten".

Code: [Select]
// 64Bit Ganzzahl
zweiStellen(50ULL * 1000000000 / 161000); 
zweiStellen(50ULL * 1000000 / 161);
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 22, 2019, 09:20 pm
Hallo,

das kommt davon weil du wahllos mit Einheiten und Potenzen um dich wirfst.
Du musst nur die Ganzzahlrechnung anpassen. In deine gewünschte "Einheiten".

Code: [Select]
// 64Bit Ganzzahl
zweiStellen(50ULL * 1000000000 / 161000); 
zweiStellen(50ULL * 1000000 / 161);


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.
Title: Re: Increment und Decrement Variable!
Post by: postmaster-ino on May 22, 2019, 09:48 pm
Hi

Langsam wird ein Schuh daraus ...
Und warum kann man ein Geschoss nicht als Festkommawert rechnen?

MfG
Title: Re: Increment und Decrement Variable!
Post by: Doc_Arduino on May 22, 2019, 11:25 pm
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.
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 23, 2019, 01:16 am
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
Title: Re: Increment und Decrement Variable!
Post by: agmue on May 23, 2019, 12:13 pm
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.

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.

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:

(https://forum.arduino.cc/index.php?action=dlattach;topic=617098.0;attach=309504)

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

Code: [Select]
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 :smiley-confuse:
Title: Re: Increment und Decrement Variable!
Post by: Doc_Arduino on May 23, 2019, 12:34 pm
Quote
Quote from: Doc_Arduino on 22-05-2019, 19:50:34 (http://"http://\"https://forum.arduino.cc/index.php?msg=4183351"")
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. ;)
Title: Re: Increment und Decrement Variable!
Post by: agmue on May 23, 2019, 12:58 pm
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?
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 23, 2019, 04:11 pm
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.
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 23, 2019, 07:05 pm
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??

Title: Re: Increment und Decrement Variable!
Post by: Tommy56 on May 23, 2019, 07:14 pm
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
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 23, 2019, 07:18 pm
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
Title: Re: Increment und Decrement Variable!
Post by: Tommy56 on May 23, 2019, 07:21 pm
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
Title: Re: Increment und Decrement Variable!
Post by: agmue on May 23, 2019, 07:41 pm
Meinst Du sowas?

Code: [Select]
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);
}
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 23, 2019, 07:46 pm
Meinst Du sowas?

Code: [Select]
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
Title: Re: Increment und Decrement Variable!
Post by: Tommy56 on May 23, 2019, 07:48 pm
Ich gebs auf.

Gruß Tommy
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 23, 2019, 07:51 pm
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??
Title: Re: Increment und Decrement Variable!
Post by: agmue on May 23, 2019, 09:25 pm
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
=====

Title: Re: Increment und Decrement Variable!
Post by: Serenifly on May 23, 2019, 09:44 pm
dtostrf() ist auch eine Option um Floats zu formatieren:

https://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga060c998e77fb5fc0d3168b3ce8771d42 (https://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga060c998e77fb5fc0d3168b3ce8771d42)
Title: Re: Increment und Decrement Variable!
Post by: Doc_Arduino on May 23, 2019, 11:17 pm
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...
Title: Re: Increment und Decrement Variable!
Post by: 7ower3efender on May 24, 2019, 10:16 am
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.
Title: Re: Increment und Decrement Variable!
Post by: agmue on May 24, 2019, 10:20 am
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?

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?
Title: Re: Increment und Decrement Variable!
Post by: Doc_Arduino on May 24, 2019, 11:39 am
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 höchstmögliche 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.
Code: [Select]
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)
{ }
Title: Re: Increment und Decrement Variable!
Post by: agmue on May 24, 2019, 04:31 pm
Ergebnis UNO:
2.9999995231

Ergebnis Teensy mit double:
3.0000000000