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 utilizando o delay (problemas no acionamento do botão)
/*void loop() {
  static int i, j; // static mantém o último valor da váriavel guardado (conta de 0 até 255)
  bool bot; //especifica o estado do botão (acionado ou não)
  delay (200);
  digitalWrite(10, HIGH); // acende o led vermelho
  digitalWrite(5, LOW); // mantém o led azul apagado
  delay (200);
  digitalWrite(10, LOW); // apaga o led vermelho
  digitalWrite(5, HIGH); // acende o led azul
  i++;
  Serial.print("Número de ciclos ");
  Serial.println(i);
  bot = digitalRead(BOTAO); // leitura do pino digital do botão
  if (!bot) { // if (!bot) -> é igual a: low/false/0/!1)
    j++;
    Serial.print("Botão ");
    Serial.println(j);
  }
  }
*/

/*
  Soluções para melhorar o problema do acionamento do botão:
  1- Tirar o delay
  2- Interrupção (mais recomendado)
  3- Utilizar as funções temporárias millis () e micros ()
*/

//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 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

  //Resolução 1:
  /*static bool bot;
    bot = digitalRead(BOTAO);
    if (!bot) {
    j++;
    Serial.print("Botão ");
    Serial.println(j);
    }
  */

  //Resolução 2 (com pulse):
  /*if (pulseIn(4,LOW) > 100) j++;
  */

  //Resolução 3 (com detector de borda):
  static bool bot = digitalRead(BOTAO);
  static unsigned long repique = 0;
  if (bot && !digitalRead(BOTAO) && ((millis () - repique) > 500)) {
    j++;
    repique = millis();
  }

  if (tf - ti >= 500) { //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);

  }


  //Resolução utilizando interrupção:
  //(No outro projeto)

}