El problema que descubres a medio proyecto

Quieres que tu proyecto con ESP32 obedezca a un control remoto, sin tener que cablear 10 pulsadores ni inventar un menú por Bluetooth. La aparente solución de fin de semana: desarmas un equipo viejo, sacas el receptor IR de tres pines del tablero y lo conectas. Compilas, subes, y… nada. O peor: a veces decodifica, a veces no, y otras devuelve códigos basura que nunca se repiten.

Este tutorial cubre lo que pasa entre esa primera frustración y un sistema que funciona estable: por qué los receptores reciclados fallan, qué sensor económico te resuelve el problema, cómo cablearlo al ESP32 sin quemarle un GPIO, y cómo configurar la librería de IR para que no se coma 30 KB de flash por incluir protocolos que nunca vas a usar.

Está inspirado en el artículo de Soloelectronicos.com, reorientado a la práctica chilena y con foco en optimización de memoria.

Receptor IR reciclado conectado al ESP32 con cables jumper

Por qué un receptor reciclado falla más de lo que parece

Los receptores IR de tres pines de un VCR, una radio o una TV antigua se ven idénticos al HX1838 que compras nuevo. Pero hay tres trampas técnicas que la mayoría no nota:

  1. Pinout no estandarizado. El orden VCC/GND/OUT cambia según el fabricante. Si te equivocas, prendes VCC en GND y el componente se calienta o muere silenciosamente.
  2. Voltaje de salida a 5 V. Muchos receptores antiguos operan a 5 V y entregan la señal demodulada también a 5 V. El ESP32 no es tolerante a 5 V en sus pines GPIO: un solo pulso a 5 V puede romper el pin (o todo el SoC).
  3. Componente degradado. Los filtros internos del receptor (que demodulan los pulsos a 38 kHz) se desgastan con los años. El síntoma es una señal "sucia": tren de pulsos con jitter, que la librería no puede mapear a ningún protocolo conocido.

Diagnóstico rápido sin osciloscopio: si tienes un multímetro con modo Hz/frecuencia, mide la salida del receptor mientras aprietas un botón del mando. Deberías ver pulsos a ~38 kHz. Si solo ves DC o ruido, el receptor está malo. Si tienes osciloscopio, espera ráfagas que bajen de 3.3 V a 0 V en patrones reconocibles. Nada de eso significa que va al tarro.

La solución: un sensor nuevo, barato y a 3.3 V

El HX1838 (o sus equivalentes VS1838B y TSOP1838) es un receptor IR moderno con filtros estables, alimentación de 3.3 a 5 V, y salida digital limpia. Cuesta menos de $1.000 CLP en el catálogo chileno y normalmente viene en kit con un control remoto NEC genérico, exactamente lo que necesitas para empezar.

ESP32 conectado al módulo HX1838 nuevo con su control remoto NEC

Hardware: cableado mínimo al ESP32

Tres cables y opcionalmente una resistencia:

HX1838 ESP32 Nota
VCC 3.3V NO 5V con el ESP32
GND GND tierra común
OUT GPIO 34 (también sirve GPIO 35)

¿Por qué GPIO 34?

Los pines 34, 35, 36 y 39 del ESP32 son "solo entrada": no pueden ser configurados como salida ni tienen pull-up/pull-down internos. Justo por eso son ideales para sensores de lectura: no compiten con otros periféricos del ESP32 (la pantalla por SPI, el bus I²C de un DHT, etc.) y no te equivocas escribiéndolos accidentalmente. Resérvalos siempre para señales digitales entrantes que no necesiten interrupciones complejas.

Resistencia pull-up de 10 kΩ (opcional)

Si usas el módulo HX1838 con su PCB, la resistencia pull-up ya viene integrada en placa. Si soldaste un HX1838 desnudo, agrega una resistencia de 10 kΩ entre OUT y 3.3 V: sin ella, la línea queda flotando entre pulsos y puedes leer ruido.

Software: librería IRremoteESP8266 optimizada

La librería estándar para IR en ESP32 es IRremoteESP8266. El problema: por defecto incluye decoders para 30+ protocolos (NEC, Sony, RC5, Panasonic, LG, Samsung, etc.) y eso pesa 30 a 50 KB de flash y RAM. La gran mayoría de controles remotos chinos baratos usan solo NEC. Si ya tienes un proyecto con WiFi + display + sensores, esos 30 KB pueden ser la diferencia entre compilar y no.

Activar SOLO el protocolo NEC

Crea un archivo llamado build_opt.h en la carpeta del proyecto (al lado del .ino) con este contenido:

