If Abfrage

Hallo Zusammen,

ich habe wieder einmal eine Frage und ich hoffe ihr könnt mir bei meinem “Problemchen” weiterhelfen.
Es geht um die Funktion int geschwindigkeit();
Die Berechnung von V soll nur stattfinden sobald die Dauer sich ändert.
So wie der Code momentan aufgebaut ist, wird V allerdings in jedem durchgang der If-Abfrage berechnet und ausgegeben. (Siehe Serielle Ausgabe unten).

Könnt ihr mir hierbei behilflich sein und einen Tipp geben?

Viele Dank vorab!!

#include <Wire.h>
#include <wiinunchuck.h>


int dy = 0;
unsigned long timestore;
unsigned int zeitmessung= LOW;
int dauer;
int v=0;
double a=0.000000;




int berechnung(){
  dy = -(123.0 - nunchuk_cjoy_y());
 
}

 int zeitberechnung(){
  if(zeitmessung == LOW){
    if(dy >= 10 && dy <= 110){
      timestore = millis();
      zeitmessung = HIGH;
    }
    if(dy <= -10 && dy >= -110){
      timestore= millis();
      zeitmessung = HIGH;
    }
    }else{
     dauer = millis()-timestore;
     dauer = dauer/1000;
     }
 if(dy < 10 && dy >-10 ){
  zeitmessung = LOW;
  dauer = 0;
 }
  return dauer; 
} 

int geschwindigkeit(){
  //v=a*t
  int vdif=0;
  int v0=v;

    if(zeitmessung==HIGH){
    vdif = a* dauer;
    v = v0+vdif;
    }else{
      v=v0;
    }
    
  return v;
}

double beschleunigung(){

    if(zeitmessung==HIGH){
   //a = 1*dy+3;
  //a = (61/910)*dy-(549/910);
   a = 0.067033*dy-0.603297;
    }else{
      a=0;
    }
  return a;
}
void nunchuck_auslesen(){
  nunchuk_get_data();
 

 char buffer[60];
  

    sprintf(buffer, "Y:%3d    DY:%3d    Dauer:%3d   Status:%3d V:%3d  A:%3d", nunchuk_cjoy_y(), dy, dauer, zeitmessung, v, (int)a);
  Serial.println(buffer);
  
  }

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

  nunchuk_init(); //I²C-Verbindung wird hergestellt
  delay(20);
  nunchuk_calibrate_joy(); //Setzt die Normalstellung auf (0,0)
  delay(20);
}


void loop() {
  
  nunchuck_auslesen();
  berechnung();
  zeitberechnung();
  beschleunigung();
  geschwindigkeit();

 
  delay(1);

}

SERIELLE AUSGABE:

Y:223    DY:100    Dauer:  0   Status:  1 V:  0  A:  6
Y:223    DY:100    Dauer:  0   Status:  1 V:  0  A:  6
Y:223    DY:100    Dauer:  1   Status:  1 V:  6  A:  6
Y:223    DY:100    Dauer:  1   Status:  1 V: 12  A:  6
Y:223    DY:100    Dauer:  1   Status:  1 V: 18  A:  6
Y:223    DY:100    Dauer:  1   Status:  1 V: 24  A:  6
Y:223    DY:100    Dauer:  1   Status:  1 V: 30  A:  6
Y:223    DY:100    Dauer:  1   Status:  1 V: 36  A:  6
Y:223    DY:100    Dauer:  1   Status:  1 V: 42  A:  6
Y:223    DY:100    Dauer:  1   Status:  1 V: 48  A:  6
Y:223    DY:100    Dauer:  1   Status:  1 V: 54  A:  6
Y:223    DY:100    Dauer:  1   Status:  1 V: 60  A:  6

Hallo,

dann musst du dir den "alten" Wert von Dauer merken, zum Bsp. in "alt_Dauer" und vergleichen, bei Ungleichheit Funktion etc. ausführen, alt_Dauer aktualisieren usw. ...

Hallo,

zum Bsp. so:

dauer bleibt global, alt_dauer ist lokal. Für solche Statusflags wie zeitmessung nimmste lieber den Datentyp bool.

int geschwindigkeit() {
  //v=a*t
  int vdif = 0;
  int v0 = v;
  static int alt_dauer = 0;

  if (alt_dauer != dauer) {
    alt_dauer = dauer;
    if (zeitmessung == HIGH) {
      vdif = a * dauer;
      v = v0 + vdif;
    }
    else {
      v = v0;
    }
  }
  return v;
}

Wobei du v nicht zurückgeben musst, weil du das eh global zur Verfügung hast.

Astrein!
Wusste bis vorhin nicht wozu statische Varbiablen gut sind. Jetzt bin ich schlauer! :slight_smile:
Danke!!!