IsProto

Soluciones para Redes e Internet

Control de infrarrojos de los electrodomésticos con arduino

control de infrarrojo por arduino

El propósito de nuestro proyecto es proporcionar control sobre un conjunto de dispositivos controlados por infrarrojos. La siguiente figura muestra un ejemplo de cómo se puede usar este dispositivo antes de que me encuentre con un fireware Ethernet para una conexión USB a un servidor.

Control de infrarrojos por arduino

Para controlar un dispositivo por infrarrojos con Arduino, necesitarás una biblioteca específica llamada IRremote para recibir o enviar señales infrarrojas. Aquí tienes un código básico para recibir señales de un control remoto infrarrojo y realizar una acción con Arduino, por ejemplo, encender un LED cuando se presiona un botón específico en el control remoto.

Materiales:

  • Arduino (Uno, Mega, etc.)
  • Receptor infrarrojo (por ejemplo, VS1838B)
  • Control remoto infrarrojo
  • LED y resistencia
  • Conexiones por cable

Conexiones:

  1. Conecta el pin de datos del receptor infrarrojo al pin digital 11 del Arduino.
  2. Conecta los otros dos pines del receptor a GND y VCC (5V).
  3. Conecta el ánodo del LED a un pin digital del Arduino (por ejemplo, el pin 13) a través de una resistencia de 220 ohmios, y el cátodo a GND.

Código:

#include <IRremote.h>  // Biblioteca para el control IR

// Pin donde está conectado el receptor IR
const int RECV_PIN = 11;
// Pin del LED
const int LED_PIN = 13;

// Objeto para el receptor IR
IRrecv irrecv(RECV_PIN);
// Objeto para almacenar los resultados del control remoto
decode_results results;

void setup() {
  // Iniciar el monitor serie
  Serial.begin(9600);
  
  // Iniciar el receptor infrarrojo
  irrecv.enableIRIn();
  
  // Configurar el pin del LED como salida
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  // Verificar si se ha recibido una señal IR
  if (irrecv.decode(&results)) {
    // Mostrar el código recibido por el control remoto
    Serial.println(results.value, HEX);
    
    // Controlar el LED con base en un código específico del control remoto
    if (results.value == 0xFFA25D) {  // Reemplazar con el código de tu control remoto
      digitalWrite(LED_PIN, HIGH);    // Encender el LED
    }
    if (results.value == 0xFF629D) {  // Otro código para apagar el LED
      digitalWrite(LED_PIN, LOW);     // Apagar el LED
    }
    
    // Listo para recibir la próxima señal
    irrecv.resume();
  }
}

Explicación:

  1. Librería IRremote: Se utiliza para manejar las señales infrarrojas.
  2. Resultados: Los códigos recibidos se imprimen en el monitor serie para identificar qué botón del control remoto estás usando. Puedes cambiar los códigos 0xFFA25D y 0xFF629D por los códigos de tu propio control.
  3. Acción: Dependiendo del código recibido, se enciende o apaga el LED.

Cómo identificar los códigos de tu control:

  • Sube el código y abre el monitor serie.
  • Presiona los botones del control remoto y observa los códigos que aparecen.
  • Luego, reemplaza los valores en el código para asociarlos con las acciones deseadas (por ejemplo, encender o apagar el LED).

Otros ejemplos más sotisficados

Les diré enseguida que la figura fue hecha específicamente para explicar las capacidades del dispositivo, en casa todo es mucho más simple, porque yo sólo controlo el televisor, y como fuente utilizo mi PC como servidor, como en la primera figura.

Supongamos que tenemos dos habitaciones y en cada una de ellas hay dispositivos, y sus marcas y modelos coinciden, respectivamente, con los aparatos de mando de la televisión, el reproductor de DVD y el receptor de satélite de las habitaciones. Sobre esta base podemos concluir que necesitamos usar nuestra propia salida de Arduino para cada dispositivo.

Se usara el desmultiplexor para este propósito, con el pretexto de simplificar la parte del software, entendí que estaba destinado a usar la biblioteca IRRemote. No estoy en contra del desmultiplexor, no me gusta la nitidez de IRRemote en el pin 3, por cierto, nadie prohíbe usar el demultiplexor con mi módulo.

En cuanto a mí, no necesito varios puertos, atención a la imagen:
Es conveniente que el transmisor se pueda pegar directamente al equipo en el área del receptor de IR, asegurando así que el control sea estable y sólo el dispositivo que queremos controlar (en caso de que haya más de un dispositivo que responda al comando enviado en las cercanías).

Cuando estaba escribiendo la parte del servidor, no quise meterme demasiado, así que decidí volcar un pequeño y tonto servidor web con un “monitor de puerto” incorporado (para transferir datos al arduino en un puerto Com virtual) en Delphi, para ello utilicé los componentes Indy idHTTPSever y CPort.

En el lado del servidor hay una página index.html con archivos para ello (CSS, JS, gráficos, etc.) y un archivo codes.txt que almacena los códigos para la gestión del equipo. Los códigos pueden almacenarse en dos formatos: HEX y GlobalCache.

En el formato HEX, hay una regla para iniciar el comando con el identificador 0000, lo consideraremos un lugar para manipular el número de repeticiones de código y el puerto al que debe ser enviado.El número de repeticiones son los dos primeros caracteres traducidos de hexadecimal a decimal CC + 1.

