Descripcion del proyecto

Este proyecto se enfoca en la replicación y automatización de señales de control remoto infrarrojo (IR) para dispositivos domésticos sin acceso a internet, como aires acondicionados o televisores. La idea es aprender sobre comunicación, IR, principios de electrónica básica y programación en Python, con la finalidad de diseñar un dispositivo usando la placa Micro:bit de forma tal que pueda “aprender” comandos IR específicos y ejecutarlos automáticamente en horarios predefinidos, por ejemplo, para encender o apagar un equipo.

person-1

Dia 1

31/08/2025

En este primer día me he dedicado a estudiar si es viable realizar el proyecto. He investigado las distintas placas y sus características para ver con cuál resulta más factible realizar la idea.

Al parecer, la placa microbit no es la mejor debido a la complejidad que puede acarrear tanto la codificación como las conexiones de los distintos dispositivos. Es por ese motivo que me he decantado por la placa Arduino.

Una vez que me decidí por la placa que iba a utilizar, proseguí con la creación de este sitio web, en el cual iba a documentar todos los pasos del proyecto. Para ello era necesario realizar los siguientes pasos:

- Configuración de servidor web para servir el sitio web del proyecto.
- Creación del boceto del sitio web.
- Subida del boceto al servidor para pruebas.
- Creación de documentación para entregar como primera entrega (este documento).

Configuracion del servidor web

Debido a que ya contaba con un servidor web con el cual hosteo distintos proyectos personales y externos, la configuración del servidor no fue necesaria hacerla. De todas formas, aclaro que el mismo no es más que un servidor LAMP corriendo sobre Linux

Creación del boceto del sitio web

En cuanto a la creacion del boceto del sitio web, les cuento que en realidad busque un template en internet el cual se adapte graficamente al tipo de proyecto. No me costo mucho encontrar una de mi agrado. Solo quedaba modificarlo para adaptarla a mis necesidades

Realice varias modificaciones antes de dar la tarea terminada (al menos por ahora). Lo siguiente era subirla al servidor y asegurarme que todo funcione como deberia

Subida del boceto al servidor

Subi los archivos que componen el sitio a mi servidor y configure el subdominio por el cual se accede al mismo (steam.wago.uy). Una vez hecho eso probe el acceso al mismo y se desplego sin problemas.

Los primeros pasos del proyecto ya estaban encaminados... solo quedaba todo lo demas...

person-2

Dia 2

06/09/2025

Para el dia de hoy tenia pensado comenzar con la documentacion formal del proyecto. Este consistia en un documento de texto el cual llevaria todos los pasos para la reproduccion del proyecto por cualquiera que estuviese interesado en reproducirlo.

El resultado del mismo se puede ver el siguiente enlace: Documento de avances

Luego de hablarlo con el docente, me percate que habia habido un mal entendido y que el documento iba a ser el propio sitio web por lo que no seria necesario continuar con la documentacion en otro formato que no sea web. Por tal motivo se modifico el sitio web quitando dicho enlace y agregando la documentacion en el apartado "Proyecto"

person-3

Dia 3

10/09/2025

Teniendo el grueso de la documentacion y sitio web armados, se prosiguio con la creacion del proyecto en si. Para ello se utilizo la plataforma Tinkercad, en la cual se realizara todo el estudio del proyecto. En la misma se diagramaran las conexiones y el codigo necesario para luego llevarlo a la realidad.

La imagen que se muestra a continuacion refleja el sistema armado. Para todo ello se utlizaron distintas herramientas de consulta, entre las que destaco la utlizacion de IA (Gemini y ChatGPT)

circuito 1

La utilizacion de un display digital, era para ver si se recibia señal de parte del control remoto en la grabacion y ejecucion. Esto luego seria quitado en la realidad, dado que las pruebas se harian directamente sobre el dispositivo desde el cual se grabaron y ejecutran los comandos IR

Esquema del Circuito en Tinkercad

Para construir este proyecto en Tinkercad, necesitaremos los siguientes componentes:

- 1 x Placa Arduino Uno o 1 x Placa Micro:bit.
- 1 x Sensor receptor de infrarrojos (IR), por ejemplo un TSOP1738. Este componente es el que capturará la señal de tu control remoto.
- 1 x Diodo emisor de infrarrojos (IR LED). Este componente se usa para reproducir la señal grabada.
- 1 x Resistencia de 220 Ω para limitar la corriente del IR LED.
- 1 x Pulsador. Lo usarás para alternar entre los modos de "grabación" y "reproducción".
- 1 x Resistencia de 10 kΩ para el pull-down del pulsador.
- Cables de conexión (jumpers).

