Code to detect single or double click

consider

const byte pinBut = A1;
byte butLst;

enum { None, SingleClick, DoubleClick };

// -----------------------------------------------------------------------------
int
chkButton (void)
{
    const  unsigned long ButTimeout  = 250;
    static unsigned long msecLst;
           unsigned long msec = millis ();

    if (msecLst && (msec - msecLst) > ButTimeout)  {
        msecLst = 0;
        return SingleClick;
    }

    byte but = digitalRead (pinBut);
    if (butLst != but)  {
        butLst = but;
        delay (10);           // **** debounce

        if (LOW == but)  {   // press
            if (msecLst)  { // 2nd press
                msecLst = 0;
                return DoubleClick;
            }
            else
                msecLst = 0 == msec ? 1 : msec;
        }
    }

    return None;
}

// -----------------------------------------------------------------------------
void
loop ()
{

    switch (chkButton ())  {
    case SingleClick:
        Serial.println ("single");
        break;

    case DoubleClick:
        Serial.println ("double");
        break;
    }
}

// -----------------------------------------------------------------------------
void
setup ()
{
    Serial.begin (9600);

    pinMode (pinBut, INPUT_PULLUP);
    butLst = digitalRead (pinBut);
}
1 Like