DecoMCH2600.ino
#include <LowPower.h>
int contador = 0; // contara los pulsos recividos
int pulsoini = 0; // para marcar los microsegundos donde empieza un pulso
int pulsodur = 0; // para marcar los microsegundos que dura el pulso
boolean enpulso = 0;  // si estamos en un pulso
int numval = 0;
bool pulsores=0;
int valfin = 0;  // codigo que dan del tren de pulsos
int val = 0;
 
int ledPin1 = 13;  // salida control bit mayor peso
int ledPin2 = 12;  // salida control medio peso
int ledPin3 = 11;  // salida de control de menor peso
int pinerr = 10;   // salida de error para TC_FUNC (pulso bajo pide datos de nuevo)
int pinon = 9;     // salida para chip enable del conmutador
int pinSysOn = 8; // Entrada que nos dice si el equipo está encendido
bool IsSysOn = 1;
int pinCDon = 7; //para apagar el CD cuando no esta seleccionado
int pinRadioOn = 6; //para apagar el CD cuando no esta seleccionado
// Empieza setup **********************************************************
void setup() {
// Serial.begin(115200); //Podemos activar esta y todas las serial si queremos monitorizar valores por serie
  attachInterrupt(digitalPinToInterrupt(3), contar, RISING);
//  Serial.println("Empezando....");
//  Serial.println("");
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(pinerr, OUTPUT);
  pinMode(pinon, OUTPUT);
  pinMode(pinSysOn, INPUT);
  digitalWrite(pinerr, HIGH); 
  pinMode(pinCDon, OUTPUT);
  pinMode(pinRadioOn, OUTPUT);
}
// Acaba setup ************************************************************
void loop() 
{
 
 pulsodur = micros() - pulsoini;
/*  
Serial.print("Ps: ");
Serial.print(contador); 
Serial.print(" NV: ");
Serial.print(numval);
Serial.print(" V");
Serial.println(valfin);
// */
// Detectamos CD   
if (valfin == 7) 
  {
  digitalWrite(ledPin1, HIGH); 
  digitalWrite(ledPin2, LOW); 
  digitalWrite(ledPin3, HIGH);
  digitalWrite(pinon, LOW);
  digitalWrite(pinCDon, HIGH);
  digitalWrite(pinRadioOn, LOW);
  }
// Detectamos Tuner   
else if (valfin == 14) 
  {
  digitalWrite(ledPin1, LOW); 
  digitalWrite(ledPin2, LOW); 
  digitalWrite(ledPin3, HIGH);
  digitalWrite(pinon, LOW);
  digitalWrite(pinCDon, LOW);
  digitalWrite(pinRadioOn, HIGH);
  }
// Detectamos Phono  
else if (valfin == 15) 
  {
  digitalWrite(ledPin1, LOW); 
  digitalWrite(ledPin2, HIGH); 
  digitalWrite(ledPin3, LOW);
  digitalWrite(pinon, LOW);
  digitalWrite(pinCDon, LOW);
  digitalWrite(pinRadioOn, LOW);
  }
// Detectamos Tape  
else if (valfin == 13) 
  {
  digitalWrite(ledPin1, LOW); 
  digitalWrite(ledPin2, HIGH); 
  digitalWrite(ledPin3, HIGH);
  digitalWrite(pinon, LOW);
  digitalWrite(pinCDon, LOW);
  digitalWrite(pinRadioOn, LOW);
  }
// Detectamos DAT   
  else if (valfin == 6) 
  {
  digitalWrite(ledPin1, HIGH); 
  digitalWrite(ledPin2, LOW); 
  digitalWrite(ledPin3, LOW);
  digitalWrite(pinon, LOW);
  digitalWrite(pinCDon, LOW);
  digitalWrite(pinRadioOn, LOW);
  }
// si  hay otro valor es error encenderemos lo que podamos y pasamos un 
// pulso bajo a TP_FUNC para que el qeuipo vuelva a mandar el código.
else 
  {
  digitalWrite(ledPin1, LOW); 
  digitalWrite(ledPin2, LOW); 
  digitalWrite(ledPin3, LOW);
  digitalWrite(pinon, HIGH);
  digitalWrite(pinCDon, LOW);
  digitalWrite(pinerr, LOW);
  digitalWrite(pinRadioOn, LOW);
  delay(500);
  digitalWrite(pinerr, HIGH);
  delay(500);
  }
// El siguiente if es porque cuando apagamos el equipo manda solo 8 pulsos que no completan la 
// instruccion de estado que manda el equipo y apagamos los led y el arduino para no consumir
IsSysOn = digitalRead(pinSysOn);
if (IsSysOn == 0)  
  {
  digitalWrite(ledPin1, LOW); 
  digitalWrite(ledPin2, LOW); 
  digitalWrite(ledPin3, LOW);
  digitalWrite(pinon, HIGH);
  digitalWrite(pinCDon, LOW);
  digitalWrite(pinerr, LOW);
  digitalWrite(pinRadioOn, LOW);
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); //lo manda a dormir 8s salvo que detecte una interrupt
  }
 else  digitalWrite(pinerr, HIGH); 
}
// Acaba loop*************************************************************************
 
// funcion que detecta y cuenta los pulsos que hay y a la que llamamos desde la int
// cuando detecta bajada en pin3
void contar(){
  IsSysOn = 0; // Lo pongo pues sino tarda 8seg en detectar encendido
  pulsodur = micros() - pulsoini;
  pulsoini = micros();
  enpulso = 1;  
  if (pulsodur > 3500 || pulsodur < 0) // si llevamos ese tiempo sin variar es que no hay pulsos
     {
     pulsores = 0;
     enpulso = 0;
     contador = 0;
     }
  else if (pulsodur > 1500)  pulsores = 0; //los pulsos bajos duran como 1700 microseg
  else if (pulsodur > 1000) pulsores = 1; //los pulsos altos duran como 1200 microseg    
  if (enpulso == 1) contador ++;
 
// Sólo damos valor a los bit a partir del siguiente:  
  if (contador > 12) 
      {
      val = val << 1;
      val = val + pulsores;
      }   
// vamos contando pulsos hasta los 16 que forman el byte (contando el 0)  
  if (contador > 15)
      {
        contador = 0;
        numval ++;
        enpulso = 0; 
        valfin = val;
        val = 0;       
       }
}