El diagrama del circuito es relativamente simple. Conecta el receptor IR a la placa para que reciba la señal del control remoto. Luego, conecta el IR LED a la placa para que emita la señal. Usa un pulsador para cambiar el modo de operación de tu dispositivo (grabar vs. reproducir). A continuación te detallo la conexión típica:

Receptor IR (TSOP1738):

- Pin OUT al pin digital del Arduino (por ejemplo, pin 11) o Micro:bit.
- Pin GND al pin GND de la placa.
- Pin VCC al pin de 5V del Arduino.

IR LED:

- Pata más larga (Ánodo) a la resistencia de 220 Ω.
- El otro extremo de la resistencia a un pin digital de la placa (por ejemplo, pin 3).
- Pata más corta (Cátodo) al pin GND de la placa.

Pulsador:

- Un terminal al pin digital de la placa (por ejemplo, pin 2).
- El otro terminal a una resistencia de 10 kΩ.
- El otro extremo de la resistencia al pin GND de la placa.
- El terminal que va al pin digital del Arduino también se conecta al pin 5V.

La simulación permitirá ver el flujo de la señal y cómo los componentes interactúan.

person-4

Dia 4

20/09/2025

En esta instancia se prosiguio con la implementacion del proyecto. Dado que ya teniamos el ciercuito armado, nos enfocamos mas en la creacion del codigo.

Nuevamente nos apoyamos en IA para obtener un primer pantallaso del codigo.

El codigo inicial se puede apreciar a continuacion:

codigo 1

Este código es un punto de partida.

La función irsend.sendNEC() es específica para el protocolo NEC. Es posible que el dispositivo (en este caso un aire acondicionado) use un protocolo diferente, como SONY, Samsung, o RC5.

La biblioteca IRremote puede manejar varios protocolos, y para saber cuál es el del control remoto, debemos decodificar la señal.

Lamentablemente dicho codigo no funciono como se esperaba, por lo que se intentara restructurar el codigo de la aplicacion en la proxima instancia.

person-4

Dia 5

27/09/2025

Nuevamente retomamos el circuito y el codigo anterior con la finalidad de rever cualquier inconveniente que pudiera tener, tanto en el armado del circuito, como en el codigo visto anteriormente.

Dado que el protobard me confunde mas de lo que me ayuda, decidi quitarla del medio y conectar directamente. El resultado se puede ver a continuacion:

circuito 2

Tambien se revio el codigo, con el fin de adaptarlo mas a nuestras necesidades. A continuacion se deja el codigo utilizado en esta instancia:

codigo 2

person-4

Dia 6

04/10/2025

Debido a que lo anterior no se pudo hacer funcionar, he decidido investigar si esto es realmente posible de hacer.

Para ello busque en youtube con el fin de ver si alguien ya ha intentado hacer esto antes. Para mi sorpresa encontre estos dos videos que muestran como lo han hecho otras personas.

Por lo que pude ver hay varios videos que hablan que esto se puede hacer. El siguiente paso será ir a comprar los componentes necesarios para intentar llevar a cabo el proyecto.

person-4

Dia 7

29/10/2025

Lamentablemente, he estado enfermo las dos semanas anteriores, por lo que no he podido avanzar con el proyecto.

Aprovechando que el docente avisó que hoy no hay clases, he investigado un poco más acerca de la viabilidad del proyecto y, gracias a la ayuda de la IA (ChatGPT & Gemini), ya tengo el panorama un poco más claro.

Lamentablemente, todavía no he podido comprar los componentes. Intentaré hacerlo la semana que viene.

El proyecto sigue más vivo que nunca. Este mes sí o sí debo implementarlo, dado que tengo que presentarlo a finales de mes.

No dejen de seguir los avances que ya queda poco para el desenlace final! =)

person-4

Dia 8

04/11/2025

Una vez repuesto de mi enfermedad, seguí investigando el tema y di con una persona que está intentando hacer algo muy parecido a lo que yo necesito.

Para reproducirlo he accedido a Tinkercad y reproduje lo visto en dicho video. El resultado fue el siguiente:

circuito 3

Y el código utilizado fue el siguiete:


#include 

int RECV_PIN = 11;

// No necesitas crear objetos "irrecv" o "results" aquí arriba.
// La nueva librería maneja esto de forma interna.

