#define IR 11 //Pin al que va conectado nuestro receptor de infrarrojos.
long duracion[32]; //array que contiene la duracion de cada pulso en microsegundos (uS)
int x = 0; //Contador para moverse por las distintas variables de los arrays
int pulso_comienzo; //En esta variable se almacena el valor del pulso de inicio de 4,5mS
unsigned long codigo_tecla = 0; //Valor de la tecla pulsada convertido de binario a decimal
/********************************************************************************************/
/********************************************************************************************/
// CONFIGURACION DEL MICROPROCESADOR
void setup() {
Serial.begin(9600);
}
void loop() {
if (digitalRead(IR) == 0) //Esperamos que se pulse una tecla
{ //PASO 1: DETECCION DEL PULSO DE INICIO DE SECUENCIA (4,5mS)
pulso_comienzo = pulseIn(IR, HIGH);
if (pulso_comienzo > 4000 && pulso_comienzo < 5000) //...comprobamos si es el pulso de comienzo de 4,5mS (inicio de secuencia)
{
lecturaCodigoIr(); //Funcion que lee la tecla pulsada y la almacena en la variable (codigo_tecla)
}
}
//Accion a realizar segun la tecla pulsada.
Serial.println(codigo_tecla, HEX);
codigo_tecla = 0;
}
// SUBRUTINAS
//Subrutina que lee que tecla del mando a distancia se ha pulsado y
//la almacena en la variable codigo_tecla
void lecturaCodigoIr()
{ //PASO 2: CRONOMETRAJE DE TIEMPOS DE CADA PULSO(uS) (empezando desde el bit de la derecha)
for (x = 31; x >= 0; x--) {
duracion[x] = pulseIn(IR, HIGH); //Duracion de cada pulso (uS)
}
//PASO 3: SEGUN EL TIEMPO DE CADA PULSO, DETERMINAMOS SI ES UN 0 O UN 1 LOGICO (Ver protocolo NEC)
for (x = 31; x >= 0; x--)
{
if (duracion[x] > 500 && duracion[x] < 700) //Si el pulso dura entre 500 y 700uS...
{
bitClear(codigo_tecla, x); //... es un 0 logico
}
if (duracion[x] > 1500 && duracion[x] < 1750) //Si el pulso dura entre 1500 y 1750uS
{
bitSet(codigo_tecla, x); //... es un 1 logico
}
}
}
//FIN SUBRUTINAS ************************************************************************************/