Bouncer-Problem

Hey,
ich besitze einen Taster, einen Arduino duemilanove 328 und ein HD44780 (LCD Display).

Ich habe es bis jetzt geschafft ein Menü mit den Punkten:
Brennweite
Grad
Reihen

zu erstellen.

Wenn ich jetzt das Programm starte, wird das hier im Display angezeigt (so soll es auch sein) :

Brennweite<
Grad
Reihen

Nochmaliges Tasten:

Brennweite

Grad<
Reihen

usw.

Das Problem ist nur, dass der Taster manchmal aussetzt. Das heißt, wenn ich taste, blinkt der Arduino auch "Ja es wurde getastet" aber er schaltet nicht weiter.

Könnte das Problem durch einen Bouncer gelöst werden?

Ich habs versucht zu testen, aber die Bounce Libary:
http://arduino.cc/playground/Code/Bounce
beinhaltet irgendwie nicht die richtigen Keywords...

Ich habe mal ein Example Programm aus der Bounce Libary kompiliert, doch er findet die wichtigsten Befehle:
" bouncer.update ( );"
und
"Bounce bouncer = Bounce"
usw. nicht...

Mein bisherige Code:

#include <Bounce.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void Grundmenu()
{
lcd.setCursor(0, 0);
lcd.print("Brennweite ");
lcd.setCursor(0, 1);
lcd.print("Grad ");
lcd.setCursor(0, 2);
lcd.print("Reihen ");
lcd.setCursor(0, 3);
lcd.print(" ");
}

void Brennweite()
{
lcd.setCursor(0, 0);
lcd.print(">Brennweite< ");
lcd.setCursor(0, 1);
lcd.print("Grad ");
lcd.setCursor(0, 2);
lcd.print("Reihen ");
lcd.setCursor(0, 3);
lcd.print(" ");
}

void Grad()
{
lcd.setCursor(0, 0);
lcd.print("Brennweite ");
lcd.setCursor(0, 1);
lcd.print(">Grad< ");
lcd.setCursor(0, 2);
lcd.print("Reihen ");
lcd.setCursor(0, 3);
lcd.print(" ");
}

void Reihen()
{
lcd.setCursor(0, 0);
lcd.print("Brennweite ");
lcd.setCursor(0, 1);
lcd.print("Grad ");
lcd.setCursor(0, 2);
lcd.print(">Reihen< ");
lcd.setCursor(0, 3);
lcd.print(" ");
}

void setup()
{
pinMode(13,INPUT);
lcd.begin(20, 4);
Grundmenu();

}

//void loop(){
int i=1;
void loop(){
if(digitalRead(13)==HIGH){
i++;
}
if(i==4){
i=1;
}
if(i==1){
Brennweite();
delay(200);
}

if(i==2){
Grad();
delay(200);
}

if(i==3){
Reihen();
delay(200);
}
}

Ich hoffe ihr könnt mir helfen, ich hab schon überall geschaut aber die Suche trägt keine Früchte :~

Hi

Du könntest M2tklib für deine Menüs benutzen. M2tklib hat einen debounce Algorithmus eingebaut.

Vorschlag: Lade Dir m2tklib für LiquidCrystal herunter, installiere es in Deiner Arduino Umgebung und probiere die Beispiele mal aus (File -> Examples).

http://code.google.com/p/m2tklib/downloads/list

Oliver

Hey,

danke Dir!

Ich hab gerade versucht die Examples zu verstehen und hab auch das Wiki gelesen..aber irgendwie kann ich rein nichts damit anfangen, was ich genau von den Befehlen benötige ( wahrsch. m2.checkKey(); und m2.handleKey() ) und wo ich diese anwenden sollte...

Bei mir sagt er, dass m2.checkKey(); nicht deklariert ist..die examples konnte er aber kompilieren.

Schwierig Schwierig..und das "nur" für einen Taster. :roll_eyes:

Hi

Naja, sagen wir mal so. Nur den Debounce Algorithmus herauszulösen, wird schiwerig sein.
Idee von mir war eher so: Wenn Dir die Beispiele zusagen, dann nimm doch für deine Menüs einfach m2tklib.

Du willst ja folgendes Menü erstellen:

Brennweite<
Grad
Reihen

Das sieht etwa so aus (je nachdem wie du das machen willst, syntax kann falsch sein)

M2_BUTTON(el_brennweite, NULL, "Brennweite", fn_brennweite);
M2_BUTTON(el_grad, NULL, "Grad", fn_grad);
M2_BUTTON(el_reihen, NULL, Brennweite, fn_brennweite);
M2_LIST(list_main_menu) = { &el_brennweite, &el_grad, &el_reihen };
M2_VLIST(el_top, NULL, list_main_menu);

