Añadir control remoto a nuestros proyectos con ESP32 abre un abanico de posibilidades pues de necesitar una multitud de puertos GPIO si usáramos pulsadores convencionales, pasamos con un único GPIO a poder controlar desde menús en pantalla hasta activar relés a distancia. Sin embargo, lo que parece una conexión simple de tres pines puede esconder varios desafíos técnicos, especialmente si intentamos reciclar componentes de aparatos antiguos.
En este artículo, veremos cómo pasar de un receptor IR reciclado a una solución fiable con el sensor HX1838, optimizando el código para que ocupe el mínimo espacio en la memoria de nuestro microcontrolador.
1. El desafío del receptor reciclado
Es muy común intentar aprovechar receptores IR de vídeos o televisores antiguos. Aunque suelen tener tres pines (VCC, GND y OUT), presentan varios inconvenientes:
- Pinout no estándar: El orden de los pines varía según el fabricante.
- Voltaje de salida: Muchos operan a 5V. El ESP32 no es tolerante a 5V en sus entradas, lo que puede dañar el GPIO si no se tiene cuidado.
- Señal sucia: Los componentes antiguos pueden degradarse, ofreciendo una señal que la librería de Arduino no logra decodificar.
Consejo técnico: Si dispones de un osciloscopio y a la salida del receptor no ves una ráfaga de pulsos (tren de ondas que baja de 3.3V a 0V) al pulsar el mando, el receptor no está enviando señal útil.
2. La solución fiable: Sensor HX1838

Tras las pruebas, la opción más estable es utilizar un sensor específico como el HX1838 (o sus variantes VS1838B / TSOP1838). Estos sensores ya están preparados para entregar una señal digital limpia y funcionan perfectamente a 3.3V. Además, estos modulos son bastante económicos y suelen ir acompañados de un mando funcional
Esquema de conexión al ESP32
Para no interferir con otros periféricos (como la pantalla o sensores DHT), utilizaremos los pines de «solo entrada» del ESP32, que son ideales para esta tarea:
- VCC: Conectar a 3.3V.
- GND: Conectar a tierra común.
- OUT: Conectar al GPIO34 (o GPIO35).
- Resistencia Pull-up: Se recomienda colocar una resistencia de 10kΩ entre el pin OUT y 3.3V para mantener la señal estable en reposo. No es necesariamente obligatorio su integración con el nuevo sensor.
3. Código Arduino Optimizado (Mínimo espacio)
Si tu proyecto ya está muy cargado de funciones, no querrás que la librería IR consuma toda la memoria. Podemos optimizarla para que solo reconozca el protocolo NEC (el más común en mandos chinos y universales).
Configuración del entorno
Crea un archivo llamado build_opt.h en la carpeta de tu proyecto con este contenido para desactivar protocolos innecesarios:
C++
-DIR_ENABLE_DEFAULT=false-DDECODE_NEC=true
Con eso apagas los protocolos por defecto y dejas solo NEC en recepción. DECODE_NEC existe en la librería y por defecto sigue el valor global _IR_ENABLE_DEFAULT_, así que este ajuste es la forma correcta de recortarla.
Sketch mínimo de lectura
Este código permite mapear las teclas de tu mando y utilizarlas para navegar por menús:
C++
#include <Arduino.h>#include <IRremoteESP8266.h>#include <IRrecv.h>#define IR_PIN 34IRrecv irrecv(IR_PIN);decode_results results;enum IRKey : uint8_t { IR_NONE = 0, IR_1, IR_2, IR_3, IR_4, IR_5, IR_6, IR_7, IR_8, IR_9, IR_STAR, IR_HASH, IR_OK, IR_UP, IR_LEFT, IR_OK2, IR_RIGHT, IR_DOWN};static inline IRKey readIRKey() { if (!irrecv.decode(&results)) return IR_NONE; const uint32_t code = (uint32_t)results.value; irrecv.resume(); switch (code) { case 0xFFA25D: return IR_1; case 0xFF629D: return IR_2; case 0xFFE21D: return IR_3; case 0xFF22DD: return IR_4; case 0xFF02FD: return IR_5; case 0xFFC23D: return IR_6; case 0xFFE01F: return IR_7; case 0xFFA857: return IR_8; case 0xFF906F: return IR_9; case 0xFF6897: return IR_STAR; case 0xFFB04F: return IR_HASH; case 0xFF9867: return IR_0; case 0xFF18E7: return IR_UP; case 0xFF10EF: return IR_LEFT; case 0xFF38C7: return IR_OK; case 0xFF5AA5: return IR_RIGHT; case 0xFF4AB5: return IR_DOWN; default: return IR_NONE; }}void setup() { pinMode(IR_PIN, INPUT); irrecv.enableIRIn();}void loop() { IRKey key = readIRKey(); if (key == IR_NONE) return; // Aquí integras con tu dispositivo: // if (key == IR_UP) ... // if (key == IR_DOWN) ... // if (key == IR_OK ) ...}
Conclusión
Aunque el reciclaje es parte del espíritu maker, en el caso de los receptores IR, la baja fiabilidad puede hacernos perder horas de diagnóstico. Por menos de lo que cuesta un café, un sensor HX1838 nuevo nos garantiza una respuesta inmediata y una integración limpia en nuestros proyectos con ESP32.

Deja un comentario