void setup()
{
  Serial.begin(9600);
  Serial.println("Habilitando receptor IR...");
  
  // Inicia el receptor en el pin 11.
  // Reemplaza a irrecv.enableIRIn()
  IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK); // ENABLE_LED_FEEDBACK es opcional, puedes quitarlo.
  
  Serial.println("Receptor Habilitado.");
}

void loop()
{
  // Comprueba si se recibió una señal
  // Reemplaza a if (irrecv.decode(&results))
  if (IrReceiver.decode()) {
	
	// Imprime el valor recibido en HEX
	// Reemplaza a Serial.println(results.value, HEX);
	Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
	
	// Prepara el receptor para la siguiente señal
	// Reemplaza a irrecv.resume();
	IrReceiver.resume(); 
  }
  delay(100);
}
							

A continuacion dejo el video de tinkercad donde se muestra su comportamiento

person-4

Dia 9

07/11/2025

Ya que tengo una versión que lee los códigos que recibe del control remoto, pensé en ir más allá y ver si puedo guardar esos códigos para luego ejecutarlos desde el Arduino y así, duplicar el comando del control remoto original.

Para ello me puse a investigar cómo puedo hacer esto y, luego de ver varios videos, recurrí a la IA.

Luego de varios intentos fallidos, llegamos a algo que parece funcionar (al menos en el ambiente virtual de Tinkercad.

He aquí el diagrama del circuito:

circuito 4

Y el código utilizado fue el siguiete:


#include 

// Pines
int RECV_PIN = 11;  // Pin del Receptor IR
int SEND_PIN = 3;   // Pin del Emisor IR (LED IR)
int BUTTON_PIN = 2; // Pin de un botón para enviar la señal guardada

// Variables para guardar el código recibido
unsigned long lastReceivedCode = 0;
// NOTA: Para simplificar y evitar errores de librería en Tinkercad,
// hardcodearemos el protocolo a NEC (32 bits) si la decodificación es exitosa.
// Si tu control remoto no es NEC, debes cambiar este protocolo (ej. SONY, RC5).
const int PROTOCOL_BITS = 32; // Común para NEC

bool buttonState = false;

void setup() {
  Serial.begin(9600);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  
  // 1. Inicializar Receptor IR: Pasar el pin de recepción y la bandera opcional.
  IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK);
  
  // 2. Inicializar Transmisor IR: Pasar solo el pin de envío.
  IrSender.begin(SEND_PIN);
  
  Serial.println("--- Sistema IR Habilitado ---");
  Serial.println("Presione un boton en el control remoto para CAPTURAR el codigo.");
  Serial.println("Presione el boton en el pin 2 para REPRODUCIR el codigo capturado.");
}

void loop() {
  // --- 1. RECEPCIÓN Y ALMACENAMIENTO ---
  if (IrReceiver.decode()) {
    
    // Solo guardar si la decodificación fue exitosa y no es código repetido
    if (IrReceiver.decodedIRData.protocol != UNKNOWN && IrReceiver.decodedIRData.decodedRawData != 0) {
        lastReceivedCode = IrReceiver.decodedIRData.decodedRawData;
        
        Serial.print("✅ Codigo CAPTURADO: ");
        Serial.print(lastReceivedCode, HEX);
        Serial.print(" (Protocolo: ");
        // Usamos IrReceiver.decodedIRData.protocol para saber qué protocolo es
        Serial.print(IrReceiver.decodedIRData.protocol); 
        Serial.println(")");
    }
    
    IrReceiver.resume(); // Reanudar la recepción
  }

  // --- 2. REPRODUCCIÓN (al presionar un botón) ---
  if (digitalRead(BUTTON_PIN) == LOW && !buttonState) {
    buttonState = true; // Botón presionado

    if (lastReceivedCode != 0) {
      Serial.print("📡 ENVIANDO Codigo: ");
      Serial.println(lastReceivedCode, HEX);
      
      // Función de envío NEC (necesita el código y el número de bits)
      // Si tu control remoto no usa 32 bits, ajusta la constante PROTOCOL_BITS
      IrSender.sendNEC(lastReceivedCode, PROTOCOL_BITS);
      
      Serial.println("Señal Enviada.");
    } else {
      Serial.println("⚠️ No se ha capturado ningun codigo para enviar.");
    }
  } 
  
  // Resetear el estado del botón cuando se suelta
  if (digitalRead(BUTTON_PIN) == HIGH && buttonState) {
    buttonState = false; 
  }

  delay(100);
}
							

