Go Down

Topic: Taster / Button entprellen (Read 8326 times) previous topic - next topic

BigInteger

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

BigInteger

Ah hab was gefunden dank google ;-)

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
  }

sven222

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: http://playground.arduino.cc/Code/Bounce

BigInteger

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

michael_x

In einem einfachen Sketch reicht oft
Code: [Select]
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.  

mkl0815

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: http://blog.cc-robotics.de/2007/03/25/entprellung-ohne-flipflop/
In dem Beispiel sind sogar beide (HIGH- und LOW-aktive) Varianten abgedeckt. Dann spart man sich die Softwareseite.

michael_x

Quote
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:
Code: [Select]
#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 );
  }

}


Serenifly

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

Code: [Select]

#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:
Code: [Select]

  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
    {
         ....
    }
  }

Chris72622

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
"Blink Without Delay" ist die Lösung für Dein Problem.

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):
Code: [Select]
#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
*/

Serenifly

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

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy