Nimm doch statt delay(x) -> delayMicroseconds(x).
Du könntest auch mit millis() oder micros() arbeiten, bekommst ja dann die vergangene Zeit. und kannst also die Schleife immer wieder verlassen, solang eine gewisse Mindestzeit nicht vergangen ist.
Eigentlich wartet man nur darauf, dass der Taster eine gewisse Zeit nicht gedrückt wurde, um sicher zu gehen, dass er nicht mehr gedrückt ist.
Registriert man während dieser Wartezeit, dass der doch wieder gedrückt wurde oder ist, setzt man den Zähler zurück und wartet weiter, bis er die gewünschte Zeit eben nicht mehr gedrückt ist.
Mit millis() oder micros() weisst Du, wieviel Zeit vergangen ist und kannst deinen Zähler entspr. anpassen, bis der irgendwann auf 0 ist; dann ist der Taster nicht mehr gedrückt.
MfG
moppi,
es geht um 20ms, die man quasi nach dem 1. Drücken abfeiern muss -
- da ist es völlig wurscht, ob man die in microseconds oder milliseconds zählt.
Es darf aber ÜBERHAUPT KEINE WARTEZEIT geben!
Hast du dir mal die Mühe gemacht, den ButtonClass Code mit seiner State Machine anzusehen, für den die Entprellung gebraucht wird??
Du wartes da auf gar nichts. Ist ja nicht notwendig. millis() abfragen, vom Zähler abziehen -> Zähler = 0? Nein, zurück, weil Taste noch gedrückt (status mitgeben: bool return x). Ist doch 0? Ja, dann zurück, weil Taste nicht mehr gedrückt (status mitgeben). Die Zeit, die da verbraucht wird, ist halt die, für die paar Befehle. Aber kein Warten in dem Sinn, dass man da so und so viele Micros() oder Millis() in einer Schleife festhängt.
MfG
Das ist mir leider zu allgemein und zu unkonkret.
Aber wenn du wirklich die konkrete Lösung kennst, dann schreib hier mal hin, wie der Code für die ButtonClass geändert werden muss, damit man
a) zwar einen Doppelclick und auch einen langen Buttonpress erkennt, aber
b) schnelles Prellen bei einzelnen Buttonclicks herausgefiltert wird.
Link: https://github.com/dsyleixa/Arduino/.../ButtonClass.h
Nein, DIE konkrete Lösung für Dein Programm kenne ich nicht.
Was ich beschrieben habe ist eine allgemeiner Lösungsweg, den man gehen kann.
Ich denke aber, das Thema: Taster mit Kondensator entprellen
ist wohl hier jetzt nicht mehr zutreffend. Das per Software zu lösen, waren ja nur noch mal Hinweise von einigen hier.
Ich habe da mal reingeschaut, Dein Code sieht ziemlich lang aus, scheint mir zu lang, weiß ich aber nicht. Wäre mir zu viel Arbeit drin herum zu werkeln. Lieber gleich neu schreiben. Ich glaub so viel macht der ja nicht. Weiß noch nicht mal genau, was der Code genau tun soll und wozu. Deshalb würde ich vorschlagen, dass Du das selber änderst, Du weißt am besten, wie und was Dein Code macht. Das sollte am Schnellsten erledigt sein.
Aber da Du ja schon mit millis() arbeitest, an verschiedenen Stellen und dies Konzept die Entprellung nicht berücksichtigt, vielleicht denkt man es dann wirklich gleich noch mal neu und nimmt einen neuen Anlauf, mit neuem Code. Manchmal ist das so. Bevor man den alten Cde so lange verbiegt, bis nichts richtig funktioniert.
MfG
Geändert von Moppi (15.05.2019 um 18:52 Uhr)
den allgemeinen Weg über Software kenne ich doch und verwende ihn auch!
Mir geht es um eine konkrete Lösung für meine ButtonClass, für die deine allgemeine Lösung nicht ohne weiteres anwendbar ist - daher hatte ich an die Kondensator-Methode gedacht.
Allgemeines Gerede wie "Weiß noch nicht mal genau, was der Code genau tun soll und wozu. Deshalb würde ich vorschlagen, dass Du das selber änderst, Du weißt am besten, wie und was Dein Code macht." ist auch nicht gerade besonders nützlich, das müsstest du sicher selbst einsehen. Umschreiben der schon jetzt sehr verzwickten State Machine ist ntl die letzte Option.
Also bitte immer konkret bleiben - aber du darfst mir natürlich auch gerne meinen Code umschreiben bzw. erweitern, wenn du es kannst!
- - - Aktualisiert - - -
PS:
ich fang jetzt schon mal an, einen oder zwei zusätzliche States einzubauen...
Lesezeichen