Taster / Button entprellen

Hey ich suche eine (ganz) einfache Art einen Taster / Button zu entprellen.

Meine Idee war:

old_key = new_key;
new_key = read_button();
if( new_key == old_key){
delay(200);
}

hier wird aber meine Angabe sehr schwammig

Ah hab was gefunden dank google :wink:

taster_val = digitalRead(inputPin); // Wert auslesen
delay(10); // 10 millisekunden warten
taster_val_prell = digitalRead(inputPin); // Wert nochmal abfragen
if (taster_val == taster_val_prell) // Nur wenn der Wert gleich ist (Taste schwingt nicht mehr so stark)
{
if(taster_val != tasterstatus) // Ist es auch ein anderer Zustand als vorher?
{
if(taster_val == HIGH) // Ist der Zustand gedr?ckt?
{
lcd.clear(); // LCD l?schen
lcd.setCursor(, 0); // Oben links Cursor setzen
if(wie_oft%2 == ) // wenn der Status gechanced wird
{ // wird entweder die eine
lcd.print("Test");
}else
{ // oder die andere Nachricht ausgegeben
lcd.print("Cocktailmaschine");
}
wie_oft++; // Erh?ht den Z?hler
}
}
tasterstatus = taster_val; // Setzt den Status zur?ck
}

Hm, mit dem delay(200) tust Du ja erstmal gar nichts. Beim loslassen des Knopes wird schon nicht mehr entprellt. Was spricht gegen die Bounce library? Die gibt es hier: Arduino Playground - Bounce

cool danke für den Tipp! Ich werde das gleich mal probieren.

In einem einfachen Sketch reicht oft

taster_val = digitalRead(inputPin);           // Wert auslesen
if (taster_val != oldval)
{
    // normale Bearbeitung: losgelassen / gedrückt etc...
    oldval = taster_val;
   delay(10);              // 10 millisekunden warten, eine Änderung danach wird wieder eine echte sein.
}

10 ms sollten zum Entprellen reichen,
und wenn es nichts ausmacht, dass loop() beim Taste drücken/loslassen 10 ms dauert, braucht man nicht mehr.

Wenn man den Taster HIGH-aktiv (also mit externem PULLDOWN Widerstand auf Masse) betreibt, kann man auch mit einem zusätzlichen Widerstand und einem Kerko von 100 nF zwischen Input und Masse entprellen.
Siehe: cc-robotics.de
In dem Beispiel sind sogar beide (HIGH- und LOW-aktive) Varianten abgedeckt. Dann spart man sich die Softwareseite.

Dann spart man sich die Softwareseite.

:~

Hardware-Entprellen ist ok, wenn die Signale nicht in einen Controller gehen. ( Sondern in einen Zähl-IC oder so )

Eine zusätzliche Zeile Code sollte billiger sein als jeder Kondensator, weniger Platz auf der Platine brauchen und nicht so leicht kaputt gehen.

Wie funktioniert denn das Entprellen, wenn man mehr wie einen (4Stück) Taster entprellen will?

kann ich die Bounce2.h Bibiothek nutzen oder ist die nur für 1Taster ausgelegt?

Mein versuch den Code zu modifizieren schlug fehl(es wird nur der erste Eingang beachtet:

#include <Bounce2.h>

#define BUTTON_PIN 2
#define BUTTON_PIN2 3
#define LED_PIN 13
Bounce debouncer = Bounce(); 
Bounce debouncer2 = Bounce();

void setup() {
  pinMode(BUTTON_PIN,INPUT_PULLUP);
  pinMode(BUTTON_PIN2,INPUT_PULLUP);

  debouncer.attach(BUTTON_PIN);
  debouncer.interval(10); // interval in ms
  debouncer2.attach(BUTTON_PIN2);
  debouncer2.interval(10); // interval in ms

  pinMode(LED_PIN,OUTPUT);

}

void loop() {
  debouncer.update();
  debouncer2.update();

  int value = debouncer.read();
  if ( value == LOW ) {
    digitalWrite(LED_PIN, HIGH );
  }
  value = debouncer2.read();
  if(value == LOW){
    digitalWrite(LED_PIN, LOW );
  }

}

Lege dir ein Array aus Bounce Objekten an und iteriere über das Array. Das ist am wenigsten duplizierter Code und skaliert beliebig.

Siehe hier:
http://forum.arduino.cc/index.php?topic=296409.msg2074109#msg2074109

#define INPUTMODE INPUT_PULLUP            // INPUT oder INPUT_PULLUP
byte buttonPins[] = { 2, 3, 4, 5, 6, 7 };
const int NUMBUTTONS = sizeof(buttonPins);
Bounce debouncer[NUMBUTTONS];

void setup()
{
  for(int i = 0; i < NUMBUTTONS; i++)
  {
    pinMode(buttonPins[i], INPUTMODE);
    debouncer[i].attach(buttonPins[i]);
    debouncer[i].interval(10);
  }
}

Dann kann man sowas machen:

  for(int i = 0; i < NUMBUTTONS; i++)
  {
    debouncer[i].update();   // Status prüfen
    if(debouncer[i].fell())  // Wenn die Taste gedrückt wird
    {
        ....
    }
    if(debouncer[i].rose())  // Wenn die Taste losgelassen wird
    {
         ....
    }
  }

Serenifly hat bei dem von ihm für Dich verlinkten Thread wirklich ganze Arbeit geleistet und mir dadurch sehr geholfen.

Vielen Dank nochmals hierfür!

Gruß Chris

Vielen Dank auch von mir, habe ne weile gebraucht biss ich das jetzt denke mal verstanden habe.
Werde deine Struktur verwenden, mir ist aber dennoch zumindest der Fehle in meinen Test aufgefallen.
Werde noch das verlinkten Thema von Chris72622 durchlesen, da da en Haufen sinnvolle Sachen drinne sind, die ich auch noch gebrauchen kann;)

hier nur noch mal die berichtigte Variante (die ich aber jetzt nicht mehr so einsetzen werde):

#include <Bounce2.h>
#define BUTTON_PIN 2
#define BUTTON_PIN2 3
#define LED_PIN 13
Bounce debouncer = Bounce(); 

void setup() {
  pinMode(BUTTON_PIN,INPUT_PULLUP);
  pinMode(BUTTON_PIN2,INPUT_PULLUP);
  debouncer.attach(BUTTON_PIN);
  debouncer.interval(10); // interval in ms
  pinMode(LED_PIN,OUTPUT);
}
void loop() {
  debouncer.attach(BUTTON_PIN);
  debouncer.update();
  int value = debouncer.read();
  if ( value == LOW ) {
    digitalWrite(LED_PIN, HIGH );
  }
  debouncer.attach(BUTTON_PIN2);
  debouncer.update();
  value = debouncer.read();
  if(value == LOW){
    digitalWrite(LED_PIN, LOW );
  }
}
/*
debounce.feel()//VKE1=Taste "gedrückt"
debounce.rose()//VKE1=Taste "losgelassen"
debounce.update()//VKE1=Flankenwechsel
debounce.read()//auslesen Status
*/

Du kannst auch nur das update() in der for-Schleife machen und dann das Auslesen der Taster einzeln um verschiedene Aktionen ausführen. Gibt da viele Optionen, aber wenn man alles mit einzelnen Objekten (statt einem Array) macht dann wird der Code unübersichtlich wenn man viele Taster hat.

wollte ja nur den Code berichtigen, finde deine Beispiele um längen besser/effektiver/kompakter/... Serenifly!!! Noch mal´s danke;)