Selbstverständlich kann man dann mit m2tklib auch dialogboxen zur numerischen
Eingabe von Werten etc erstellen (siehe Beispiele)

was ich genau von den Befehlen benötige ( wahrsch. m2.checkKey(); und m2.handleKey() )

Die Sequenz schaut immer gleich aus und kann praktisch aus den Beispielen 1:1 übernommen werden.
Aber wie gesagt: Ganz oder gar nicht. Am besten wäre es dann, die Menüs auch mit M2tklib nachzubauen.

Wenn Du wilst, kann ich mal einen lauffähigen Code für Dich zusammensetzen. Brauchst Du auch Dialogboxen, beispielsweise zur Eingabe der Brennweite? Wenn ja, wie soll die ausschauen? Hier spielt M2tklib seine Stärken aus.
Menüs können direkt miteinader verknüpft werden, so dass man direkt in die entsprechenden Unterdialoge gelangt in denen dann die Werte abgefragt werden.

Bei mir sagt er, dass m2.checkKey(); nicht deklariert ist..die examples konnte er aber kompilieren.

Vermutlich fehlt das include file oder die deklaration des m2 objects (siehe Beispiele)

Mir ist schon klar, dass m2tklib nicht so ganz einfach ist. Das Erstellen eines Human-Machine-Interface hat halt auch so seine Tücken. m2tklib nimmt einem vieles ab und läßt dem Programmierer gleichzeitig genügend Freiheit zur Umsetzung seiner Ideen.
Wie gesagt, gerne können wir den Weg am Anfang gemeinsam gehen... Du beschreibst die Menüs ich setze es mal exemplarisch um.

Oder aber Du sagtst: "Nee, ich wollte nur den Debouncer....". Dann ist es vermutlich besser ich suche die Stelle im Code für Dich raus zum Nachprogrammieren.

Grüße, Oliver

Hey, danke für Deine Antwort.

Interessant hört es sich an.
Es wäre super genial, wenn du mir mal ein lauffähiges Script schreiben könntest.

Durch einen 2. Taster sollen dann die Punkte, bei denen man gerade ist (die man mit dem 1. Taster ausgewählt hat) öffnen können..

Brennweite<
Grad
Reihen

*2. Taster tast' *
Brennweite öffnet sich und soll beinhalten:

70mm<
100mm
135mm
200mm
300mm

dazwischen soll man wieder wählen können und durch tasten des 2. taster die jeweilige brennweite ausgewählt werden, die man makiert hat.
Dann soll sich das Menü schließen und man soll zum 1. Menü kommen.

Das reicht erstmal
Es wäre super freundlich, wenn du das für mich machen könntest :slight_smile:

Wieviele Zeilen hat dein Display? 16x4?
Sind die beiden Taster mit 2 Eingangspins verbunden?

Oliver

Die beiden Taster haben jeweils ein Eingang zum Arduino. (9 und 10)

20 Zeichen und 4 Zeilen.
Also 4x20.

Hi

Ich hab mal dein Menü als M2tklib version angehängt.
Zusätzlich mit einem "Start" Button zum Aktivieren.
M2tk benutzt eckige Klammern für den Menü-Cursor, aber man kann da auch spzige daraus machen:

Für die Brennweiten habe ich eine scrollbare Liste mit entsprechender Scrollbar benutzt.
Obwohl es nicht so aussieht, aber die Scrollbar hat eine Auflösung von einem Pixel (und nicht nur von einem Zeichen). M2tklib programmiert hier dynamisch die Zeichen um.

Schließlich hab ich noch ein Grad Menü eingebaut. Man kann hier eine Zahl zwischen 0 und 90 eingeben. Der Fokus liegt hier auf der Zahl

Gleiches Menü, nur liegt der Fokus auf dem "ok" Button:

Als Beispiel hier der Code für das "Grad" Menü. M2tk hat hier schon recht mächtige Befehle um beispielsweise numerische Eingaben zu ermöglichen (U8NUM):

// Grad-Menü: Es kann eine Zahl von 0 bis 90 eingegeben werden.
// Das LABEL Element gibt einfach nur einen Text aus
M2_LABEL(el_grad_label, NULL, "Grad:");
// Der Benutzer kann hier eine Zahl zwischen 0 und 90 eingeben. Die Zahl
// wird direkt in der globalen Variablen "grad" gespeichert
M2_U8NUM(el_grad_u8, "c2", 0, 90, &grad);
// wenn der Benutzer fertig mit der Eingabe ist, geht es hier zurück zum Hauptmenü
M2_ROOT(el_grad_ok, NULL, "ok", &el_menu);
// jetzt werden die drei Elemente zusammengefasst
M2_LIST(list_grad) = { &el_grad_label, &el_grad_u8, &el_grad_ok };
// Das Kontainerelement GRIDLIST ordnet die Elemente als Matrix an
M2_GRIDLIST(el_grad_menu, "c2", list_grad);