C++
-DIR_ENABLE_DEFAULT=false
-DDECODE_NEC=true

IR_ENABLE_DEFAULT=false apaga todos los protocolos por defecto. DECODE_NEC=true activa explícitamente solo NEC. Resultado: la librería pasa de ~45 KB a ~8 KB de flash.

Sketch mínimo con mapeo a teclas

Este código mapea los 17 botones más comunes de un control remoto NEC genérico (1-9, 0, estrella, gato, OK, flechas) a un enum, listo para conectar con la lógica de tu proyecto:

C++
#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>

#define IR_PIN 34
IRrecv irrecv(IR_PIN);
decode_results results;

enum IRKey : uint8_t {
  IR_NONE = 0, IR_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_DOWN, IR_LEFT, IR_RIGHT
};

static 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 0xFF9867: return IR_0;
    case 0xFFB04F: return IR_HASH;
    case 0xFF18E7: return IR_UP;
    case 0xFF4AB5: return IR_DOWN;
    case 0xFF10EF: return IR_LEFT;
    case 0xFF5AA5: return IR_RIGHT;
    case 0xFF38C7: return IR_OK;
    default: return IR_NONE;
  }
}

void setup() {
  pinMode(IR_PIN, INPUT);
  irrecv.enableIRIn();
}

void loop() {
  IRKey key = readIRKey();
  if (key == IR_NONE) return;
  // tu lógica acá: navegar menús, controlar relés, ajustar valores, etc.
  // ejemplo: if (key == IR_OK) toggleRele();
}

Cómo saber los códigos de TU mando

Los códigos 0xFFA25D etc. son del mando NEC genérico que viene con el HX1838. Si quieres usar el control de tu TV o un mando distinto, agrega un Serial.printf("0x%X\n", code); antes del switch y lee los códigos de tu mando uno a uno desde el monitor serial.

Pruebas: confirmar que funciona

  1. Compila y sube el sketch al ESP32.
  2. Abre el monitor serial a 115200 baud.
  3. Apunta el mando hacia el HX1838 y aprieta un botón.
  4. Si todo está bien, vas a ver el código del botón en el monitor (si dejaste el Serial.printf de diagnóstico).

Si no ves nada:

  • Línea muerta: revisa la pull-up. Sin ella, la lectura es ruido.
  • Códigos siempre 0xFFFFFFFF: es el código de "repetición" NEC. Pulsa brevemente, no mantengas.
  • Códigos al azar distintos: receptor degradado (vuelve al tarro) o mando agotado (cambia la pila).

Variantes y mejoras

Tres extensiones que el artículo original no incluye:

  1. Modo low-power con interrupción IR: si tu proyecto corre con batería, deja el ESP32 en light sleep y configura GPIO 34 como wake-source con esp_sleep_enable_ext0_wakeup(GPIO_NUM_34, 0). El ESP32 duerme con ~1 mA y se despierta solo cuando llega un pulso IR. Útil para un control de luces con duración de meses por carga.

  2. Aprender el mando una sola vez y guardarlo en NVS: en lugar de hardcodear los códigos, haz un modo de "aprendizaje" donde el usuario aprieta cada tecla del mando una vez, y el ESP32 los guarda en NVS (NonVolatile Storage) con la librería Preferences. Así el mismo firmware sirve con cualquier mando.

  3. Repetidor IR sobre WiFi: combina un HX1838 (recibe) con un LED IR + transistor (emite) y un endpoint REST en el ESP32. Resultado: control universal vía HTTP que puedes disparar desde Home Assistant o cualquier app web. Perfecto para ese aire acondicionado viejo sin app oficial.

Personalización para Chile

En MechatronicStore (precios mayo 2026):

  • ESP32 ESP-WROOM-32 (USB-C) (SKU X2-10V2): $7.990 CLP
  • Control remoto IR + módulo receptor (kit) (SKU G-111): $2.600 CLP (viene con HX1838 + mando NEC compatible con los códigos del sketch, la opción más completa)
  • LED receptor infrarrojo 3 pin (HX1838 suelto) (SKU GF1-16): $990 CLP (si ya tienes un mando)
  • Resistencia 10 kΩ 1/4W (SKU GK2-15): $100 CLP (solo si usas el HX1838 desnudo)
  • Cables jumpers macho-hembra (SKU C-415): $1.990 CLP

Total mínimo (kit + ESP32 + cables): ~$12.580 CLP.

Recursos

Versión chilena con componentes en stock local en MechatronicStore, basada en el artículo de Soloelectronicos.com.