Positive Flanke triggerd auch bei fallendem Pegel

Moin!
Ich hänge gerade daran einen funktionierenden Zähler zu bauen, der beim Drücken eines Tasters einen Zähler hochzählen lässt. Hört sich ja nicht so schwer an, ne?
Sah dann so aus (in Kurzform, der ganze code ist angehängt):

state = digitalRead(set_pin);
  if (laststate != state)
  {
    if (state)
    {
      clicks++;
      update_lenght();
      lcd_show();
      delay (2);
    }

  }
  laststate = state;

Das Ergebnis: Der Zähler zählt beim Drücken hoch. Leider auch beim Loslassen.

Der Kontext:
Ich möchte ein Kabellängenmessgerät bauen um die Länge von Mikrofonkabeln zu messen. Dazu läuft das Kabel durch zwei Rollen, eine von ihnen mit einem Taster, der viermal pro Umdrehung gedrückt wird. Der Aufbau ist mit Fischertechnik realisiert und wird gesteurt von meinem Arduino Uno mit Display plus Backpack. In dem ganzen Sketch ist in auskommentierter Form auch mein erster Ansatz, der das gleiche Ergebnis liefert.
Natürlich könnte ich meine errechnete Länge einfach durch 2 teilen, ich will aber natürlich wissen wo das Problem liegt. Interessanterweise funktioniert das Skript, wenn ich die negative Flanke abfrage, also

 if (state == 0)

frage. Wie gesagt, ich möchte aber das Problem und seine Lösung wissen.

Vielen Dank schonmal.
Gruß,
Sepur

Kabel_messgeraet.ino (1.39 KB)

     delay (2);

um eine Stufe weiter raus, dann hast du richtig entprellt.

   laststate= state;

kannst du dafür eins weiter reinrücken, ist aber eigentlich egal.

  state = digitalRead(set_pin);
  if (laststate != state)
  {
    if (state)
    {
      clicks++;
      update_lenght();
      lcd_show();
    }
    delay (2);
    laststate = state;
  }

Der Taster prellt. Auch beim loslassen schließt/öffnet der Taster mehrmals und hat darum auch eine positive Flanke.

Abhilfe sie vorherigen Beitrag.

Grüße Uwe

Je nach Mechanik des Tasters kann auch eine längere Entprellzeit notwendig sein. Bei Kabel in Steckbrett nehme ich 30, bei Knackfrosch entsprechend weniger. Probieren hilft :slight_smile:

Ich ziehe folgendes vor:

INTERVAL(2) {state = digitalRead(set_pin)};  // oder eben mehr