FHEM Forum

FHEM - Hardware => Einplatinencomputer => Thema gestartet von: ralfix am 02 August 2016, 23:51:49

Titel: RPI_GPIO debounce
Beitrag von: ralfix am 02 August 2016, 23:51:49
Hallo
ich habe mir ein low-tech Schlüsselbrett gebaut, d.h. ohne Microschalter, Reedkontakte, iButton etc.

Jeder Schlüsselbund hat ja einen Metallring der 2 Kontakte überbrücken kann.
Dazu wurden je zwei Schrauben in 1cm Abstand ein Brett geschraubt und an der Rückseite mit je einem 10 kOhm Widerstand mit den GPIO und 3,3V eines, dort praktischerweise schon vorhandenen, Raspi verbunden.

Anforderung:
Wenn key_n hingehängt oder abgenommen wird, soll ein Event zur FHEM-Hauptinstanz zur weiteren Verwendung geschickt werden.     
Sonst soll sich das System ruhig verhalten, also nicht ständig pollen.

Dazu habe ich eine dedizierte FHEM-Installation aufgesetzt, die per FHEM2FHEM LOG mit dem Hauptsystem kommuniziert.

Das ganze Konstrukt funktioniert grundsätzlich im ersten Versuch ganz brauchbar.

Leider werden schon durch leichtes Wackeln am Schlüssel, oder Berührung des Nachbarschlüssels Events ausgelöst,
was ich eigentlich durch den hohen debounce-Wert verhindern möchte.

define key_1 RPI_GPIO 18
attr key_1 debounce_in_ms 250
attr key_1 direction input
attr key_1 interrupt both
attr key_1 room Schlüsselbrett

Sieht jemand den Fehler oder hat jemand einen Tipp wie man das Konstrukt software- oder hardwareseitig "entfeinern" kann?
Gruß Ralf
Titel: Antw:RPI_GPIO debounce
Beitrag von: klausw am 03 August 2016, 15:12:00
Hi Ralf,

debounce soll nur das prellen rausfiltern, daher wird auch die kürzeste Unterbrechung registriert. Nur darauffolgende Pegeländerungen werden im debounce Zeitraum ignoriert.

Was du möchtest, ist eine Auslösung nach festgelegter Zeit.
Du könntest dir ein notify bauen.
Longpress ist vermutlich nix passendes

Grüße
Klaus
Titel: Antw:RPI_GPIO debounce
Beitrag von: ralfix am 03 August 2016, 21:27:01
Die Aktionsauslösung (z.B. ROOMMATE state) wird wohl auf notify mit sleep hinauslaufen.
...
Letzendlich die völlig simple Lösung:
define n_key_4_on notify key_4:on.* {
fhem "set Key_Ralf on";;
if (ReadingsVal('rr_Ralf', 'state', 0) eq "absent")
  { fhem("set rr_Ralf home")};
}
attr n_key_4_on room Flur,Residents

define n_key_4_off notify key_4:off.* {
fhem "set Key_Ralf off";;
if (ReadingsVal('rr_Ralf', 'state', 0) eq "home")
  { fhem("set rr_Ralf absent")};
}
attr n_key_4_off room Flur,Residents


Damit kann key_4 den Resident_Ralf nur noch von 'home' auf 'absent' und zurück schalten. Aber ein nächtlicher kurzer Luftzug, der kurz am Schlüssel wackelt und den Kontakt unterbricht, beendet nicht mein 'asleep'. :)