Increment und Decrement Variable!

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 : Vier Arten einen Taster zu drücken: kurz / doppelt / lang / dauernd

So sieht bis nun der Code aus. Doch ich weiß nicht wie ich diesen jetzt umschreiben sollte das ich die “OneButton” Bibliothek verwenden kann??

#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("");
    }
  }
}

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

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.

Doc_Arduino: 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.

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

Serenifly: 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.

Dann passe das entsprechend an. Man kann auch sagen dass 1 = 100 mg und 10 = 1g. Da gibt es viele Optionen, je nach Bedarf

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.

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

Doc_Arduino: 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.

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 :confused: 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 :(

#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("");
}

7ower3efender: 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

Tommy56:
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.

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.

Doc_Arduino:
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.

Hallo,

multipliziere [u]erst[/u] 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.

Doc_Arduino: Hallo,

multipliziere [u]erst[/u] 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??

7ower3efender:
Das passt zwar aber wie kann ich da dann das Ergebnis splitten das ich dann auch Kommastellen anzeigen kann??

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.

Hallo,

wie hättest du denn das Ergebnis 250 dargestellt?

Doc_Arduino: 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.

7ower3efender: ... aber dazu fehlt mir das Know-How ...

Dann kaufe Dir einen Teensy 3.5 mit Gleitkommaprozessor, der rechnet dann wie ein Taschenrechner.