Wii- Nunchuk auslesen + Zeitmessen

Hallo Zusammen,

folgendes habe ich vor:

Mit einem Wii-Nunchuk Joystick lese ich Y-Werte aus und lasse diese im Seriellen Monitor anzeigen.
Sobald der Y-Wert den Wertebereich[11,100] betritt, soll die Dauer mitgezählt werden.
Gleiches gilt für den Wertebereich [-11,-100].
Fällt der Y-Wert in den Bereich [-10,10] soll die Dauer wieder resettet werden.

Das Auslesen der Y-Werte ( bzw. dy) funktioniert soweit.
Schalte ich allerdings die Funktion zeitberechnung() dazu, wird im Seriellen Monitor nichts mehr angezeigt.

Es wäre nett wenn sich jemand den Code angucken könnte und mir sagen könnte was der Fehler ist, und ob ich überhaupt auf dem richtigen Weg bin…

Vielen Dank Vorab!

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


int dy = 0;
float dauer;




void berechnung(){
  dy = -(123 - nunchuk_cjoy_y());
 
}

float zeitberechnung(){
  dauer = 0;
  while (dy > 10 && dy < 100){
    delay(1000);
    dauer = dauer + 0,1;
  }
  while (dy <10 && dy > - 10){
    dauer = 0;
  }

  while (dy < -10 && dy > -100){
    delay(1000);
    dauer = dauer + 0,1;
  }
  return dauer;
}
void nunchuck_auslesen(){
  nunchuk_get_data();

  char buffer[40];
  

    sprintf(buffer, "Y:%3d    DY:%3d    Dauer:%3d", nunchuk_cjoy_y(), dy, dauer);
  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();
  zeitberechnung();
  berechnung();

 
  delay(1);

}

Falscher Ansatz - Du musst Dir einen Zeitstempel setzen wenn der Wert jenseits Deiner Grenze ist und dann die Differenz zur aktuellen Zeit (millis()) ermitteln.

Und mit Deinen delays versaust Du Dir das Ding noch komplett.
Schau Dir die Nachtwächererklärung an, findest Du über die Suchfunktion ganz einfach.

Und willkommen im Forum!

Danke hat geklappt!

Fein, freut mich!

Es gehört aber zur Netiquette, der Nachwelt nicht nur den nicht funktionierenden Sketch zu präsentieren ,sondern auch das funktionierende Ergebnis. Dann lernt der nächste auch wieder was.

Nun weiß ich Bescheid. Für die Nachwelt :slight_smile:

So hats geklappt:

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


int dy = 0;
unsigned long timestore;
unsigned int zeitmessung= LOW;
int dauer;





void berechnung(){
  dy = -(123 - 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; 
} 


}


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

 
  delay(1);

}