Saltar al contenido
Tucasainteligente

Control de infrarrojos de los electrodomésticos con arduino

14 abril 2020
Proyecto de control remoto con delphi y 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.

Fig 1 esquema del proyecto


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<arrCmdNumber.length;i++){ s = ‘sendCommand(‘+arrCmdNumber[i]+’)’; setTimeout(s,arrDelays[i]); } } function repeatFunc(cmdNumber,repeatTime){ var s = ‘repeatFunc(‘+cmdNumber+’,’+repeatTime+’)’; if(boolSendRepeat==true){ sendCommand(cmdNumber); setTimeout(s,repeatTime); } } function repeatStop(){ boolSendRepeat=false; } function sendRepeat(cmdNumber,repeatTime){ boolSendRepeat=true; repeatFunc(cmdNumber,repeatTime); }

Puedes aplicarlo en un evento on clic de cualquier botón de la siguiente manera.

<td onclick=”sendCommand(32)“>List</td><!-enviar un comando donde el numero de linea en el archivo codes.txt 32–> <td onclick=”sendMacro([46,43],[10,550])”>Компьютер</td><!–Envíe un comando desde la línea 46, y en 550 milisegundos envíe un comando a la 43–> <td onmousedown=”sendRepeat(12,800)” onmouseup=”repeatStop()”>Vol+</td><!-Envía un comando desde la línea 12, cada 800 milisegundos mientras se presiona el botón.->

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