Ich habe folgendes Problem: Ich möchte etwas mit dem Keypad shield entwickeln, bei dem man 2 mal den up button drückt und dann, und zwar nur dann, eine Nachricht erscheint. Nun habe ich aber das Problem, dass das ganze mit einem single press bereits funktioniert. Was habe ich falsch gemacht ?
Mein Code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() {
// put your setup code here, to run once:
lcd.begin(16, 2);
lcd.clear();
}
void loop() {
int x = 0;
x = analogRead(0);
if (x < 200 && x > 100) //btn up :D
{
x = 0;
x = analogRead(0);
delay(500); /
if (x < 200 && x > 100)
{
lcd.print("success");
}
}
}
nils0x:
Ich habe folgendes Problem: Ich möchte etwas mit dem Keypad shield entwickeln, bei dem man 2 mal den up button drückt und dann, und zwar nur dann, eine Nachricht erscheint. Nun habe ich aber das Problem, dass das ganze mit einem single press bereits funktioniert. Was habe ich falsch gemacht ?
Mein Code:
Du gehst fälschlicherweise davon aus, dass ein "Tastendruck" dann vorliegt, wenn der analogRead() Wert in einem bestimmten Bereich liegt.
Aber der Wert kann zehntausendmal in der Sekunde immer in diesem Bereich liegen, einfach indem man den Finger auf dem gedrückten Taster läßt, ohne ihn loszulassen. Aber wenn der Wert zehntausendmal in der Sekunde im Bereich bleibt (was deshalb der Fall ist, weil der Taster nicht bewegt wird), dann bedeutet das nicht, dass der Taster zehntausendmal pro Sekunde gedrückt wird.
Unter dem Drücken eines Tasters versteht man üblicherweise den Übergang vom nicht-gedrückten zum gedrückten Zustand. Und das ist bei diesen Analog-Buttons nochmal etwas schieriger zu detektieren als bei digitalen Buttons.
Das wichtigste beim Keypad ist der Zustand "keine Taste gedrückt". Das ist nicht schwieriger als eine andere Taste zu erkennen, darf man aber nicht vergessen.
x = 0;
x = analogRead(0);
Ich weiss jetzt nicht, was x alles bedeuten können soll bei dir, aber eine der beiden Zeilen ist auf jeden Fall sinnlos. Die andere, in deinem Zusammenhang , übrigens auch. So schnell prellt kein Taster, dass man an zwei analogRead() direkt hintereinander, was sinnvolles erkennen könnte.
das es für so ein Keypad eine Lib gibt wurde ja schon geschrieben.
Zur Doppelklick Erkennung sei gesagt, du musst dir den Zeitpunkt beider Klicks merken, liegen diese zeitlich im vorgegeben Rahmen, dann war es ein Doppelklick, dauerte es länger zueinander gesehen, waren es 2 Einzelklicks. Deswegen und anderen Dingen muss dein delay raus. millis() anwenden ist hier ganz wichtig.