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
  Servo-Ansteuerung über einen Push-Button Aubergine83 1 158 16.02.2017 19:49
Letzter Beitrag: georg01
  Mehrere HX711 mit einem Arduino Uno be14b029 5 220 08.02.2017 18:09
Letzter Beitrag: Binatone
  Mehrere Servos gleichzeitig steuern (Hexapod) scritch 7 360 25.01.2017 08:18
Letzter Beitrag: scritch
  mehrere Taster entprellen Kitt 15 945 24.10.2016 21:17
Letzter Beitrag: georg01
  Taster für mehrere Funktionen matthias3579 5 549 16.08.2016 16:00
Letzter Beitrag: StephanBuerger
  Frage zu One Button in Kombination mit Fast LED Wolfgang_2801 3 342 26.06.2016 22:11
Letzter Beitrag: hotsystems
  Mehrere Wertabfragen blebbens 5 535 18.06.2016 22:58
Letzter Beitrag: Scheams
  2 und mehrere Led´s mit Fernbedienung AN / AUS + Blinkfunktion Golffahrer 22 1.262 07.06.2016 11:31
Letzter Beitrag: hotsystems
  Mehrere Abläufe gleichteitig mit "Millis" MarkusSpielt 3 959 11.04.2016 18:23
Letzter Beitrag: MarkusSpielt
  Mehrere MCP23017 dynamisch verwenden itsy 5 776 14.02.2016 13:22
Letzter Beitrag: itsy

Gehe zu:


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