int j;
bool bot;

void setup() { // setup só é executado uma única vez (ao ligar o micro)
#define LED 10 // Led vermelho
#define LED 5 // Led azul
#define BOTAO 2 // Botão
  Serial.begin(115200); // inicia comunicação serial (BITS por segundos mandado para o micro)
  Serial.println("Olá, Mundo! ");
  pinMode(LED, OUTPUT); // define o pino 10 como saída
  pinMode(LED, OUTPUT); // define o pino 5 como saída
  pinMode(BOTAO, INPUT_PULLUP); // define o pino como 1 (lógica invertida)
}

//Loop profissional (problema do delay no acionamento do botão resolvido)
void loop() {
  //Atenção para o static nas variáveis abaixo.
  //Eles indicam que a função reterá o valor dela entre duas chamadas!
  static int i; //variável para contar o número de ciclos
  // static int j; //variável para contar o número de apertos de botão
  static bool estado; //especifica o estado do LED
  static long t_aperto = 0;
  static long ti = 0; // váriavel para contar o tempo (tempo inicial)
  // long tf = millis(); // váriavel para contar o tempo (tempo final)
  static unsigned long repique = millis(); //evita repiques nos apertos do botao
  bool bot = digitalRead(BOTAO);

  if ((millis() - ti) >= 300) { //caso tenha se passado 500ms, muda o estado do LED
    digitalWrite(10, estado);
    digitalWrite(5, !estado);
    estado = !estado;
    ti = millis(); //ajusta ti para recomeçar uma nova contagem!
    i++;
    Serial.print("Numero de ciclos ");
    Serial.println(i);
    Serial.print("Botão ");
    Serial.println(j);
  }

  attachInterrupt(digitalPinToInterrupt(BOTAO), Acao_Botao, FALLING); //utilizando a interrupção
}

void Acao_Botao() {
  static unsigned long repique = 0;
  if ((millis() - repique ) > 300) {
    repique = millis();
    j++;

  }
}