INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
1 Button für mehrere Aktionen
22.07.2014, 14:24 (Dieser Beitrag wurde zuletzt bearbeitet: 05.08.2014 18:13 von Wampo.)
Beitrag #1
1 Button für mehrere Aktionen
Hy zusammen,

trotz langer suche find ich keine Antworten.

Folgender Aufbau:
- ich habe einen Pushbutton, der aber je nach Tastendrucklänge zwei verschiedene Aktionen auführen soll.
- Kurzer druck Aktion eins, langer druck (2sec) Aktion zwei
- Button läuft über Interrupt an Pin 3 vom Mega/Uno

Wie geht das? Irgendwie mit ne Timerlib? Kennt jemand dazu n Tutorial oder sowas?

Greez Wampo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.07.2014, 14:53
Beitrag #2
RE: 1 Button 2 Aktions
Hallo Wampoo,

versuche mal über die Bounce Library den gleichen Button mit zwei verschieden langen Zeiten zu entprellen.
Dann die Abfragen für .update() und .read() der Bounce - Objekte so schreiben, dass erst das Objekt mit der langen Zeit und dann das Objekt mit der kurzen Zeit rankommt. Etwa so:
Code:
if (bounce_Long.update() || bounce_Short.update())
{
  if (bounce_Long.read() == HIGH)
   {Aktionen langer Druck}
  if (bounce_short.read() == HIGH)
   {Aktionen kurzer Druck}
}
Nur so eine Idee.

Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.07.2014, 21:35
Beitrag #3
RE: 1 Button 2 Aktions
Schau dir mal diese Seite an: http://www.avdweb.nl/arduino/hardware-in...uncer.html

Hab's selbst noch nicht ausprobiert, aber die Beschreibung sieht als Lösung für dein Problem aus (ggf. mit kleinen Modifikationen)

Gruß, Alex
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.08.2014, 18:08
Beitrag #4
RE: 1 Button 2 Aktions
Habe zu dem Thema 1 Button 2 Aktions noch was sehr interessantes gefunden und gleich in meine CodeSammlung aufgenommen.

Mit nur einem Button können hier 4 verschiedene Aktionen ausgeführt werden. Sehr praktisch wie ich finde wenn man n kleines Menü aufbaut oder was auch immer. Viel Spass mit dem Code hoffe jemand kann damit was anfangen und es konnte ihm so wie mir weitergeholfen werden.

Code:
unsigned long button_hit = 0;
//=================================================
//  MULTI-CLICK:  One Button, Multiple Events

// Button timing variables
int debounce = 20;          // ms debounce period to prevent flickering when pressing or releasing the button
int DCgap = 250;            // max ms between clicks for a double click event
int holdTime = 1000;        // ms hold period: how long to wait for press+hold event
int longHoldTime = 3000;    // ms long hold period: how long to wait for press+hold event

// Button variables
boolean buttonVal = HIGH;   // value read from button
boolean buttonLast = HIGH;  // buffered value of the button's previous state
boolean DCwaiting = false;  // whether we're waiting for a double click (down)
boolean DConUp = false;     // whether to register a double click on next release, or whether to wait and click
boolean singleOK = true;    // whether it's OK to do a single click
long downTime = -1;         // time the button was pressed down
long upTime = -1;           // time the button was released
boolean ignoreUp = false;   // whether to ignore the button release because the click+hold was triggered
boolean waitForUp = false;        // when held, whether to wait for the up event
boolean holdEventPast = false;    // whether or not the hold event happened already
boolean longHoldEventPast = false;// whether or not the long hold event happened already

void setup() {
  pinMode(PUSHP, INPUT);
  digitalWrite (PUSHP, HIGH);
}

void loop(){
  // Get button event and act accordingly
   int b = checkButton();
    if (b == 1) clickEvent();
    if (b == 2) doubleClickEvent();
    if (b == 3) holdEvent();
    if (b == 4) longHoldEvent();
}

// Events to trigger

void clickEvent() {}
void doubleClickEvent() {}
void holdEvent() {}
void longHoldEvent() {}

int checkButton() {    
    int event = 0;
    buttonVal = digitalRead(PUSHP);
    // Button pressed down
    if (buttonVal == LOW && buttonLast == HIGH && (millis() - upTime) > debounce)
    {
        downTime = millis();
        ignoreUp = false;
        waitForUp = false;
        singleOK = true;
        holdEventPast = false;
        longHoldEventPast = false;
        if ((millis()-upTime) < DCgap && DConUp == false && DCwaiting == true)  DConUp = true;
        else  DConUp = false;
        DCwaiting = false;
    }
    // Button released
    else if (buttonVal == HIGH && buttonLast == LOW && (millis() - downTime) > debounce)
    {        
        if (not ignoreUp)
        {
            upTime = millis();
            if (DConUp == false) DCwaiting = true;
            else
            {
                event = 2;
                DConUp = false;
                DCwaiting = false;
                singleOK = false;
            }
        }
    }
    // Test for normal click event: DCgap expired
    if ( buttonVal == HIGH && (millis()-upTime) >= DCgap && DCwaiting == true && DConUp == false && singleOK == true && event != 2)
    {
        event = 1;
        DCwaiting = false;
    }
    // Test for hold
    if (buttonVal == LOW && (millis() - downTime) >= holdTime) {
        // Trigger "normal" hold
        if (not holdEventPast)
        {
            event = 3;
            waitForUp = true;
            ignoreUp = true;
            DConUp = false;
            DCwaiting = false;
            //downTime = millis();
            holdEventPast = true;
        }
        // Trigger "long" hold
        if ((millis() - downTime) >= longHoldTime)
        {
            if (not longHoldEventPast)
            {
                event = 4;
                longHoldEventPast = true;
            }
        }
    }
    buttonLast = buttonVal;
    return event;
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  mehrere Taster entprellen Kitt 15 489 24.10.2016 21:17
Letzter Beitrag: georg01
  Taster für mehrere Funktionen matthias3579 5 345 16.08.2016 16:00
Letzter Beitrag: StephanBuerger
  Frage zu One Button in Kombination mit Fast LED Wolfgang_2801 3 237 26.06.2016 22:11
Letzter Beitrag: hotsystems
  Mehrere Wertabfragen blebbens 5 370 18.06.2016 22:58
Letzter Beitrag: Scheams
  2 und mehrere Led´s mit Fernbedienung AN / AUS + Blinkfunktion Golffahrer 22 932 07.06.2016 11:31
Letzter Beitrag: hotsystems
  Mehrere Abläufe gleichteitig mit "Millis" MarkusSpielt 3 652 11.04.2016 18:23
Letzter Beitrag: MarkusSpielt
  Mehrere MCP23017 dynamisch verwenden itsy 5 605 14.02.2016 13:22
Letzter Beitrag: itsy
  I ch brauche mehrere SDA und SCL am MEGA2560 arduinofan 5 748 10.01.2016 21:15
Letzter Beitrag: arduinofan
  Mehrere Geräte über eine IR Fernbedienung Respun 20 1.988 07.01.2016 23:51
Letzter Beitrag: hotsystems
  mehrere Analoge eingänge seriell ausgeben rieders 5 773 28.11.2015 09:55
Letzter Beitrag: Bitklopfer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste