RPI_GPIO debounce

Begonnen von ralfix, 02 August 2016, 23:51:49

Vorheriges Thema - Nächstes Thema

ralfix

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

klausw

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
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

ralfix

#2
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'. :)