#include 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; } }