//Definição de saídas para os LEDs
int LED1[3] = {4,0,2};
int LED2[3] = {5,17,16};
//Definição de entrada do botão(pino 14)
int botComp1 = 12;
int botComp2 = 14;
int botApres = 13;
//Definição das cores dos LEDs
int color[4][3] = {{0,255,0},{255,255,0},{255,0,0},{0,0,0}};
//verde color[0][k]
//amarelo color[1][k]
//vermelho color[2][k]
//Desligado color[3][k]
void setup() {
// put your setup code here, to run once:
//Definição de entradas e saídas
pinMode(botComp1, INPUT);
pinMode(botComp2, INPUT);
pinMode(botApres, INPUT);
for(int j =0;j<=2;j++)pinMode(LED1[j], OUTPUT);
for(int j =0;j<=2;j++)pinMode(LED2[j], OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
int ref = millis();
bool botaoApres = false;
// Parâmetros do debounce:
const int timeBounce = 30; //O bounce depende do tempo de estabilização. Assim, aqui presumi-se que depois de 10 ms as leituras estão estáveis.
int bounceApres = 0;
int bounceComp1 = 0;
int bounceComp2 = 0;
bool verifiApres = false;
bool verifiComp1 = false;
bool verifiComp2 = false;
//Loop principal, algum LEDS se apague:
do{
//Verificação de se o botão botApres foi pressionado
if(!digitalRead(botApres) == 1 && verifiApres == false)
{
verifiApres = true;
bounceApres = millis();
}
//Botão do apresentador com debounce
if(millis() - bounceApres > timeBounce && verifiApres == true)
{
//Botão do apresentador. Libera o acionamento dos LEDs pelos competidores (comp1 e comp2).
if(!digitalRead(botApres) == 1)
{
//Início
botaoApres = true;
//Fim
while(!digitalRead(botApres) == 1){
} // Prende a execução até que o botão pare de ser apertado. Assim, o código nao corre o risco de considerar duas vezes o mesmo pressionamento do botão.
// Reset dos parâmetros do debounce
bounceApres = 0;
verifiApres = false;
}
}
//Verificação de se o botão botComp1 foi pressionado
if(!digitalRead(botComp1) == 1 && verifiComp1 == false)
{
verifiComp1 = true;
bounceComp1 = millis();
}
//Botão do competidor 1 com debounce
if(millis() - bounceComp1 > timeBounce && verifiComp1 == true)
{
//Botão do competidor 1, com debounce. Aciona o LED1 assim que o botApres for pressionado
//Reseta o estado do LED1 depois de 5 segundos.
if(!digitalRead(botComp1) == 1 && botaoApres == true)
{
//Início
for(int i = 1; i <=8; i++)
{
for(int k = 0;k<=2;k++)digitalWrite(LED1[k], color[1][k]);
delay(333);
for(int k = 0;k<=2;k++)digitalWrite(LED1[k], color[3][k]);
if(i != 8) delay(333);
}
//Fim
botaoApres = false;
while(!digitalRead(botComp1) == 1){
} // Prende a execução até que o botão pare de ser apertado. Assim, o código nao corre o risco de considerar duas vezes o mesmo pressionamento do botão.
// Reset dos parâmetros do debounce
bounceComp1 = 0;
verifiComp1 = false;
}
}
//Verificação de se o botão botComp2 foi pressionado
if(!digitalRead(botComp2) == 1 && verifiComp2 == false)
{
verifiComp2 = true;
bounceComp2 = millis();
}
//Botão do competidor 2 com debounce
if(millis() - bounceComp2 > timeBounce && verifiComp2 == true)
{
//Botão do competidor 2, com debounce. Aciona o LED2 assim que o botApres for pressionado
//Reseta o estado do LED2 depois de 5 segundos.
if(!digitalRead(botComp2) == 1 && botaoApres == true)
{
//Início
for(int i = 1; i <=8; i++)
{
for(int k = 0;k<=2;k++)digitalWrite(LED2[k], color[1][k]);
delay(333);
for(int k = 0;k<=2;k++)digitalWrite(LED2[k], color[3][k]);
if(i != 8) delay(333);
}
//Fim
botaoApres = false;
while(!digitalRead(botComp2) == 1){
} // Prende a execução até que o botão pare de ser apertado. Assim, o código nao corre o risco de considerar duas vezes o mesmo pressionamento do botão.
// Reset dos parâmetros do debounce
bounceComp2 = 0;
verifiComp2 = false;
}
}
}while(1 == 1);
}