Al igual que antes, dejo el video de tinkercad donde se muestra su comportamiento

person-4

Dia 10

10/11/2025

Una vez armado el circuito, me entro la duda de cómo probar, en el ambiente virtual de Tinkercad, si el circuito puede emitir realmente lo guardado.

Retomando el hilo anterior con la IA (Gemini en este caso), le pregunté si había alguna forma de confirmar si realmente estaba emitiendo el código recibido.

Luego de varios intentos fallidos, llegamos a un código para poder verificar si el sistema estaba funcionando realmente.

Lamentablemente, no es posible verificar realmente si el código funciona, dado que en Tinkercad no existe un componente emisor IR. Lo más parecido es el LED convencional, el cual no queda claro si solo emite luz o es capaz de enviar información como un emisor IR.

He aquí el diagrama del circuito:

circuito 4

Y el código utilizado fue el siguiete:


#include 

// Pines
int RECV_PIN = 11;  // Pin del Receptor IR
int SEND_PIN = 3;   // Pin del Emisor IR (LED IR)
int BUTTON_PIN = 2; // Pin de un botón para enviar la señal guardada

// Variables para guardar el código recibido
unsigned long lastReceivedCode = 0;
// *** CORRECCIÓN ***: Renombramos la constante para evitar conflicto con la librería.
// Protocolo RC-5 (Protocolo 8) usa típicamente 12 bits.
const int RC5_NUM_BITS = 12; 

bool buttonState = false; // Estado del botón

void setup() {
  Serial.begin(9600);
  // Usamos INPUT_PULLUP, el botón se conecta a GND
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  
  // 1. Inicializar Receptor IR
  IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK);
  
  // 2. Inicializar Transmisor IR
  IrSender.begin(SEND_PIN);
  
  Serial.println("--- Sistema IR Habilitado ---");
  Serial.println("Presione un boton en el control remoto para CAPTURAR el codigo.");
  Serial.println("Presione el boton en el pin 2 para REPRODUCIR el codigo capturado.");
}

void loop() {
  // --- 1. RECEPCIÓN Y ALMACENAMIENTO ---
  if (IrReceiver.decode()) {
    
    // Solo guardar si la decodificación fue exitosa y no es código repetido
    if (IrReceiver.decodedIRData.protocol != UNKNOWN && IrReceiver.decodedIRData.decodedRawData != 0) {
        lastReceivedCode = IrReceiver.decodedIRData.decodedRawData;
        
        Serial.print("✅ Codigo CAPTURADO: ");
        Serial.print(lastReceivedCode, HEX);
        Serial.print(" (Protocolo: ");
        Serial.print(IrReceiver.decodedIRData.protocol); 
        Serial.println(" - ¡RC-5!)");
        Serial.println(">>> Captura exitosa. Presione el botón en Pin 2 para REPRODUCIRlo. <<<");
    }
    
    IrReceiver.resume(); // Reanudar la recepción
  }

  // --- 2. REPRODUCCIÓN (al presionar un botón) ---
  if (digitalRead(BUTTON_PIN) == LOW && !buttonState) {
    buttonState = true; // Botón presionado

    if (lastReceivedCode != 0) {
      Serial.print("📡 ENVIANDO Codigo: ");
      Serial.println(lastReceivedCode, HEX);
      
      // Usamos el nuevo nombre de la constante
      IrSender.sendRC5(lastReceivedCode, RC5_NUM_BITS); 
      
      Serial.println("Señal Enviada.");
    } else {
      Serial.println("⚠️ No hay codigo capturado valido para enviar.");
    }
  } 
  
  // Resetear el estado del botón cuando se suelta
  if (digitalRead(BUTTON_PIN) == HIGH && buttonState) {
    buttonState = false; 
  }

  delay(100);
}#include 

// Pines
int RECV_PIN = 11;  // Pin del Receptor IR
int SEND_PIN = 3;   // Pin del Emisor IR (LED IR)
int BUTTON_PIN = 2; // Pin de un botón para enviar la señal guardada

// Variables para guardar el código recibido
unsigned long lastReceivedCode = 0;
// *** CORRECCIÓN ***: Renombramos la constante para evitar conflicto con la librería.
// Protocolo RC-5 (Protocolo 8) usa típicamente 12 bits.
const int RC5_NUM_BITS = 12; 

