Ganz kleines LCD-Display-Projekt

Liebe Arudino-Gemeinschaft,

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:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int switch1 = A0;
const int switch2 = A1;
int variable = 0;

void setup() {
  
  lcd.begin(16, 2);
  pinMode(switch1,INPUT);
  pinMode(switch2 ,INPUT);
  
  lcd.print("Aktueller Wert:");
  lcd.setCursor(0, 1);
  lcd.print(variable);

}

void loop() {
  
  
  if (switch1 == HIGH)
  {
    variable = variable + 1;
    lcd.setCursor(0, 1);
    lcd.print(variable);
  }
  else if (switch2 == HIGH)
  {
    variable = variable - 1;
    lcd.setCursor(0, 1);
    lcd.print(variable);
  }
  else
  {
  }

}

Das Ergebnis: Es passiert nichts. Es bleibt auf dem Display die Ausgabe: “Aktueller Wert: 0”. Was mache ich hier falsch?

Danke für eure Mühe.

Pulldown-Widerstände an die Taster angeschlossen?

Wenn nein, dann die Taster gegen Masse schalten (statt an 5V), pinMode(...,INPUT_PULLUP) verwenden und statt HIGH auf LOW abfragen: http://arduino.cc/en/Tutorial/InputPullupSerial

Außerdem musst du die Taster entprellen: https://github.com/thomasfredericks/Bounce-Arduino-Wiring

Der Einfachheit halber reicht auch erst mal ein ca. 20ms Delay nach dem Auslesen des Zustands

Anstatt

variable = variable + 1;
variable++;
variable-1;
const int switch1 = A0;
if (switch1 == HIGH) { /* das wird nie wahr */ }

digitalRead () und du wirst sehen, wie schnell der Arduino ist. Wie schnell möchtest du denn hochzählen ?

ARG! Das hätte ich auch sehen müssen :) :(

@skorpi08 Das ist genau das gleiche. var++ oder var-- ist lediglich kürzer

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.

LG

Hallo, einen hochzählen pro Tastendruck.

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.

Für "WarteZeiten" sind millis (http://arduino.cc/de/Reference/Millis) sehr viel besser geeignet.

Das entprellen der Taster läßt sich am "einfachsten" per Software realisieren. Das nennt sich dann "Debounce" (http://arduino.cc/en/Tutorial/Debounce)

Da kannst Du einmal mit üben. Eine Suche im Forum wird Dich erschlagen. Gruß und Spaß dabei Andreas

Serenifly: @skorpi08 Das ist genau das gleiche. var++ oder var-- ist lediglich kürzer

Das weiß ich, nur manchmal funktionierte es bei mir nicht!

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

}

Ah... am Anfang habe ich das mit den Pullups gar nicht gecheckt. Langsam blicke ich durch ^^

Danke euch ! :)