es decir, 00 = 0 + 1 = 1 o 0A = 10 + 1 = 11;

La dirección del puerto son los dos segundos caracteres en los que el número del puerto de Arduino está simplemente oculto.

Ejemplo: 00 = puerto digital 0 o 0D = puerto digital 13;No hay necesidad de cambiar el resto de los datos del código HEX, lo dejamos como está.Para los códigos en formato GlobalCache, esto es un poco más complicado, el formato en sí se ve así:Sendir, {dirección del módulo}: {dirección del conector}, {ID}, {frecuencia}, {cuenta}, {offset}, {on1}, {off1}…{offset}, {offset}, {off1}… Dónde:{moduladirección del módulo}:{dirección del conector} – esto es lo que debería ser el número de puerto digital en el arduino, para la compatibilidad con GlobalCahce se decidió convertir este par de valores en un número de puerto de arduino, esto se puede hacer por fórmula:ArduinoPort = ({dirección del módulo} * 3)-(3-{dirección del conector})-1;Por ejemplo: 5:2 = (5*3)-(3-2)-1 = (15)-(1)-1 = puerto digital 13;Ignoro;Frecuencia en Hz;{conteo} – Número de repeticiones (1-255);Ignoro de nuevo;

y es un dato.

Utilizo mayormente el formato HEX, pero vale la pena notar que los códigos en el formato GlabalCache son casi 2 veces más cortos y parsimulan el doble de rápido.
Cada comando debe estar estrictamente en una línea separada, el número de una línea en el archivo se utiliza como un puntero a un código específico, para mi conveniencia, los códigos comienzan con números, porque las líneas en el archivo están numeradas desde el cero, por lo que obtenemos el número de línea 0 – este es el código del botón 0.

Aquí hay una parte del archivo codes.txt con comandos del Philips 47PLF4007:

000D 0073 002A 000D 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0BDE 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0021//digit 0 000D 0073 002A 000D 0061 0021 0010 0020 0010 0010 0010 0010 0010 0020 0020 000F 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 0BED 0061 0021 0010 0020 0010 0010 0010 0010 0010 0020 0020 000F 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 0021//digit 1 000D 0073 0028 000D 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 001F 0010 0BDE 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 001F 0010 0021//digit 2 … 000D 0073 0024 000D 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 001F 0020 001F 0020 001F 0010 0010 0010 0BDE 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 001F 0020 001F 0020 0020 0010 0010 0010 0021//home sendir,5:2,1,36000,1,1,97,31,16,30,16,16,16,16,16,30,32,14,16,16,16,16,16,16,16,16,16,16,16,16,16,16,32,14,16,30,16,16,32,14,16,30,16,16,16,720//list 000D 0073 002A 0000 0061 0021 0010 0020 0010 0010 0010 0010 0010 0020 0020 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 000F 0010 0010 0010 0010 0010 0BEE 0061 0021 0010 0020 0010 0010 0010 0010 0010 0020 0020 000F 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 0010 0010 0010 0010 0010 0010 0021//info

El servidor está completamente construido sobre las peticiones GET y esto debe tenerse en cuenta al desarrollar la página HTML. El punto es que le pido al servidor un archivo cuyo nombre comienza al final del subrayado y va seguido del número de cadena del archivo codes.txt en el que se encuentra el comando.

Lineas de programación del form del servidor

procedure TForm1.srvCommandGet(AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); var S,codeStr:String; i:Cardinal; begin S:=ARequestInfo.Document; Delete(S,1,1); if S=” then S:=ExtractFilePath(ParamStr(0))+’webdata\index.html’ else begin if (S[1]=’_’) then begin Delete(S,1,1); codeStr:=SL.Strings[StrToInt(S)]; Delete(codeStr,pos(‘/’,codeStr),255); if ComPort1.Connected then ComPort1.WriteStr(codeStr+#13); S:=’ok.js’; end; S:=StringReplace(S,’/’,’\’,[rfReplaceAll]); S:=ExtractFilePath(ParamStr(0))+’webdata\’+S; end; try AResponseInfo.ContentType:=ARequestInfo.ContentType; AResponseInfo.ContentStream:=TFileStream.Create(S,0); except end; end;

Para la aplicación cliente se escribieron varias funciones, que son responsables del intercambio de datos con el servidor. Para solicitar al servidor que ejecute el comando, sólo tiene que añadir una nueva etiqueta con el atributo scr a la página, y lo haremos:

Lineas de programación del form de la aplicación cliente

var boolSendRepeat = false; function addScript(src){ var element = document.createElement(‘script’); element.type = ‘text/javascript’; element.src = src; element.className = ‘bufferresponsescript’; document.getElementsByTagName(‘head’)[0].appendChild(element); } function delScripts(){ var z = document.getElementsByClassName(‘bufferresponsescript’); for(var i=z.length;i>0;i–){ z[i-1].parentNode.removeChild(z[i-1]); } } function sendCommand(cmdNumber){ addScript(‘_’+cmdNumber); } function sendMacro(arrCmdNumber,arrDelays){ var s=”; for(var i=0;i

El resultado de todo lo anterior se muestra en las siguientes imágenes:

Bueno no fue más ahora queda hacer pruebas, este proyecto fue realizado por Janom cualquier duda acá dejo enlace a su articulo comenten alguna duda del proyecto. Traducción tu casa inteligente