INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Mehrere Taster/Schalter entprellen und verwalten
30.01.2020, 17:08
Beitrag #1
Mehrere Taster/Schalter entprellen und verwalten
Hallo,
es gibt ja eine ganze Reihe Libs, die sich mit dem Thema mechanische Schalter und dem Entprellen beschäftigen. Allerdings fokussieren die ( zumindest die ich kenne ) sich alle auf einen einzelnen Taster oder Schalter. Setzt man die dann mehrfach ein, verbrauchen sie ziemlich viel Ressourcen.
In dem Umfeld, in dem ich mich viel tummele ( der Modellbahnerei ) hat man es eher mit vielen Eingabeschaltern und Tastern zu tun. Da ist es dann häufig sinnvoll, Portexpander ( I2C ) oder/und eine Tastaturmatrix zu nutzen. Das wird von diesen Bibliotheken aber auch nicht unterstützt.
Aufgrund einer konkreten Anfrage habe ich mich deshalb mal daran gemacht, dafür eine möglichst allgemeingültige Lösung zu finden.
Ziele:
  • beliebige Hw-Konfigurationen unterstützen ( direkter Anschluß, Portexpander, Matrix )
  • Entprellen
  • Flankenerkennung (Drücken/Loslassen)
  • Langen / kurzen Tastendruck erkennen
Einen ersten Entwurf einer entsprechenden Lib ( MoToButtons ) habe ich auf GitHub gehostet. Um den ersten Punkt erfüllen zu können, wird die eigentliche Abfrage der HW über ein User Callback realisiert. Rückgabewert ist ein entsprechendes Bitmuster in einer 8,16 oder 32-Bit Variable ( je nach Einstellung in der Lib ). Damit können also in einer Instanz bis zu 32 Taster/Schalter verwaltet werden.

Die Doku ist noch etwas rudimentär ( Kommentare in der .h-Datei und ein Beispielsketch ), aber falls jemand Interesse hat, würde ich mich über Rückmeldungen freuen.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.01.2020, 20:56
Beitrag #2
RE: Mehrere Taster/Schalter entprellen und verwalten
(30.01.2020 17:08)MicroBahner schrieb:  Hallo,
es gibt ja eine ganze Reihe Libs, die sich mit dem Thema mechanische Schalter und dem Entprellen beschäftigen. Allerdings fokussieren die ( zumindest die ich kenne ) sich alle auf einen einzelnen Taster oder Schalter. Setzt man die dann mehrfach ein, verbrauchen sie ziemlich viel Ressourcen.
In dem Umfeld, in dem ich mich viel tummele ( der Modellbahnerei ) hat man es eher mit vielen Eingabeschaltern und Tastern zu tun. Da ist es dann häufig sinnvoll, Portexpander ( I2C ) oder/und eine Tastaturmatrix zu nutzen. Das wird von diesen Bibliotheken aber auch nicht unterstützt.
Aufgrund einer konkreten Anfrage habe ich mich deshalb mal daran gemacht, dafür eine möglichst allgemeingültige Lösung zu finden.
Ziele:
  • beliebige Hw-Konfigurationen unterstützen ( direkter Anschluß, Portexpander, Matrix )
  • Entprellen
  • Flankenerkennung (Drücken/Loslassen)
  • Langen / kurzen Tastendruck erkennen
Einen ersten Entwurf einer entsprechenden Lib ( MoToButtons ) habe ich auf GitHub gehostet. Um den ersten Punkt erfüllen zu können, wird die eigentliche Abfrage der HW über ein User Callback realisiert. Rückgabewert ist ein entsprechendes Bitmuster in einer 8,16 oder 32-Bit Variable ( je nach Einstellung in der Lib ). Damit können also in einer Instanz bis zu 32 Taster/Schalter verwaltet werden.

Die Doku ist noch etwas rudimentär ( Kommentare in der .h-Datei und ein Beispielsketch ), aber falls jemand Interesse hat, würde ich mich über Rückmeldungen freuen.
Hallo Franz-Peter,
ich hatte gerade letztens für einen Bekannten ein kleines Projekt mit 8 Tastern umgesetzt, das hatte ich noch mit OneButton realisiert.
Nach meinem Urlaub (Skifahren)werde ich das noch mal mit Deiner Lib umsetzen.
Von Deiner Mobatools-Lib war ich ja schon mal begeistert, also gehe ich davon aus, dass das mit dieser Lib auchwieder so wird. Diesen Erfolgsdruck hast Du Dir also selbst zuzuschreiben Big Grin
Grüße
Roland
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.01.2020, 21:30 (Dieser Beitrag wurde zuletzt bearbeitet: 30.01.2020 21:30 von Tommy56.)
Beitrag #3
RE: Mehrere Taster/Schalter entprellen und verwalten
@MicroBahner: Wie ist das zu verstehen?

