Algo assim?
#define TIME_OUT 2000
unsigned char num_clicks = 0;
unsigned char time_on = 0;
unsigned long timer = 0;
unsigned char flanco = 0;
if (digitalRead(botao) == LOW && flanco == 0) { //primeiro click.
num_clicks++; //incrementa clicks
flanco = 1; // não volta aqui neste ciclo.
if (time_on == 0) { //primeira vez que entra aqui.
timer = millis();
time_on = 1; //não volta a entrar.
}
}
if (digitalRead(botao) == HIGH) { //faz reset do flanco para entrar na condicão anterior.
flanco = 0;
}
if (millis() - timer >= TIME_OUT ) { //acabou-se o tempo desde que carregaste pela primeira vez no botão.
switch (num_clicks) { //decide o que fazer tendo por base o numero de clicks.
case 1: {
funcao_1();
break;
}
case 2: {
funcao_2();
break;
}
case 3: {
funcao_3();
break;
}
default: {
erro();
break;
}
}
//faz reset do ciclo...
num_clicks = 0;
flanco = 0;
time_on = 0;
}
Este código (ou qualquer código com botões) tem o problema do debounce. Provavelmente a variável num_clicks vai contar mais que o numero de vezes que clicaste no botão. Mas nada como experimentar e ver o que dá.