/*
  1º desafio fazer com que os dois leds pisquem ao mesmo tempo, porém com frequencias
  distintas.
  O Led1 a cada 1 segundos e o led2 a cada 5 segundo
  2º desafio, enquanto o led2 pisca a cada 1 segundo,
  O botão 1 deve ligar e o botão 2 deve desligar o Led1.
  3º incluir o led3 que deve piscar a cada 250 milisegundos.
  4º incluir um botão que deve desligar o Led1, a cada click do botão ele deve ligar e desligar o pisca do led.
  5º Mudar a informação do print, ele deve informar se o led irá acender ou apagar, fazer isso para cada um dos leds.
*/
// 1º Desafio
#define Led1 14
#define Led2 12
#define Led3 13
#define Bt1  21
bool bt1_pressionado;
bool bt1_ultimoEstado;
bool bt1_estadoAtual;
unsigned long tempoAtual     = 0;
unsigned long tempoAnterior1 = 0;
unsigned long tempoAnterior2 = 0;
unsigned long tempoAnterior3 = 0;
bool debounce(bool ultimo) {
  bool atual = digitalRead(Bt1);
  if (ultimo != atual) {
    delay(5);
    atual = digitalRead(Bt1);
  }
  return atual;
}
void setup() {
  Serial.begin(115200);
  pinMode(Led1, OUTPUT);
  pinMode(Led2, OUTPUT);
  pinMode(Led3, OUTPUT);
  pinMode(Bt1, INPUT_PULLUP);
  bt1_pressionado  = false;
  bt1_ultimoEstado = false;
  bt1_estadoAtual  = false;
}
void loop() {
  bt1_estadoAtual = debounce(bt1_ultimoEstado);
  if (bt1_ultimoEstado == true && bt1_estadoAtual == false) {  // verifica se o botão foi pressionado
    bt1_pressionado = !bt1_pressionado; // inverte valor da variável
    if (bt1_pressionado) {
      Serial.println("botao pressionado");
    } else {
      Serial.println("botao liberado");
    }
  }
  bt1_ultimoEstado = bt1_estadoAtual;
  tempoAtual = millis();
  // Pisca led3 a cada 250 milisegundos
  if (bt1_pressionado) {
    if (tempoAtual >= (tempoAnterior3 + 250)) {
      tempoAnterior3 = tempoAtual;
      digitalWrite(Led3, !digitalRead(Led3));
      Serial.print("tempoAnterior3:"); // imprime o timer desde quando o programa foi iniciado
      Serial.println(tempoAnterior3); // imprime o timer desde quando o programa foi iniciado
    }
  } else {
    digitalWrite(Led3, LOW);
  }
  // Pisca led2 a cada 5 segundos
  if (tempoAtual >= (tempoAnterior2 + 5000)) {
    tempoAnterior2 = tempoAtual;
    digitalWrite(Led2, !digitalRead(Led2));
    Serial.print("tempoAnterior2:"); // imprime o timer desde quando o programa foi iniciado
    Serial.println(tempoAnterior2); // imprime o timer desde quando o programa foi iniciado
  }
  // Pisca led1 a cada 1 segundos
  if (tempoAtual >= (tempoAnterior1 + 1000)) {
    tempoAnterior1 = tempoAtual;
    digitalWrite(Led1, !digitalRead(Led1));
    Serial.print("tempoAnterior1:"); // imprime o timer desde quando o programa foi iniciado
    Serial.println(tempoAnterior1); // imprime o timer desde quando o programa foi iniciado
  }
}