Como leer infrarrojos sin necesidad de libreria

Buenas tardes amigos. Que bonito es usar la libreria de infrarrojos hasta que usas otra libreria en el mismo programa y te das cuenta que muchas veces las librerias no son compatibles entre ellas. Con los infrarrojos me ha pasado eso mas de una vez, asi que en uno de mis momentos de aburrimiento creativo me dio por hacer una funcion (subrutina) que interpreta cual tecla del mando a distancia se ha pulsado, sin necesidad de libreria. Asi que es una funcion, es tan simple como copiar-pegar y llamarla desde el void loop.
A lo que voy es, que no soy un gran experto en programacion y queria publicar el programa para que me digais si se puede mejorar, si es una tonteria como un pino, o si tiene algun fallo, porque quiero publicarla en una web y no vaya a tener por ahi alguna metedura de pata oculta.
Si alguno de vosotros tiene tiempo y ganas, podria echarle un vistazo y soy todo oidos para escuchar mejoras y sugerencias. Y ya puestos, si alguno tiene mando a distancia y receptor y lo prueba, hasta me pego una borrachera si le funciona. A mi desde luego me funciona a las mil maravillas, pero es con este mando a distancia (protocolo NEC). De todas formas, adaptar el programa a otros mandos no creo que fuera complicado, ni necesario :smiley:
Si os sirve para vuestros proyectos ya sabeis CTRL+C —> CTRL+V :slight_smile:

Para que entendais el programa, quien no este muy familiarizado con el protocolo NEC, primero envia un pulso negativo de unos 9mS, seguido de otro pulso positivo de unos 4,5mS. A partir de ahi vienen 32 pulsos cuya duracion es de 600uS en el caso del 0 logico, o unos 1.6mS en el caso del 1 logico.

Asi que el algoritmo quedaria mas o menos asi…
1º Esperar pulso negativo de 9mS
2º Cuando se produzca, cronometrar el segundo pulso (4.5mS)
3º Cronometrar los 32 pulsos siguientes (protocolo NEC consta de 32 bits)
4º En funcion del tiempo de cada pulso, asignarle a cada bit un 0 o 1 segun corresponda (prot. NEC)
5º Una vez convertidos todos los tiempos a bits (32 bits) reducir el numero de bits para trabajar
6º Nos quedamos con los bits 17 al 21 y el 23. 6 bits cuyas combinaciones no se repiten y son suficientes para distinguir las 21 teclas.
7º Convertimos los 6 bits a su valor decimal por el metodo de potencias de 2
8º El resultado lo almacenamos en una variable, de tal forma que a cada tecla le corresponde un unico numero que la identifica.

Cualquier comentario es bienvenido.

IR_sin_libreria.ino (5.36 KB)

Hola, lozanolopez. En primer lugar, enhorabuena por haber finalizado tu código y haber hecho funcionar tu idea. Es gratificante conseguir que el cacharro haga lo que tú quieres, ¿verdad?

Partiendo de lo anteriormente dicho, ahora ya "critico" dura y friamente tu trabajo.

Pros: - No utiliza librerías (eso no es importante, y de hecho, lo suyo sería hacer una librería con ella). - No utiliza interrupciones, con lo que no va a interferir con otras librerías.

Contras: - Durante el tiempo de lectura, permanece en la función, con lo que la ejecución del código principal se interrumpe. - Si la duración de un ciclo loop no es muy corta (más de 9ms de duración), es muy probable que no se "escuche" el inicio de pulsación y por lo tanto se pierda el código enviado. Además durante el tiempo que dura la recepción no se hace nada más.

Por lo tanto, no resulta conflictiva con otras librerías, pero para códigos que no sean breves no va a ser efectiva.

La librería IrRemote tiene la desventaja de que utiliza una interrupción de pin y un timer, y la ventaja de que va a detectar las pulsaciones en cualquier momento de ejecución del programa, y que durante la propia pulsación continúa ejecutando el programa, pues sólo interrumpe, anota el pulso y regresa al programa principal. Si puedes disponer de los recursos que utiliza, es muy efectiva, salvo tal vez la decodificación final del comando, al no estar enfocada exclusivamente a un protocolo.

Yo he realizado una vez una opción intermedia, utilizando sólo la interrupción de pin, y en lugar de un timer medir el pulso con millis y conseguí hacerlo funcionar decentemente.

Gracias Noter. Supongo que al final sera como todos los programas. Dependiendo de cada programa se usara la libreria o no, ahora al menos hay dos posibilidades. Aun no lo he probado en un programa medianamente largo. Pero si es cierto que en determinadas situaciones puede no funcionar la funcion. Ya ire poniendo aqui observaciones y demas. ;)