int Port_D[] = {2, 3, 4, 5, 6, 7, 8}; //definição de todas as portas digitais
int Port_A[] = {A0, A1, A2, A3, A4}; //definição de todas as portas analogicas
int Polo = LOW; //altera seu estado varias vezes em um tempo determinado por Tempo_1.
int estadoFarol = LOW; //altera o estado do led frontal do hover
int contagem; //cria uma contagem quando o botão principal é apertado
int alertaFarol = LOW; //muda seu estado fazendo com que o farol pisque simuntaneamente
int Bot[] = {LOW, LOW, LOW, LOW, LOW}; //guarda o valor atual dos botões e altera assim que forem pressonados
#include "neotimer.h"
Neotimer Tempo_1 = Neotimer(100); //Define o tempo de alteração do estado de Polo
Neotimer Tempo_2 = Neotimer(1); //tempo de contagem do botão de ação do controle
Neotimer Tempo_3 = Neotimer(300); //tempo para o farol piscar
void setup() {
  Serial.begin(115200); //inicia a comunicação serial
  for (int Np = 0; Np <= 6; Np++) { //laço que se repete 7 vezes
    if (Np < 5) { //enquanto Np for menor que 5
      pinMode(Port_A[Np], INPUT); //define todas as portas de A0 - A4 como entrada
    }
    pinMode(Port_D[Np], OUTPUT); //define todas as portas de 2 - 8 como saída
    digitalWrite(Port_D[Np], LOW); //desliga todas as portas digitais
  }
  int pLed = HIGH;
  for (int Pl = 0; Pl <= 5; Pl++) {
    digitalWrite(Port_D[6], pLed);
    pLed = !pLed;
    delay(400);
  }
}
void loop() {
  for (int Nb = 0; Nb <= 4; Nb++) {
    Bot[Nb] = digitalRead(Port_A[Nb]); //obtém o valor das portas digitais e guarda em Bot[]
  }
  if (Bot[0] == HIGH && Bot[2] == HIGH) { //frente + direita
    if (Tempo_1.repeat()) { //gerador de repetições
      Polo = !Polo; //inverte o estado atual de polo
    }
    digitalWrite(Port_D[0], HIGH);
    digitalWrite(Port_D[1], LOW);
    digitalWrite(Port_D[2], Polo); //define na porta digital o valor alterado de polo
    digitalWrite(Port_D[3], LOW);
  } else if (Bot[0] == HIGH && Bot[3] == HIGH) { //frente + Esquerda
    if (Tempo_1.repeat()) { //gerador de repetições
      Polo = !Polo;//inverte o estado atual de polo
    }
    digitalWrite(Port_D[0], Polo);//define na porta digital o valor alterado de polo
    digitalWrite(Port_D[1], LOW);
    digitalWrite(Port_D[2], HIGH);
    digitalWrite(Port_D[3], LOW);
  } else if (Bot[1] == HIGH && Bot[2] == HIGH) { //ré + direita
    if (Tempo_1.repeat()) { //gerador de repetições
      Polo = !Polo;//inverte o estado atual de polo
    }
    digitalWrite(Port_D[0], LOW);
    digitalWrite(Port_D[1], HIGH);
    digitalWrite(Port_D[2], LOW);
    digitalWrite(Port_D[3], Polo);//define na porta digital o valor alterado de polo
  } else if (Bot[1] == HIGH && Bot[3] == HIGH) { //ré + esquerda
    if (Tempo_1.repeat()) { //gerador de repetições
      Polo = !Polo;//inverte o estado atual de polo
    }
    digitalWrite(Port_D[0], LOW);
    digitalWrite(Port_D[1], Polo);//define na porta digital o valor alterado de polo
    digitalWrite(Port_D[2], LOW);
    digitalWrite(Port_D[3], HIGH);
  } else if (Bot[0] == HIGH) { //frente
    digitalWrite(Port_D[0], HIGH);
    digitalWrite(Port_D[1], LOW);
    digitalWrite(Port_D[2], HIGH);
    digitalWrite(Port_D[3], LOW);
  } else if (Bot[1] == HIGH) { //ré
    digitalWrite(Port_D[0], LOW);
    digitalWrite(Port_D[1], HIGH);
    digitalWrite(Port_D[2], LOW);
    digitalWrite(Port_D[3], HIGH);
  } else if (Bot[2] == HIGH) { //Direita
    digitalWrite(Port_D[0], HIGH);
    digitalWrite(Port_D[1], LOW);
    digitalWrite(Port_D[2], LOW);
    digitalWrite(Port_D[3], HIGH);
  } else if (Bot[3] == HIGH) { //esquerda
    digitalWrite(Port_D[0], LOW);
    digitalWrite(Port_D[1], HIGH);
    digitalWrite(Port_D[2], HIGH);
    digitalWrite(Port_D[3], LOW);
  } else { //desliga todas as portas
    digitalWrite(Port_D[0], LOW);
    digitalWrite(Port_D[1], LOW);
    digitalWrite(Port_D[2], LOW);
    digitalWrite(Port_D[3], LOW);
  }
  if (Bot[4] == HIGH) { //inicia contagem se o botão de ação for pressionado
    if (Tempo_2.repeat(2000)) { // Delay de tempo que se repete a cada 1 milisegundo
      contagem++; //almenta o valor de "contagem" até no maximo 2 segundos
    }
    if (contagem >= 1998) { //verifica se o botão ficou pressionado tempo suficiente
      digitalWrite(Port_D[5], HIGH); //liga a bomba de agua
      if (Tempo_3.repeat()) { //delay que se repete em um tempo personalizado
        alertaFarol = !alertaFarol; //altera o estado de "alertaFarol" simuntaneamente
      }
      digitalWrite(Port_D[6], alertaFarol); //liga/desliga o led principal varias vezes
    }
  } else {
    if (contagem <= 1997 && contagem > 1) { //verifica se o valor é menor que o valor limite
      estadoFarol = !estadoFarol; //altera o estado
    }
    digitalWrite(Port_D[5], LOW); //desliga a bomba de agua
    digitalWrite(Port_D[6], estadoFarol); // liga/desliga o led principal
    contagem = 0; //reseta os valores de contagem
    Tempo_2.repeatReset(); //reseta o tempo de contagem
  }
}