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
}

}