Maximalen Differenzwert zeitabhängig ausgeben

Hallo User,

mit meinem Datalogger bin ich dank Hilfe dieses Forums schon weitergekommen. Meine Werte sind auch recht vernünftig und das Speichern auf MicroSD-Karte funktioniert (zumindest phasenweise :wink: wo da das Problem hängt, versuche ich jedoch noch eigenständig zulösen).

Wo ich leider als Laie nicht weiterkomme ist, wie ich meinen maximalen Differenzwert zeitabhängig ausgebe.
Ich habe einen Beschleunigungssensor, der sollte in x und y-Richtung 512 und in z-Richtung 615 ausgeben.

Mit meinen laienhaften Programmierkenntnisse habe ich mir folgenden Code überlegt, der mir jedoch nur den Maximalwert ausgibt (dies ist mein Testcode für den Beschleunigungssensor. Tempsensor und schreiben auf MicroSD habe ich rausgelassen):

int pinX = A0;     // X-Achse
int pinY = A1;     // Y-Achse
int pinZ = A2;     // Z-Achse
int altX = 0;
int altY = 0;
int altZ = 0;
int x;

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

void loop()
{
  int altX = 0;
  int altY = 0;
  int altZ = 0;
  
  for(x=0; x<=20; x++)
  {
    delay(200);
    if (analogRead(pinX) > altX, analogRead(pinY) > altY, analogRead(pinZ) > altZ)
    {
      altX = analogRead(pinX);
      altY = analogRead(pinY);
      altZ = analogRead(pinZ);
    }
  }

  Serial.print(altX);
  Serial.print(";");
  Serial.print(altY);
  Serial.print(";");
  Serial.print(altZ);
  Serial.print(";");
  Serial.println();
}
  1. Frage: Wenn ich jetzt nur den Maximalwert betrachten würde, wäre der Code sinnvoll oder ist dies zu umständlich?
  2. Frage: Wie kann ich mir die maximale Differenz ausgeben lassen? Schließlich habe ich ja nicht nur einen Maximal- sondern auch je nach Belastung einen Minimalwert.

Warum ich das so mache?
Ich möchte letztlich über mehrere Stunden bis hin zu 1-2 Tagen loggen und daher möchte ich mein Datenvolumen minimieren indem ich nicht alle 200ms einen Wert auf meine SD-Karte speicher, sondern nur alle 5 Sekunden und dies sollte dann eben der Minimal- bzw. Maximalwert dieser Zeitspanne sein

Meinst du sowas?

void loop()
{
 unsigned int maxX=0;
 unsigned int minX=1023;
 for (int  i = 0; i < 50; i++)
 {
    unsigned int aktX = analogRead(pinX);
    if (aktX > maxX) maxX = aktX;
    if (aktX < minX) minX = aktX;
    delay(200);   // 50 * 200 ms = 10 sec
 }
 Serial.print(minX); Serial.print(" ... "); Serial.print(maxX); Serial.println (" X ");
}

Hier dauert ein loop Durchlauf 10 Sekunden, und ermittelt alle 10 Sekunden das jeweilige Max- und Minimum.
Erweitern für y und z genauso ...

Differenz zwischen Max und Min sollte auch nicht das Problem sein, das hab ich evtl. nicht verstanden.


Geht natürlich auch ohne delay, aber das soll jetzt und hier mal egal sein.

Danke für den Tipp.
Jap so funktionierts. Das er mir Max- und Minwert ausgibt ist für die Nachbetrachtung echt wichtig.
Habe das nun auch auf alle meine Analogeingänge programmiert - läuft.
danke :wink:

dauert ein loop Durchlauf 10 Sekunden

Auf Dauer, wenn da jemals was interaktives dazu soll, blamierst du dich natürlich damit :wink:
Keiner drückt eine Taste 10 Sekunden lang, ohne dass was passiert.