Markisensteuerung mit Endschalter (GELÖST)

Begonnen von gregorv, 10 Februar 2022, 18:43:56

Vorheriges Thema - Nächstes Thema

gregorv

Für meine Markise möchte ich eine HM Steuerung bauen. Da der Antrieb Eigenbau ist (Scheibenwischermotor) habe ich zusätzliche Sensoren für die Endpositionen (Näherungsschalter). Die Näherungsschalter liefern über einen NPN Transistor 0V/3,3V (10K Pull-Up). Als Beispiel für die Programmierung des PRO MINI habe ich den Scetch HM-LC-Bl1-FM als Vorlage genommen und noch einen TwoStateChannel mit zwei PINs dazu gebaut. Prinzipiell funktioniert das, wie es soll  - bis auf die Sensor-Eingänge am Arduino. Wenn ein Sensor anspricht, sehe ich in FHEM auch den Status.
Das Problem ist aber, dass ich den PIN Status mit digitalRead() nicht lesen kann:
Die Steuerung muss sofort reagieren, wenn ein Sensor anspricht (HIGH). Wenn ich allerdings in der Loop()-Funktion den PIN-Status abfrage ist der immer LOW. Eine Messung (Spannung am Arduino-PIN) zeigt auch immer 0V - auch wenn die Schaltung vom Sensor 3,3V liefern sollte. Trenne ich den PIN vom Arduino, ist das Signal OK.
Daraus kann ich nur schließen, dass der Arduino den PIN auf LOW zieht, vermutlich nur kurzzeitig periodisch abfragt (sonst wäre der korrekte Status in FHEM nicht zu erklären).
Da ich im Scetch den Status abfragen muss um den Motor sofort zu stoppen und darüber hinaus der Motor auch nicht (in Richtung Anschlag) anlaufen soll, wenn trotzdem die entsprechende Taste gedrückt wird oder ein entsprechendes Signal von FHEM kommt, muss die Statusabfrage auch in die Funktionen MotorUp/MotorDown. Der Motor zieht nämlich so kräftig, dass die Mechanik brechen kann. Nach dem ersten Vorfall dieser Art, habe ich da zwar eine Sicherung eingebaut, aber die stresst die Mechanik unnötig.
Frage:
Kann man die PINs, die im TwoStateChannel konfiguriert sind, dauerhaft als Eingang konfigurieren ?
Oder kann ich den Status (sicher) in eine Variable übertragen (oder im TwoStateChannel abfragen) ?
Wenn ich pinMode(PIN,INPUT) in der Loop() verwende, geht das kurzzeitig, aber das scheint mir nicht sauber (könnte man aber machen, solange der Motor läuft).
Gibt es eventuell einen geeigneteren Channel ? (als TwoStateChannel)
Alternativ hatte ich schon RemoteChannel versucht, aber da wird das Gerät zum Dauerfunker (permanente LongPress Nachrichten, weil mindestens ein Sensor ist immer LOW ist).
Wäre dankbar für eure Anregungen.



gregorv

#1
Sieht so aus, als geht es weiter...
Der Eingang wird tatsächlich auf OUTPUT,LOW gesetzt, wenn er nicht gerade gelesen wird.
Gefunden hier https://forum.fhem.de/index.php/topic,124205.msg1198194.html#msg1198194 -papa schrieb: "... sondern im Sekundentakt gepollt. Dazu wird der Pin auf Eingang gestellt, der Status gelesen und dann wieder auf Output LOW gestellt."

nach etwas mehr Suche gab es sogar schon die Lösung - Die AskSinPP Lib wurde geändert:
In der aktuellen AskSinPP lib bleibt ein Eingang dauerhaft INPUT (während der Messung INPUT_PULLUP).
Damit sollte mein Problem gelöst sein, werde ich morgen gleich testen.

EDIT:
Test war erfolgreich. Mit der aktuellen AskSinPP (20.1.22) kann der Status von einem PIN eines TwoStateChannel mit digitalRead() gelesen werden und liefert jederzeit den korrekten Status.
Damit kann ich den Motor im Sketch stoppen, wenn der Endanschlag erreicht wird und einen Anlauf vermeiden, wenn er bereits am Endanschlag ist.