Taster entprellen vereinfachen

Hallo,

ich versuche gerade das entprellen der Taster zu vereinfachen. Bislang gab es als Hilfestellung das Debounce Beispiel. Leider ist dieses nur eine Hilfestellung. Jedes Mal für jeden Taster den gleichen Code zu schreiben ist etwas sinnfremd.

Habe nun versucht, eine kleine Funktion zu schreiben, nach der man nun die Taster komfortabler aufrufen und entprellen kann. Sie ist noch nicht 100% fertig. Fehlt noch der gute Feinschliff. Anregungen sind erwünscht. Eine relativ wichtige Frage noch vorweg an die Community. Ich speichere die Werte in einem Array an die Stelle des hardwareseitigen Pins. Gibts da evtl. eine komfortablere Möglichkeit, denn ich bin mir nicht sicher, ob der Code unnötig aufgeblasen wird, wenn beispielsweise immer Index 2 leer bleibt, da dieser nicht als Taster genutzt wird, aber sich auf Pin 10 ein Taster befindet.

xy[] = {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, ....}

static int taster1 = 2;

void setup()
{
  pinMode(taster1, INPUT);
  pinMode(13, OUTPUT);
}


void loop()
{
  int zustand1 = entprellen(taster1);
  static int letzterZustand1;

  if(zustand1 != letzterZustand1) digitalWrite(13, HIGH);
  else digitalWrite(13, LOW);
}


uint8_t entprellen(uint8_t taster)
{
  // tasterAnzahl entspricht der höchsten PinNr
  const uint8_t tasterAnzahl = 13;

  static uint8_t lesen[tasterAnzahl];
  static uint8_t letzterZustand[tasterAnzahl];
  uint8_t zustand[tasterAnzahl];
  static uint8_t vergangeneZeit[tasterAnzahl];
  uint8_t entprellZeit = 50;

  lesen[taster] = digitalRead(taster);

  if (lesen[taster] != letzterZustand[taster]) 
  {
    vergangeneZeit[taster] = millis();
  }

  if(millis() - vergangeneZeit[taster] > entprellZeit)
  {
    if(lesen[taster] != zustand[taster])
    {
      zustand[taster] = lesen[taster];
    }
  }
  letzterZustand[taster] = lesen[taster];
  return zustand[taster];
}

Fuer so etwas bietet sich eine Objekt-orientierte Loesung an.

So etwas vielleicht (kompiliert, aber nicht ausprobiert):

#define DEBOUNCE_DELAY 50

class Button
{
public:
    Button(const uint8_t pin)
        : _pin(pin)
        , _last_state(HIGH) // <-- Assumes pull-up used
        , _last_event(0)
    {
        pinMode(pin, INPUT_PULLUP);
    }

    bool changed()
    {
        const uint8_t curr_state = digitalRead(_pin);
        if (curr_state != _last_state && (millis() - _last_event) > DEBOUNCE_DELAY)
        {
            _last_state = curr_state;
            _last_event = millis();
            return true;
        }

        return false;
    }

    bool pressed()
    {
        return _last_state;
    }

protected:
    uint8_t _pin;
    uint8_t _last_state;
    uint32_t _last_event;
};

Button button(2);

void setup()
{
}

void loop()
{
    if (button.changed())
    {
        if (button.pressed())
        {
          // ...
        } else {
          // ...
        }
    }
}[/quote]

Am besten dann auch eine "Library" draus machen....

Einfachstes Entprellen: Wenn du 10 ms Zeit hast, reicht ein delay(10), nachdem du einen Taster-Wechsel entdeckt hast. Evtl auch weniger. Musst bei beiden Änderungen (drücken / loslassen) warten.

Was ist deine Verbesserung gegenüber der Bounce Lib? http://playground.arduino.cc//Code/Bounce

Das ist doch in etwa was du willst. Für viele Knöpfe wäre höchstens noch eine Methode praktisch, die alle Bounce Objekte auf einmal updatet.