bool buttonState = false; // Estado del botón

void setup() {
  Serial.begin(9600);
  // Usamos INPUT_PULLUP, el botón se conecta a GND
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  
  // 1. Inicializar Receptor IR
  IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK);
  
  // 2. Inicializar Transmisor IR
  IrSender.begin(SEND_PIN);
  
  Serial.println("--- Sistema IR Habilitado ---");
  Serial.println("Presione un boton en el control remoto para CAPTURAR el codigo.");
  Serial.println("Presione el boton en el pin 2 para REPRODUCIR el codigo capturado.");
}

void loop() {
  // --- 1. RECEPCIÓN Y ALMACENAMIENTO ---
  if (IrReceiver.decode()) {
    
    // Solo guardar si la decodificación fue exitosa y no es código repetido
    if (IrReceiver.decodedIRData.protocol != UNKNOWN && IrReceiver.decodedIRData.decodedRawData != 0) {
        lastReceivedCode = IrReceiver.decodedIRData.decodedRawData;
        
        Serial.print("✅ Codigo CAPTURADO: ");
        Serial.print(lastReceivedCode, HEX);
        Serial.print(" (Protocolo: ");
        Serial.print(IrReceiver.decodedIRData.protocol); 
        Serial.println(" - ¡RC-5!)");
        Serial.println(">>> Captura exitosa. Presione el botón en Pin 2 para REPRODUCIRlo. <<<");
    }
    
    IrReceiver.resume(); // Reanudar la recepción
  }

  // --- 2. REPRODUCCIÓN (al presionar un botón) ---
  if (digitalRead(BUTTON_PIN) == LOW && !buttonState) {
    buttonState = true; // Botón presionado

    if (lastReceivedCode != 0) {
      Serial.print("📡 ENVIANDO Codigo: ");
      Serial.println(lastReceivedCode, HEX);
      
      // Usamos el nuevo nombre de la constante
      IrSender.sendRC5(lastReceivedCode, RC5_NUM_BITS); 
      
      Serial.println("Señal Enviada.");
    } else {
      Serial.println("⚠️ No hay codigo capturado valido para enviar.");
    }
  } 
  
  // Resetear el estado del botón cuando se suelta
  if (digitalRead(BUTTON_PIN) == HIGH && buttonState) {
    buttonState = false; 
  }

  delay(100);
}
							

Al igual que antes, dejo el video de Tinkercad donde se muestra su comportamiento.

Lo más seguro sería probarlo físicamente. Lamentablemente, no cuento con todos los componentes necesarios para ello (me estaría faltando el pulsador (botón) y ambas resistencias).

person-4

Dia 11

11/11/2025

Como no tengo todos los componentes necesarios para probar lo del día anterior, he decidido probar con lo que tengo.

Esto sería lo logrado el día 8, es decir, la recepción del código IR proveniente del control remoto.

A continuación, dejo una imagen del circuito armado realmente, con su receptor IR

circuito 3

Y el código utilizado fue el siguiete:


#include 

int RECV_PIN = 11;

// No necesitas crear objetos "irrecv" o "results" aquí arriba.
// La nueva librería maneja esto de forma interna.

void setup()
{
  Serial.begin(9600);
  Serial.println("Habilitando receptor IR...");
  
  // Inicia el receptor en el pin 11.
  // Reemplaza a irrecv.enableIRIn()
  IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK); // ENABLE_LED_FEEDBACK es opcional, puedes quitarlo.
  
  Serial.println("Receptor Habilitado.");
}

void loop()
{
  // Comprueba si se recibió una señal
  // Reemplaza a if (irrecv.decode(&results))
  if (IrReceiver.decode()) {
	
	// Imprime el valor recibido en HEX
	// Reemplaza a Serial.println(results.value, HEX);
	Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
	
	// Prepara el receptor para la siguiente señal
	// Reemplaza a irrecv.resume();
	IrReceiver.resume(); 
  }
  delay(100);
}
							

A continuación tambien dejo una imagen del Arduino IDE con la configuración mencionada arriba.

circuito 3

Por último dejo el archivo de configuración del IDE con el código necesario para levantarlo en el siguiente enlace: INO_File

Lamentablemente, al conectarlo a la PC con el receptor IR, la placa Arduino se conecta y desconecta inmediatamente. Si no le pongo el receptor IR, se conecta bien y me deja subirle el código.

Calculo que no le debe dar la energía a los puertos USB para alimentar la placa con el receptor IR.