Aquí el código totalmente en wiring… Hay mejores formas de programarlo, pero lo he hecho sencillo ya que el tiempo de proceso no es un problema…
//SHIFT LIGHTS
//By Igor Real
//13-09-09
#define Primera_ON 5500
#define Segunda_ON 6000
#define Tercera_ON 6500
#define Todas_ON 7000
#define OVERREV 8000
//----------------------------
#define Third_Red 13
#define Third_Blue 12
#define Third_Green 11
//----------------------------
#define Second_Red 10
#define Second_Blue 9
#define Second_Green 8
//----------------------------
#define First_Red 5
#define First_Blue 6
#define First_Green 7
volatile unsigned long cont_rpm;
void setup()
{
pinMode(Third_Red, OUTPUT);
pinMode(Third_Green, OUTPUT);
pinMode(Third_Blue, OUTPUT);
pinMode(Second_Red, OUTPUT);
pinMode(Second_Green, OUTPUT);
pinMode(Second_Blue, OUTPUT);
pinMode(First_Red, OUTPUT);
pinMode(First_Green, OUTPUT);
pinMode(First_Blue, OUTPUT);
//-----------------------------------------
digitalWrite(Third_Red,LOW);
digitalWrite(Third_Green,LOW);
digitalWrite(Third_Blue,LOW);
digitalWrite(Second_Red,LOW);
digitalWrite(Second_Green,LOW);
digitalWrite(Second_Blue,LOW);
digitalWrite(First_Red,LOW);
digitalWrite(First_Green,LOW);
digitalWrite(First_Blue,LOW);
//-----------------------------------------
pinMode(2,INPUT);
attachInterrupt(0, rpm, RISING);
Serial.begin(9600);
}
void rpm()
{
cont_rpm++;
}
void loop()
{
static unsigned long rpm_ant;
static unsigned long t_anterior;
static float rpm_actuales;
rpm_ant=cont_rpm;
t_anterior=millis();
delay(100);
rpm_actuales=(cont_rpm-rpm_ant)/(2.0*(millis()-t_anterior)/60000);
Serial.println(rpm_actuales);
if (rpm_actuales<Primera_ON){
digitalWrite(Third_Red,LOW);
digitalWrite(Third_Green,LOW);
digitalWrite(Third_Blue,LOW);
digitalWrite(Second_Red,LOW);
digitalWrite(Second_Green,LOW);
digitalWrite(Second_Blue,LOW);
digitalWrite(First_Red,LOW);
digitalWrite(First_Green,LOW);
digitalWrite(First_Blue,LOW);
}else if((rpm_actuales>=Primera_ON) && (rpm_actuales <Segunda_ON)){
digitalWrite(First_Green,HIGH);
digitalWrite(Third_Red,LOW);
digitalWrite(Third_Green,LOW);
digitalWrite(Third_Blue,LOW);
digitalWrite(Second_Red,LOW);
digitalWrite(Second_Green,LOW);
digitalWrite(Second_Blue,LOW);
digitalWrite(First_Red,LOW);
digitalWrite(First_Blue,LOW);
}else if ((rpm_actuales>=Segunda_ON) && (rpm_actuales <Tercera_ON)){
digitalWrite(Second_Green,HIGH);
digitalWrite(First_Green,HIGH);
digitalWrite(Third_Red,LOW);
digitalWrite(Third_Green,LOW);
digitalWrite(Third_Blue,LOW);
digitalWrite(Second_Red,LOW);
digitalWrite(Second_Blue,LOW);
digitalWrite(First_Red,LOW);
digitalWrite(First_Blue,LOW);
}else if ((rpm_actuales>=Tercera_ON) && (rpm_actuales <Todas_ON)){
digitalWrite(Third_Blue,HIGH);
digitalWrite(First_Green,HIGH);
digitalWrite(Second_Green,HIGH);
digitalWrite(Third_Red,LOW);
digitalWrite(Third_Green,LOW);
digitalWrite(Second_Red,LOW);
digitalWrite(Second_Blue,LOW);
digitalWrite(First_Red,LOW);
digitalWrite(First_Blue,LOW);
}else if ((rpm_actuales>=Todas_ON) && (rpm_actuales <OVERREV)){
digitalWrite(Third_Red,HIGH);
digitalWrite(Second_Red,HIGH);
digitalWrite(First_Red,HIGH);
digitalWrite(Third_Green,LOW);
digitalWrite(Third_Blue,LOW);
digitalWrite(Second_Green,LOW);
digitalWrite(Second_Blue,LOW);
digitalWrite(First_Green,LOW);
digitalWrite(First_Blue,LOW);
}else if (rpm_actuales>=OVERREV){
digitalWrite(Third_Red,LOW);
digitalWrite(Third_Green,LOW);
digitalWrite(Second_Red,LOW);
digitalWrite(Second_Green,LOW);
digitalWrite(First_Red,LOW);
digitalWrite(First_Green,LOW);
digitalWrite(Third_Blue,HIGH);
digitalWrite(Second_Blue,HIGH);
digitalWrite(First_Blue,HIGH);
delay(1000);
}
}