processButtons() soll oft aufgerufen werden, aber nicht kürzer, als die Entprellzeit, sonst wird die pressTime falsch. Da geht es doch nach meiner Meinung um Verfälschungen < Entprellzeit?
Die dürften in der Praxis doch kaum ins Gewicht fallen, wenn es handbetätigte Buttons sind

Die hardcodierte Größe (8/16/32 Bit) könnte man evtl. durch ein template verallgemeinern, so dass man die gleiche Lib ohne Codeänderungen z.B. in Sketchen mit 8 und welchen mit 16 Bit benutzen kann.

Ansonsten wieder eine schöne Arbeit. Besonders die Idee mit dem Callback finde ich gut, damit kann man beliebige HW für die Buttons rein hängen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.01.2020, 22:04 (Dieser Beitrag wurde zuletzt bearbeitet: 30.01.2020 22:07 von MicroBahner.)
Beitrag #4
RE: Mehrere Taster/Schalter entprellen und verwalten
(30.01.2020 20:56)RolandF schrieb:  ich hatte gerade letztens für einen Bekannten ein kleines Projekt mit 8 Tastern umgesetzt, das hatte ich noch mit OneButton realisiert.
Nach meinem Urlaub (Skifahren)werde ich das noch mal mit Deiner Lib umsetzen.
Da bin ich auf deine Erfahrungen gespannt. Bei 8 Tastern braucht die OneButton doch schon ganz ordentlich RAM. Mein Ansatz ist aber deutlich anders Wink - da wirst Du dein Programm schon umschreiben müssen.

(30.01.2020 21:30)Tommy56 schrieb:  @MicroBahner: Wie ist das zu verstehen?
processButtons() soll oft aufgerufen werden, aber nicht kürzer, als die Entprellzeit, sonst wird die pressTime falsch. Da geht es doch nach meiner Meinung um Verfälschungen < Entprellzeit?
Das habe ich wohl nicht richtig bzw. missverständlich beschrieben. Das Problem tritt auf, wenn processButtons zu selten aufgerufen wird, also in Intervallen die größer als die Entprellzeit sind. Beliebig kürzer als die Entprellzeit ist kein Problem, und sollte der Normalfall sein. Derzeit wird die 'pressTime' intern in 'entprellzeit' Einheiten gezählt. Da komme ich mit einem Byte aus, was RAM spart ( den Zähler braucht man ja für jeden Taster ). Das könnte man aber sicher noch optimieren. Ist ja erst ein erster Ansatz.

(30.01.2020 21:30)Tommy56 schrieb:  Die hardcodierte Größe (8/16/32 Bit) könnte man evtl. durch ein template verallgemeinern, so dass man die gleiche Lib ohne Codeänderungen z.B. in Sketchen mit 8 und welchen mit 16 Bit benutzen kann.
Da habe ich auch schon dran gedacht, und es gibt auf GitHub auch schon einen Branch (Templates) dazu. Allerdings hat das auch so seine Tücken, da das ja zur Compilezeit aufgelöst wird. In eine eigen cpp kann man das dann nicht auslagern, da dort zur Compilezeit nicht bekannt ist, was der Sketch haben will. Ausserdem ist die Instanziierung dann etwas komplexer und für die Einsteiger sicher recht ungewöhnlich. Bei Klassen muss man den gewünschten Typ mit übergeben. Funktionstemplates sind da einfacher handhabbar. Da weis ich noch nicht, was letztendlich die beste Lösung ist. Ich habe auch noch nicht sehr viel Erfahrung mit Templates.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.01.2020, 22:46
Beitrag #5
RE: Mehrere Taster/Schalter entprellen und verwalten
Dann schau Dir bitte nochmal die Beschreibung bezüglich des Aufrufs in der Headerdatei an.
Zitat:if its called less then debTime, pressTime will be inaccurate
sagt nach meinem Verständnis dann das Falsche aus.

