#include <InvertedTM1638.h>
InvertedTM1638 module(8, 9, 7, true, 7);
int rpm_maxima = 8800;
boolean parpadea = false;
long previousMillis = 0;
long interval = 50;
long intervalPit = 100;
long intervalo_v = 500;
long VMillis = 0;
int Button;
int ModeIzquierda = 0;
int ModeDerecha = 0;
int Agua;
int Oil;
int Fuel;
int Gear;
int Rpm;
int Speed;
int ultima_vuelta_tiempo = -1;
int ultima_vuelta_tiempo_m = -1;
int PitLine = 0;
unsigned long currentMillis;
unsigned long currentMillisV;
boolean encendido_tiempo = false;
int numero_veces = 0;
int pos_speed = 5;
int pos_rpm = 0;
int pos_gear = 0;
int pos_fuel = 0;
int pos_agua = 0;
int pos_oil = 0;
int leds[] = {0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000100000000, 0b0000001100000000, 0b0000011100000000, 0b0000111100000000, 0b0001111100000000, 0b0011111100000000, 0b0111111100000000, 0b1111111100000000};
void setup()
{
Serial.begin(38500);
}
void loop()
{
while(Serial.available() > 1)
{
char comandos = Serial.read();
if (comandos == 'S') Speed = Serial.parseInt();
if (comandos == 'R') Rpm = Serial.parseInt();
if(comandos == 'G') Gear = Serial.parseInt();
if(comandos == 'A') Agua = Serial.parseInt();
if(comandos == 'O') Oil = Serial.parseInt();
if(comandos == 'F') Fuel = Serial.parseInt();
if(comandos == 'C') Button = Serial.parseInt();
if(comandos == 'P') PitLine = Serial.parseInt();
if(comandos == 'M') rpm_maxima = Serial.parseInt();
if(comandos == 'T') ultima_vuelta_tiempo = Serial.parseInt();
if(comandos == 'N') ultima_vuelta_tiempo_m = Serial.parseInt();
}
if(ultima_vuelta_tiempo > 0 && ultima_vuelta_tiempo_m > 0)
{
rpm_luz(Rpm);
currentMillisV = millis();
if(currentMillisV - VMillis > intervalo_v)
{
VMillis = currentMillisV;
if(encendido_tiempo)
{
numero_veces++;
encendido_tiempo = false;
switch(String(ultima_vuelta_tiempo).length())
{
case 2:
module.setDisplayToString("00"+String(ultima_vuelta_tiempo)+String(ultima_vuelta_tiempo_m), 0b01010000, 1);
break;
case 3:
module.setDisplayToString("0"+String(ultima_vuelta_tiempo)+String(ultima_vuelta_tiempo_m), 0b01010000, 1);
break;
case 4:
module.setDisplayToString(String(ultima_vuelta_tiempo)+String(ultima_vuelta_tiempo_m), 0b01010000, 1);
break;
}
}
else
{
encendido_tiempo = true;
module.clearDisplay();
}
if(numero_veces >
{
numero_veces = 0;
ultima_vuelta_tiempo = -1;
ultima_vuelta_tiempo_m = -1;
}
}
}
else
{
switch(PitLine)
{
case 0:
//currentMillisButtons = millis();
// if(currentMillisButtons - ButtonsMillis > intervalo_boton) //if
// {
switch(Button)
{
case 1:
Button = 0;
// ButtonsMillis = currentMillisButtons;
ModeIzquierda++;
module.clearDisplay();
break;
case 2:
Button = 0;
// ButtonsMillis = currentMillisButtons;
ModeDerecha++;
module.clearDisplay();
break;
} //switch(Button)
// } // if(currentMillis - ButtonsMillis > intervalo_boton)
switch(ModeIzquierda)
{
case 0:
pos_rpm = 0;
Read_Rpm();
break;
case 1:
pos_gear = 0;
Read_Gear();
break;
case 2:
pos_fuel = 0;
Read_Fuel();
break;
case 3:
pos_agua = 0;
Read_Agua();
break;
case 4:
pos_oil = 0;
Read_Oil();
break;
case 5:
pos_speed = 0;
Read_Speed();
break;
case 6:
ModeIzquierda = 0;
Read_Rpm();
break;
} //switch(ModeIzquierda)
switch(ModeDerecha)
{
case 0:
pos_speed = 4;
Read_Speed();
break;
case 1:
pos_gear = 4;
Read_Gear();
break;
case 2:
pos_fuel = 4;
Read_Fuel();
break;
case 3:
pos_agua = 4;
Read_Agua();
break;
case 4:
pos_oil = 4;
Read_Oil();
break;
case 5:
pos_rpm = 4;
Read_Rpm();
break;
default:
ModeDerecha =0;
Read_Speed();
break;
} //switch(ModeDerecha)
rpm_luz(Rpm);
break;
case 1:
module.setDisplayToString("LANE", 0, 0);
rpm_luz_pitline();
pos_speed = 4;
Read_Speed();
break;
} //switch(PitLine)
}//else tiempo
} // loop
void Read_Gear()
{
switch(Gear)
{
case 0:
module.setDisplayToString(" N", 0, pos_gear);
//module.clearDisplayDigit(pos_gear+2, false);
break;
case -1:
module.setDisplayToString(" R",0 ,pos_gear);
module.clearDisplayDigit(pos_gear+2, false);
module.clearDisplayDigit(pos_gear+3, false);
break;
case 9:
module.setDisplayToString(" R",0 ,pos_gear);
module.clearDisplayDigit(pos_gear+2, false);
module.clearDisplayDigit(pos_gear+3, false);
break;
default:
module.setDisplayToString(" "+String(Gear),0 ,pos_gear);
module.clearDisplayDigit(pos_gear+2, false);
module.clearDisplayDigit(pos_gear+3, false);
break;
}
}
void Read_Oil()
{
switch(String(Oil).length()+1)
{
case 2:
module.clearDisplayDigit(pos_oil+2, false);
module.clearDisplayDigit(pos_oil+3, false);
break;
case 3:
module.clearDisplayDigit(pos_oil+3, false);
break;
default:
break;
}
module.setDisplayToString("O", 0b10000000, pos_oil);
module.setDisplayToString(String(Oil), 0, pos_oil+1);
}
void Read_Agua()
{
switch(String(Agua).length()+1)
{
case 2:
module.clearDisplayDigit(pos_agua+2, false);
module.clearDisplayDigit(pos_agua+3, false);
break;
case 3:
module.clearDisplayDigit(pos_agua+3, false);
break;
default:
break;
}
module.setDisplayToString("A", 0b10000000, pos_agua);
module.setDisplayToString(String(Agua), 0, pos_agua+1);
}
void Read_Fuel()
{
switch(String(Fuel).length()+1)
{
case 2:
module.clearDisplayDigit(pos_fuel+2, false);
module.clearDisplayDigit(pos_fuel+3, false);
break;
case 3:
module.clearDisplayDigit(pos_fuel+3, false);
break;
default:
break;
}
module.setDisplayToString("F", 0b10000000, pos_fuel);
module.setDisplayToString(String(Fuel), 0, pos_fuel+1);
}
void Read_Speed()
{
if(Speed >= 100)
{
module.setDisplayToString(String(Speed), 0, pos_speed+1); //aquí va tu funcion
module.clearDisplayDigit(pos_speed, false);
}
if(Speed >= 10 && Speed < 100)
{
module.setDisplayToString(String(Speed), 0, pos_speed+2); //aquí va tu funcion
module.clearDisplayDigit(pos_speed, false);
module.clearDisplayDigit(pos_speed+1, false);
}
if(Speed >= 0 && Speed <10)
{
module.setDisplayToString(String(Speed), 0, pos_speed+3); //aquí va tu funcion
module.clearDisplayDigit(pos_speed, false);
module.clearDisplayDigit(pos_speed+1, false);
module.clearDisplayDigit(pos_speed+2, false);
}
}
void Read_Rpm()
{
switch(String(Rpm).length())
{
case 1:
module.clearDisplayDigit(pos_rpm+1, false);
module.clearDisplayDigit(pos_rpm+2, false);
module.clearDisplayDigit(pos_rpm+3, false);
break;
case 2:
module.clearDisplayDigit(pos_rpm+2, false);
module.clearDisplayDigit(pos_rpm+3, false);
break;
case 3:
module.clearDisplayDigit(pos_rpm+3, false);
break;
default:
break;
}
module.setDisplayToString(String(Rpm),0 ,pos_rpm);
}
void rpm_luz_pitline()
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > intervalPit)
{
previousMillis = currentMillis;
if(parpadea == false)
{
module.setLEDs(0b1111111100000000);
parpadea = true;
}
else
{
module.setLEDs(leds[0]);
parpadea = false;
}
}
}
void rpm_luz(int rpm_actual)
{
int calculo = map(rpm_actual, 0, rpm_maxima, 0, 100);
if(calculo >= 50 && calculo < 95)
{
int calculo_tmp = map(calculo, 50, 95, 0, 10);
module.setLEDs(leds[calculo_tmp]);
}
if(calculo >=96)
{
//calculo = map(calculo, 50, 100, 0, 13);
currentMillis = millis();
if(currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
if(parpadea == false)
{
module.setLEDs(leds[10]);
parpadea = true;
}
else
{
module.setLEDs(leds[0]);
parpadea = false;
}
}
}
}