const int buttonPin = 2; // define o pino que o botão está conectado
int buttonState = HIGH; // o estado atual do botão
int lastButtonState = HIGH; // o último estado do botão
long lastDebounceTime = 0; // último tempo que o botão foi acionado
long debounceDelay = 50; // tempo de debounce; aumentar se a leitura não estiver estável
void setup() {
  pinMode(buttonPin, INPUT_PULLUP); // configura o pino do botão como entrada com resistor de pull-up interno
  Serial.begin(9600); // inicializa a comunicação serial com a velocidade de 9600 baud
}
void loop() {
  int reading = digitalRead(buttonPin); // lê o estado do botão
  if (reading != lastButtonState) {
    lastDebounceTime = millis(); // atualiza o tempo do último toque
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
      if (buttonState == LOW) {
        // detecta um toque curto
        Serial.println("Toque curto");
        delay(50);
        // detecta um segundo toque curto em menos de 300ms
        if (digitalRead(buttonPin) == LOW) {
          delay(50);
          if (digitalRead(buttonPin) == HIGH) {
            Serial.println("Dois toques");
          }
        }
        // detecta um terceiro toque curto em menos de 300ms
        if (digitalRead(buttonPin) == LOW) {
          delay(50);
          if (digitalRead(buttonPin) == HIGH) {
            Serial.println("Três toques");
          }
        }
      } else {
        // detecta um toque longo
        Serial.println("Toque longo");
      }
    }
  }
  lastButtonState = reading; // atualiza o último estado do botão
}