Fensterwinkel mit 9DoF

Hallo!
Ich habe ein Projekt mit einem ESP32 und dem 9Dof-LSM303, und will den Öffnungswinkel herausfinden. Das habe ich mithilfe des Magnetometers gemacht, indem ich den geschlossenen Wert einlese und von dem die Referenz nachher nimm. Jetzt ist das Problem aber so das bei jedem Fenster ein anderer winkel angezeigt wird. Teilweise wird 90 ° angezeigt wo 90° sein sollte, aber manchmal zeigt er nicht 90° an sondern so 50...
Ich hoffe mir kann jemand weiterhelfen
Grüsse leon

// Berechnung des offenen Zustands mit X- und Z-Werten des Magnetometers
String getWindowOpenState(sensors_event_t magEvent, float openAngle, bool isTilted) {
    // Berechne den Rohwinkel aus den Magnetometerdaten
    float rawAngle = atan2(magEvent.magnetic.z, magEvent.magnetic.x) * (180.0 / M_PI);
    
    // Berechne den relativen Winkel, indem der Startwinkel abgezogen wird
    float relativeAngle = rawAngle - startAngle;
    
    // Stelle sicher, dass der relative Winkel immer im Bereich von -180 bis 180 bleibt
    while (relativeAngle > 180) relativeAngle -= 360;
    while (relativeAngle < -180) relativeAngle += 360;
    
    // Berechne den absoluten Wert des Öffnungswinkels
    openAngle = fabs(relativeAngle) ;

    // Wenn das Fenster geneigt ist, wird der Öffnungswinkel angepasst
    if (isTilted) {
        if (lastOpenAngle < minOpenAngleThreshold) {
            lastOpenAngle = 0.0;
        }
        openAngle = lastOpenAngle;
    } else {
        lastOpenAngle = openAngle;
    }
    
    // Wenn der Öffnungswinkel den Schwellenwert überschreitet, wird der Zustand als "Offen" betrachtet
    return (openAngle > magOpenThreshold) ? "Offen" : "Geschlossen";
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Hallo leon12098

Willkommen im besten Arduino Forum der Welt :slight_smile:

Löte in den Sketch ein paar Serial.println(Variable von Interesse) zur Überwachung ein. So kannst du die Berechnungen verfolgen.

Was soll mit diesen Codezeilen erreicht werden?

    while (relativeAngle > 180) relativeAngle -= 360;
    while (relativeAngle < -180) relativeAngle += 360;

Werde ich einmal machen. Dieser Code sorgt däfür, dass der relative Winkel immer im Bereich -180° und 180° ist, da ein Fenster ja in beide Richtungen aufgeht. Das ist einfach nur das wenn er großer als 180° oder -180° ist, das er das richtig interpretiert.

Ein Kompaß wird durch Magnete, aber auch durch ferromagnetische Teile des Fenster beeinflußt. Darum kann er falsch messen.

Grüße Uwe

Ich hätte auch gedacht, dass ein Beschleunigungssensor (Richtung der Schwerkraft + eventuell Erschütterungen) besser geeignet wäre.

1 Like

Ich würde den Winkel messen entweder mit einem Potentiometer oder einem Endcoder / Magnetencoder, weiß aber nicht wie man das einfach und sinnvoll ans Fenster montieren kann.
Darum hab ich den Vorschlag nicht gemacht.
Grüße Uwe

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.