Taster entprellen; if Abfrage; Lcd Screen

Hi Leute,
ich arbeite gerade an einem “Projekt” bei dem es um folgendes geht:
ich will, dass sich ein kleines Mänchen auf dem Lcd Screen pro Tasterdruck um eine Zelle nach vorne bewegt.

Allerdings habe ich dass Problem dass es so aussieht wie in dem Video. (mänchen läuft ohn Tasterdruck einfach die Reihe durch)
Die Schaltung funktioniert. Dass habe ich schon getestet.

hier der Code:

#include <LiquidCrystal.h>

LiquidCrystal lcd(13,12,11,10,9,8,7);

char a = 0;

  byte figur[8] = 
{
   B01110,
   B01110,
   B01110,
   B00100,
   B01110,
   B00100,
   B01010,
   B01010,   
};


const int TasterPin = 2;              // Pin Nummer des Tasters
int TasterStatus;                        // aktuelles Signal vom Eingangspin
int alterTasterStatus = LOW;    // vorheriger Status des Eingangspins
int Horizontal;                       // Nummer des Beluchtungsmodus

unsigned long letzteEntprellZeit = 0;   // letzte Zeit Änderung Status Ausgang
unsigned long entprellZeit = 50;          // Zeit für Entprellung, anpassen!


void setup()
{
  pinMode(TasterPin, INPUT);    //Taster Pin wird als Eingang gesetzt
  lcd.begin(16,4);
  lcd.createChar(a, figur);
}


void loop()
{
 //Setze Variable für das lesen des TasterPin
 int lesen = digitalRead(TasterPin);

/* 
  Überprüfe, ob Taster gedrückt ist und lange genug (entprellVerzögerung) gewartet wurde,
  um Prellen auszuschliessen
*/

  // Wenn sich der Status des Tasters geändert hat
  if (lesen != alterTasterStatus) 
  {
    letzteEntprellZeit = millis(); // stelle letzteEntprellZeit zurueck
  } 
  
  if ((millis() - letzteEntprellZeit) > entprellZeit)
  {
    delay(30);
    TasterStatus = lesen;
    lcd.setCursor(Horizontal, 0);
    lcd.write(' ');   //Leerzeichen um die Zelle zu löschen
    Horizontal = (Horizontal + 1) % 16;
    lcd.setCursor(Horizontal, 0);
    lcd.write(a);   //Zeichen eins weiter schreiben
  }
  


  // speichere Status, wird beim naechsten Status bein naechsten Durchlauf alterTasterStatus
  alterTasterStatus  = lesen;
}

Du setzt nirgends letzteEntprellZeit auf aktuelle millis();

An welcher Stelle muss das den Passieren?

Probiere mal folgendes bitte:
Ich hoffe das es funktioniert :cold_sweat:

#include <LiquidCrystal.h>

LiquidCrystal lcd(13,12,11,10,9,8,7);

char a = 0;

byte figur[8] = 
{
  B01110,
  B01110,
  B01110,
  B00100,
  B01110,
  B00100,
  B01010,
  B01010,   
};


const int TasterPin = 2;              // Pin Nummer des Tasters
int TasterStatus;                        // aktuelles Signal vom Eingangspin
int alterTasterStatus = LOW;    // vorheriger Status des Eingangspins
int Horizontal;                       // Nummer des Beluchtungsmodus

unsigned long letzteEntprellZeit = 0;   // letzte Zeit Änderung Status Ausgang
unsigned long entprellZeit = 100;          // Zeit für Entprellung, anpassen!


void setup()
{
  pinMode(TasterPin, INPUT);    //Taster Pin wird als Eingang gesetzt
  lcd.begin(16,4);
  lcd.createChar(a, figur);
}

int lastRead = digitalRead(TasterPin);
int actualRead;
unsigned long lastUpdate = millis();

void loop() {
  actualRead = digitalRead(TasterPin);
  if(actualRead != lastRead) {
    if((millis() - lastUpdate) > entprellZeit) {
      delay(30);
      lcd.setCursor(Horizontal, 0);
      lcd.write(' ');   //Leerzeichen um die Zelle zu löschen
      Horizontal = (Horizontal + 1) % 16;
      lcd.setCursor(Horizontal, 0);
      lcd.write(a);   //Zeichen eins weiter schreiben
      lastUpdate = millis();
    }
    lastRead = actualRead;
  }
}

Du kannst auch erst mal ganz primitiv nach dem Auslesen des Zustands ein Delay von 10-50ms machen. Das ist etwas die Zeit die der Taster prellt. Für solche einfachen Programmen, die während der Zeit nichts anderes machen reicht das völlig.

Ok das hat geklappt Es Ist jetz allerdings so dass sich das Mänchen beim eindrücken des Tasters ein nach vorne bewegt und beim loslassen. Wie kann ich dass beheben?