Zum Template: Der Anwender weiß (oder sollte es wissen) zur Compilezeit, wieviele Taster er hat. Deshalb sollte eine Anlage
Code:
MaToButton<uint16_t>
zur Compilezeit machbar sein. Der User muss seine Buttons ja auch nutzen und dazu muss er die Menge vorher kennen.
Es geht ja nicht um eine dynamische Anlage zur Laufzeit. Ja, Templates müssen in den Header.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.01.2020, 09:10 (Dieser Beitrag wurde zuletzt bearbeitet: 31.01.2020 09:14 von MicroBahner.)
Beitrag #6
RE: Mehrere Taster/Schalter entprellen und verwalten
(30.01.2020 22:46)Tommy56 schrieb:  Dann schau Dir bitte nochmal die Beschreibung bezüglich des Aufrufs in der Headerdatei an.
Zitat:if its called less then debTime, pressTime will be inaccurate
sagt nach meinem Verständnis dann das Falsche aus.
Ja, das ist zumindest missverständlich. Deutlicher ist:
Zitat:if its called less frequently than debTime, pressTime will be inaccurate
So habe ich das jetzt geändert.

(30.01.2020 22:46)Tommy56 schrieb:  Zum Template: Der Anwender weiß (oder sollte es wissen) zur Compilezeit, wieviele Taster er hat. Deshalb sollte eine Anlage
Code:
MaToButton<uint16_t>
zur Compilezeit machbar sein.
Ja, das funktioniert natürlich. Im Branch Templates ist das in dem Beispiel ja auch so gemacht und es läuft. Allerdings gehören templates sicher nicht zum Standardwissen des durchschnittlichen Arduino-Nutzers, und dementsprechend ist diese Syntax da erstmal neu und verwirrend.
Allerdings: Wenn eh der ganz Code ins .h-File muss, könnte man das auch mit einem optionalen #define vor dem #include lösen. Standardmässig wird z.B. 16Bit genutzt, und mit dem #define könnte man den Standard überschreiben. Das dürfte für die Meisten einfacher sein.

So wie jetzt, mit der Anpassung direkt im .h-File, ist jedenfalls nicht optimal Wink .

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.01.2020, 12:22
Beitrag #7
RE: Mehrere Taster/Schalter entprellen und verwalten
(31.01.2020 09:10)MicroBahner schrieb:  Allerdings: Wenn eh der ganz Code ins .h-File muss, könnte man das auch mit einem optionalen #define vor dem #include lösen. Standardmässig wird z.B. 16Bit genutzt, und mit dem #define könnte man den Standard überschreiben. Das dürfte für die Meisten einfacher sein.
Das wäre auch eine sehr gute Lösung, die die allgemeine Verwendbarkeit erhält.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.01.2020, 17:43
Beitrag #8
RE: Mehrere Taster/Schalter entprellen und verwalten
Ja, eigentlich gefällt mir das auch am Besten, weshalb ich den 'master' Branch auf GitHub jetzt mal darauf umgestellt habe.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Super Mario Theme per Taster theo-rist 5 247 26.08.2020 19:15
Letzter Beitrag: hotsystems
  Mehrere LED's mit versch. Farben ansteuern Daiminium 15 822 06.08.2020 07:50
Letzter Beitrag: MicroBahner
  Arduno + Ethernet-Shield: HTML-Seite mit Taster für einmalige Auslösung RivaDynamite 1 319 22.06.2020 20:50
Letzter Beitrag: Tommy56
  Zwei Richtungen mit einem Taster FoxFactoy 12 872 19.06.2020 13:04
Letzter Beitrag: hotsystems
  Compiler-Schalter Rainer2 8 664 07.06.2020 13:34
Letzter Beitrag: Tommy56
  Mehrere Aktionen unterschiedlich oft mit While ausführen dreikommasieben 3 514 19.05.2020 17:11
Letzter Beitrag: dreikommasieben
  Wie mehrere Bedingungen in if-Definition einbauen? Gelegenheitsbastler 7 29.576 18.05.2020 09:53
Letzter Beitrag: SimonTau
  Betätigung d. Sensors soll Steuerung abschalten und nur über Taster einschalten Floydi 12 1.199 26.04.2020 07:47
Letzter Beitrag: MicroBahner
  Funk Fernbedienung Taster Abfrage kurz oder lange gedrückt Michi_exe 15 1.089 16.04.2020 17:19
Letzter Beitrag: Tommy56
  Stepper Motor mit zwei Taster bedienen / Fehler ohne Fehlermeldung Milano 6 817 21.03.2020 16:06
Letzter Beitrag: MicroBahner

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste