Versuche eine double press funktion zu machen, stoße aber auf ein Problem

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"); 
}
}
}

Auch nochmal im Anhang

sketch_jan03a.ino (343 Bytes)

Hallo erstmal!

Dein Konzept funktioniert nicht, und m.E. hast Du noch einen längeren Weg vor Dir.
Für Dein Problem gibt's fertige Libs. Schonmal geschaut?

Und egal was dein Sketch tun soll, delay(500) ist nahezu immer eine schlechte Idee

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. :wink:

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.

Hallo,

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.

Theseus erklärt millis()
http://forum.arduino.cc/index.php?topic=400102.msg2752141#msg2752141

Okay, danke euch allen :slight_smile:
Bin echt geflasht, dass es selbst im deutschsprachigen Forum so viel Hilfe gibt ^^