Natürlich könnte man das Grad-Menü auch an irgendeiner anderen Stelle im Display platzieren (z.B. mit M2_ALIGN), aber ich wollte es nicht unnötig kompliziert machen.

Ich habe alles mit meinem 16x4 Display ausprobiert. Ggf musst Du das im Setup auf 20x4 ändern. Die Taster scheinen wohl bei uns gleich angeschlossen zu sein.

Grüße, Oliver

Menu1.pde (6.13 KB)

Hey,

vielen vielen Dank!

Ich frage mich nur grad wo man die "m2ghlc.h" Library herbekommt?!
Ich hab' die gar nicht und finden kann ich sie auch nicht. :~

oh, kleiner Fehler von mir:

In dem Beispiel "menu1.pde" muss es statt

#include "m2ghlc.h"

korrekterweise

#include "utility/m2ghlc.h"

heissen.

Meine Compiler-Umgebung ist etwas anders aufgesetzt.
Habe das .pde nochmal angehängt.

Oliver

Menu1.pde (6.14 KB)

Okay,

angepasst ist es.

Nun funktioniert der Select Taster wie er soll!

Der Next Taster funktioniert aus irgendwelchen Gründen aber nicht... ich habe die Pins überprüft.
Finds komisch!

Danke - vielen Dank nochmal an Dich, dass du mir so hilfst, ist ja nicht selbstverständlich!

Hm... der eine Taster geht, der andere nicht. Seltsam. Hast Du mal mit dem Voltmeter den Pin nachgemessen? Wenn gedrückt, dann 0V, wenn nicht gedrückt 5V? Hängt noch was anderes an dem Pin?
Versuchsweise könnte man den Taster auch an einen anderen Eingang hängen (dann auch das Beispiel abändern..)

Oliver

Die Taster gingen ja am anderen Programm.

Ich habe noch einen anderen Taster, den ich dann auch auf einen anderen Pin gelegt habe..aber das geht auch nicht.. hm sehr komisch!

Haben denn die anderen Beispiele der M2tklib funktioniert?

Oliver

Jap..anderes Example getestet.
Und es funktioniert da genauso wenig mit dem Next Taster...
Das verwirrt mich sehr!

Nun, da spricht dann doch vieles für ein Hardware Problem. Der Taster sollte ja einen Pin gegen Masse kurzschließen. Vielleicht gibt es ja da ein Kontakt Problem.

Oliver

Kurz offtopic:
Das klingt für mich nach einem Panbot-Projekt. Liege ich hier richtig?

olikraus,
Aber es ging doch bei meinem Programm problemlos..?!

derHerrKohler,
da liegst Du genau richtig! - Das Ding ist fast fertig nur die Benutzerfreundlichkeit wird nun durch ein Display und ein paar Tastern verbessert..bzw soll verbessert werden :wink:

Sim0n,
Erklären kann ich es mir nicht. Ich fasse mal zusammen, was ich jetzt von Dir mitbekommen habe:
Das Beispiel mit M2tklib funktioniert nicht. Auch die Examples mit M2tklib funktionieren nicht.
Es äußert sich so, dass zwar der Select Taster funktioniert, aber nicht der Next Taster.

Fragen:

  1. Passiert gar nichts mit dem Next Taster? Oder funktioniert er manchmal?
  2. Wie genau sind deine Taster angeschlossen? Kurzschluss nach Masse, wenn gedrückt?
  3. Was passiert, wenn Select und Next Pins vertauscht werden?
  4. Kannst Du den Pegel am Pin messen, an dem der Taster angeschlossen ist? 5V, wenn nicht gedrück? 0V, wenn gedrückt? Oder irgendetwas anderes?

Oliver

  1. Es passiert rein gar nichts.

  2. Jap 5V zu GND also Kurzschluss zu Masse...ist genauso angeschlossen wie der Select Button.. Der eine ist ein Next ist ein Doppeltaster, der wie 2 einer Taster funktioniert..ein GND und 2 5V sozusagen.
    Der Select hat 150kOhm der Next jeweils 50kOhm. (Spannungsteiler wurde benutzt)

  3. Select funktioniert und Next wieder nicht :~

  4. Ja 5 Volt kommen ja raus (müssen ja auch, da das andere Programm beim "Next'en" auch funktioniert...