Maximalwert einer Potentiometer Funktion - Dollenwinkel im Ruderboot

Hallo,

ich bin zur Zeit dabei den Winkel eines Potentiometers zu bestimmt. Dieses soll sich immer hin und zurück drehen und ich brauche den maximalen und den minimalen Winkel. Bisher schaffe ich es, dass solange die Funktion zunimmt der Winkel für den Maximalwert ebenfalls zunimmt. Sobald ich dann in die andere Richtung drehe und der Winkel somit wieder abnimmt bleibt der Maximalwert stehen und nun überschreibt sich der alte Minimalwert. Im Wendepunkt bleibt dann hier wiederrum der Minimalwert stehen und sobald die Steigung der Funktion wieder positiv ist überschreibt sich der Maximalwert.
Ich hoffe diese Erklärung war einigermaßen verständlich…

Für den Winkel selber reicht das im Prinzip, mein Problem ist jedoch, dass ich mit den Extrempunkten noch weiter rechnen möchte. Das heist ich brauche eine Variable, die wirklich nur den Extrempunkt angibt und nicht den Winkel unter der Bedingung dass dieser zunimmt bzw. abnimmt.

Um dies zu lösen habe ich versucht eine weitere Variable einzubauen und die Bedingung zu schaffen, dass der Winkel größer ist als der vorherige, aber auch größer als der nachfolgende. Sobald ich die Bedingung jedoch hinzugefügt hatte, bekam ich keine vernünftigen Werte mehr. Kann mir vielleicht jemand sagen was mit meinem code nicht stimmt?

int pot1Pin = 2;
int pot2Pin = 1;
int val1 = 0;
int val2 = 0;
int Winkel1 = 0;
int Winkel2 = 0;

int prev1;
int prev2;
int pre1;
int pre2;
int Vorlage1;
int Vorlage2;
int Rucklage1;
int Rucklage2;



#include <SoftwareSerial.h>
SoftwareSerial BTserial(10, 11);

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

  int prev1 = 0;
  int prev2 = 0;


}

void loop() {
  val1 = analogRead(pot1Pin);
  val2 = analogRead(pot2Pin);
  pre1 = (val1 - 512) * 0.2571428571;
  pre2 = (val2 - 512) * 0.2571428571;

  if ((Winkel1 > prev1) && (Winkel1 > pre1)){
    Vorlage1 = Winkel1;
  }
  else if ((Winkel1 < prev1) && (Winkel1 < pre1)){
    Rucklage1 = Winkel1;
  }

  prev1 = Winkel1;
  delay(1);
  Winkel1 = pre1;

    if ((Winkel2 > prev2) && (Winkel2 > pre2)){
    Vorlage2 = Winkel2;
  }
  else if ((Winkel2 < prev2) && (Winkel2 < pre2)){
    Rucklage2 = Winkel2;
  }

  prev2 = Winkel2;
  delay(1);
  Winkel2 = pre2;

  BTserial.print(Vorlage1);
  BTserial.print(",");
  BTserial.print(Rucklage1);
  BTserial.print(",");
  BTserial.print(Vorlage2);
  BTserial.print(",");
  BTserial.print(Rucklage2);
  BTserial.print(";");
  delay(20);
  

}

Ich würde mich sehr über Ratschläge freuen

MfG

Wozu ein zweiter Thread zum gleichen Thema?

Weil es sich um eine ander Frage handelt.

Hallo,

hast Du dir schon mal die funktionen max() und min() angesehen, die machen genau das.

link

Heinz

Danke für deine Antwort. Ich habe mir diese Funktionen schon angesehen. Habe alledings nicht ganz verstanden, wie ich damit den Wert immmer wieder überschreiben kann, wenn der Winkel ja nicht jedes mal größer wird.

Hallo,

du könntest den wert für max rücksetzten wenn Du wieder in der Mitte angekommen bist, gleiches für min.

Ich hab da jetzt auch keine fertige Lösung parat, müsste man sich halt mal mit beschäftigen.

Heinz

Sobald der neue min-Wert kleiner als der Alte Min-Wert ist dann speichere den neuen Min-Wert im alten Min-Wert.
Grüße Uwe

Hi

Ich habe nun die Nachfrage nicht verstanden. Was, wenn nicht den MAX/MIN-Wert erwarte ich von diesen Funktionen? x=min(x,aktwert); Achtung: Das ergibt das MINIMUM des Wertes. Solange x nicht auf irgend was Größeres gesetzt wird, KANN x hier nur kleiner werden oder gleich bleiben.

Also: Was Du wolle? Was Du wirklich wolle?

MfG

(und Ja, ich sehe hier keinen großen Unterschied zum anderen Thread - wahrscheinlich gibt's dann noch Einen mit constrain ;) )

Danke für die Antworten. Mithilfe von min und Max Funktionen läuft es jetzt :)

Hallo,

danke für die Rückmeldung Heinz