Go Down

Topic: Increment und Decrement Variable! (Read 1 time) previous topic - next topic

7ower3efender

Achso also sind beide Variablen zwei einfache Long Datentypen

postmaster-ino

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
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

7ower3efender

#17
May 21, 2019, 09:20 pm Last Edit: May 21, 2019, 09:24 pm by 7ower3efender
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.

postmaster-ino

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
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

agmue

Du könntest Dir die Bibliothek OneButton ansehen.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

michael_x

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

7ower3efender

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

Tommy56

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
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Doc_Arduino

#23
May 22, 2019, 04:32 pm Last Edit: May 22, 2019, 04:33 pm by 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.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

7ower3efender

#24
May 22, 2019, 04:45 pm Last Edit: May 22, 2019, 04:46 pm by 7ower3efender
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.

Serenifly

#25
May 22, 2019, 04:50 pm Last Edit: May 22, 2019, 04:51 pm by 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

7ower3efender

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.

Serenifly

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

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.

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;
  }
}
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

7ower3efender

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

Go Up