ich versuche schon seit längerem ein (wahrscheinlich ganz einfaches) Programm zu schreiben. Ich möchte folgendes:
Ich habe ein LCD-Display, welches ich für eine Ausgabe verwenden möchte. Es soll "Aktueller Wert: 0" dastehen. Bis dahin habe ich es ja geschafft. Den Wert habe ich in einer Variable gespeichert. Ich nenne sie hier einmal int variable = 0;.
Nun habe ich zwei Push-Buttons an mein Arduino Uno angeschlossen. Drücke ich beispielsweise auf den einen, steigert sich der Wert um 1, beim anderen, senkt er sich um 1. Dieser Wert wird dann auf dem Display angezeigt. Ich habe das folgendermaßen versucht umzusetzen:
wie michael-x sagt mußt Du den Pin lesen damit Du den Wert hast den Du kontrollieren kannst und nicht mit Pin vergleichen.
if (switch1 == HIGH) ist falsch
Richtig ist
if (digitalRead(switch1) == HIGH)
Grüße Uwe
oh mein Gott... darauf hätte ich auch irgendwie draufkommen können.
Aber wahrscheinlich ein typischer Anfängerfehler ^^
Danke schon mal für eure Mithilfe
@ michael_x
Eigentlich immer um 1 pro Druck auf den Taster. Ich schätze mal, dass ich dazu ein Delay zusätzlich benötige, da er ja (wie von euch schon angesprochen) ohne der Pause ziemlich rasant zählen würde.
Das kann mit "delay"- muss aber nicht.
Taster habe die unangenehme Eigenschaft zu "prellen". D.h. Du drückst den
Taster vermeindlich einmal- aber er schaltet mehrmals.
Wenn es irgent möglich ist, vermeide in allen Deinen Sketch´s delay. Delay
legt Dir den Arduino "still". Er macht dann "nichts" mehr.
void loop()
{
if (digitalRead(TasterPin) == HIGH)
{
// diese Stelle wird zigtausendmal pro Sekunde durchlaufen,
// solange der Taster gedrückt ist ( bzw. bei INPUT_PULLUP losgelassen ist )
}
}
Natürlich kannst du für ein erstes Erfolgserlebnis da drin erstmal ein delay(1000) einbauen:
Dann zählt er im Sekundentakt entweder rauf oder runter.
Einen "Tastendruck" erkennt man aber am Wechsel zwischen LOW und HIGH.
Dazu musst du dir merken, was vorher war.
s. AlterZustand im code unten.
Und dann kommt das ominöse Prellen in Spiel.
Wenn du den Taster drückst, wechselt er innerhalb weniger Millisekunden einige Male zwischen LOW und HIGH, bis er dann im neuen Zustand bleibt. Kann übrigens auch beim Loslassen passieren !
Leute die Spass dran haben, Zauber-Software zu verwenden, freuen sich über die debounce Library, die das Problem löst.
Das einfachste Entprellen ist ein delay(5), sobald ein erster Wechsel erkannt wurde.
const int TasterUpPin = A0;
const int TasterDnPin = A1;
boolean alterZustandUp;
boolean alterZustandDn;
int variable;
void setup()
{
// Die beiden Taster verbinden den Pin mit GND, das spart externe Widerstände ein.
pinMode(TasterUpPin, INPUT_PULLUP); // LOW wenn gedrückt
pinMode(TasterDnPin, INPUT_PULLUP);
}
void loop()
{
boolean neuerZustand = digitalRead(TasterUpPin);
if ( neuerZustand != alterZustandUp )
{
delay(5); // entprellen
alterZustandUp = neuerZustand;
if (neuerZustand == LOW) variable ++;
}
neuerZustand = digitalRead(TasterDnPin);
if ( neuerZustand != alterZustandDn )
{
delay(5); // entprellen
alterZustandDn = neuerZustand;
if (neuerZustand == LOW) variable --;
}
lcdAusgabe(variable);
}