Controlar el televisor, equipo de audio y dvd desde el celular con arduino

Publicado el: 24 de junio de 2019
Intermedio
Acerca de este proyecto
Proyecto que explica como controlar el televisor, equipo de sonido, dvd o cualquier electrodoméstico desde el celular (android) y arduino.
domotica arduino
Publicidad
DETALLES

Hola, en esta oportunidad quiero compartirles este proyecto que quise realizar desde que conocí el mundo del arduino. Se trata de poder controlar nuestro televisor, reproductor de dvd y equipo de sonido con arduino desde una aplicación en nuestro celular con Android. Esto es una base para la domótica, ya que ustedes podrán ampliar el rango de dispositivos a ser controlados como luces, ventiladores, aires acondicionados, etc.

El proyecto consta de dos partes:

La primera en la cual se arma el circuito que nos permitirá obtener los códigos de cada botón del control remoto que controla a cada  electrodoméstico. Y el segundo en el cual es el proyecto en sí, el del controlador.

La lista de materiales es la siguiente:

  • Tarjeta arduino uno o equivalente.
  • Modulo de bluetooth HC-05.
  • Módulo receptor de infrarojos TSOP 1738 o equivalente.(Usado sólo para recibir los códigos, no en el proyecto final).
  • 2  Led's infrarojos.
  • 2 Resistencias de 220 ohms.
  • Cables de conexion.
  • Celular con sistema operativo Android.

La cantidad de leds infrarojos depende de la disposición de sus aparatos , en mi caso el televisor y el dvd estaban en la misma línea de manera que un led era suficiente para controlarlos a ambos mientras que el equipo de audio se encontraba a cierta distancia y por eso me tocó usar otro led que apuntara directamente hacia el sensor del equipo.


OBTENER LOS CÓDIGOS DE LOS  CONTROLES REMOTOS


Protoboard


DIAGRAMA

Diagrama


Primero se deben obtener los códigos de cada botón de la función que quiera ser ejecutada. Por ejemplo, si se quiere encender/apagar, cambiar el volumen y modificar los canales de nuestro televisor desde la App; debemos entonces identificar los códigos de los respectivos botones de nuestro televisor. De igual manera hacer lo mismo para el control del DVD, equipo de sonido o aparato que se quiera controlar.

Para ello, armamos el circuito según se muestra en la figura:

El receptor de infrarojos Tsop 1738 o equivalente tiene 3 pines;

El primero es la salida de señal y va conectado hacia el pin 11 del arduino ( puede ser usado cualquier pin digital del arduino teniendo la precaución de configurarlo en el sketch).

El segundo pin va conectado a GND.

El tercer pin va conectado a los +5V.

Luego descargue la librería IrRemote escrita por Ken Shirriff, que es la que nos permitirá obtener los códigos y enviar los mismos en protocolos Nec, Philips RC5, RC6 y Raw.

A continuación descargue (recomiendo mejor descargarla )o copie las siguientes líneas de código que se encuentra en la sección codificación de este articulo.


OBTENER LOS CÓDIGOS

Pantallazo


Después de haber construido el circuito y cargarlo en nuestro arduino, abra el monitor serial de arduino, apunte el control remoto hacia el receptor infrarojo y presione la tecla de la cual se quiera capturar el código. Debe visualizarse el el monitor serial el protocolo, código y array de tiempos de la tecla presionada.

En la figura se muestra a manera de ejemplo los códigos obtenidos cuando presioné la tecla de encendido y abrir/cerrra bandeja de cd de mi reproductor de DVD.

Si vemos que el protocolo mostrado es conocido, se anota el código hexadecimal de 6 dígitos obtenido, ya que será el que se va a usar. Si se muestra un protocolo desconocido, hay que copiar el array recibido de 32 o 68 bits.

Estos códigos sera utilizados en el proximo sketch.


DIAGRAMA CIRCUITO FINAL

Diagrama circuito

Diagrama montaje


Como se ve, el circuito es muy simple ya que sólo se usan 3 pines del arduino.

Nota importante: El led infrarojo debe ser conectado al pin número 3 del arduino. Esto es así ya que la librería ya viene configurada internamente para usar este pin como emisor.

El pin 0 del arduino (Rx) debe ir conectado al pin Tx del módulo BT.

El pin 1 del arduino (Tx) debe ir conectado al pin Rx del módulo BT.

Recordar desconectar el módulo de bluetooth al momento de cargar el programa en el arduino.


LA APP


Pantallazo app

Pantallazo celular

Este es el diagrama de bloques de la app. Hace uso del componente BlueTooth cliente, varios botones, etiquetas y un cuadro de lista que permitirá escoger la conexión hacia el módulo de BT.

Haz clic aca para descargar el archivo apk.

CODIFICACIÓN
Codigo para obtener los codigos-
Este es el primero código que se debe cargar para obtener los códigos de los controles remotos que se emularan.
#include <IrRemote.h>
int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()

{

Serial.begin(9600);

irrecv.enableIRIn(); // Start the receiver

}

// Dumps out the decode_results structure.

// Call this after IRrecv::decode()

// void * to work around compiler issue //void dump(void *v)

{ /

/ decode_results *results = (decode_results *)v

void dump(decode_results *results)

{

int count = results->rawlen;

if (results->decode_type == UNKNOWN)

{ Serial.print("Unknown encoding: "); }

else if (results->decode_type == NEC)

{ Serial.print("Decoded NEC: "); }

else if (results->decode_type == SONY)

{ Serial.print("Decoded SONY: "); }

else if (results->decode_type == RC5)

{ Serial.print("Decoded RC5: "); }

else if (results->decode_type == RC6)

{ Serial.print("Decoded RC6: "); }

else if (results->decode_type == PANASONIC)

{ Serial.print("Decoded PANASONIC – Address: ");

Serial.print(results->panasonicAddress,HEX);

Serial.print(" Value: "); }

else if (results->decode_type == JVC)

{ Serial.print("Decoded JVC: "); }

Serial.print(results->value, HEX);

Serial.print(" (");

Serial.print(results->bits, DEC);

Serial.println(" bits)");

Serial.print("Raw (");

Serial.print(count, DEC);

Serial.print("): ");

for (int i = 0; i < count; i++)

{ if ((i % 2) == 1)

{ Serial.print(results->rawbuf[i]*USECPERTICK, DEC); }

else

{

Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC); }

Serial.print(" ");

}

Serial.println("");

}

void loop()

{ if

(irrecv.decode(&results))

{

Serial.println(results.value, HEX);

dump(&results); irrecv.resume();

// Receive the next value

}

}
Codigo final-
Este es el codigo que se debe cargar para el proyecto final.
#include <\IrRemote.h\>;
IRsend ir;

int estado=0;

char dato;

//These codes are for controlling the Audio System

unsigned int powerEquipo[32]={300,750,300,1800,300,700,350,700,350,1750,350,700,300,1800,250,1800,350,700,300,1800,350,700,300,700,350,700,350,1750,300,750,300}; //unsigned int chEmisoraUp[32]= {300,750,300,750,300,1750,250,800,300,750,300,750,250,800,300,750,250,1800,250,1850,300,750,250,800,200,800,300,1800,300,750,300}; unsigned int chEmisoraUp[32] ={300,750,300,750,300,1800,200,850,300,750,250,750,300,750,300,750,300,1800,300,1750,300,750,300,750,300,750,300,1800,250,750,300}; unsigned int chEmisoraDown[32] = {350,700,400,650,300,1750,350,700,350,700,350,700,300,750,300,700,350,700,300,750,350,1750,400,650,300,700,350,1750,300,750,300}; unsigned int playCd[32] = {400,650,400,650,350,1750,350,700,350,650,350,1750,350,1750,300,1750,400,1700,350,1750,350,700,350,650,400,650,350,1750,450,600,350}; //These codes are for controlling the Tv unsigned int pwrTv[68]={4600,4350,700,1550,650,1550,650,1600,650,450,650,450,650,450,650,450,700,400,700,1550,650,1550,650,1600,650,450,650,450,650,450,700,450,650,450,650,450,650,1550,700,450,650,450,650,450,650,450,650,450,700,400,650,1600,650,450,650,1550,650,1600,650,1550,650,1550,700,1550,650,1550,650}; // volume up unsigned int volUpTv[68]={4600,4350,650,1550,700,1500,700,1550,700,400,700,400,700,450,650,450,700,400,700,1500,700,1550,650,1550,700,400,700,400,700,450,650,450,700,400,700,1500,700,1550,650,1550,700,400,700,450,700,400,700,400,700,400,700,450,650,450,650,450,650,1550,700,1500,700,1550,700,1500,700,1550,650}; // volume down unsigned int volDownTv[68]={4600,4350,700,1550,650,1550,700,1500,700,450,650,450,700,400,700,400,700,400,700,1550,700,1500,700,1550,700,400,700,400,700,400,700,450,650,450,650,1550,700,1500,700,450,650,1550,700,400,700,400,700,450,700,400,700,400,700,400,700,1550,700,400,700,1500,700,1500,700,1550,700,1500,700}; // channel up unsigned int chUpTv[68]={4600,4350,700,1500,700,1500,700,1550,700,450,650,400,700,450,650,450,700,400,700,1500,700,1550,650,1550,700,450,650,450,700,400,700,400,700,400,700,400,700,1550,700,400,700,400,700,1550,650,450,700,400,700,400,700,1550,650,450,650,1600,650,1550,650,450,700,1500,700,1500,700,1550,650}; // channel down unsigned int chDownTv[68]={4650,4300,700,1550,700,1500,700,1550,700,400,700,400,700,400,700,450,650,450,650,1550,700,1500,700,1550,700,400,700,400,700,400,700,450,700,400,700,400,700,400,700,450,650,450,650,1550,700,400,700,450,650,400,700,1550,700,1500,700,1550,700,1500,700,400,700,1550,650,1550,700,1500,700}; // Tv/Video unsigned int videoTv[68]={4500,4300,650,1600,650,1550,650,1600,650,500,600,500,650,500,650,500,650,500,600,1650,600,1600,650,1550,650,500,650,500,650,500,600,500,650,500,650,1600,600,500,650,500,650,500,650,500,600,550,600,500,650,500,650,500,650,1550,650,1600,650,1550,650,1600,650,1550,650,1600,650,1550,650}; void setup()

{

Serial.begin(9600);

}

void loop()

{

if(Serial.available()>0)

{ dato=Serial.read();

switch (dato)

{

case 'R':

ir.sendRaw(powerEquipo,32,38);

delay(500);

break;

case 'T':

ir.sendRaw(chEmisoraUp,32,38);

delay(100);

break;

case 'U':

ir.sendRaw(chEmisoraDown,32,38);

delay(100);

break;

case 'V':

ir.sendRaw(playCd,32,38);

delay(100);

break;

case 'K': //Power the TV

ir.sendRaw(pwrTv,68,38);

delay(100);

break;

case 'L': //Volume +

ir.sendRaw(volUpTv,68,38);

delay(100);

break; case 'M': /

/Volume -

ir.sendRaw(volDownTv,68,38);

delay(100);

break;

case 'N': //Channel +

ir.sendRaw(chUpTv,68,38);

delay(100);

break;

case 'O': //Channel -

ir.sendRaw(chDownTv,68,38);

delay(100);

break;

case 'P': // Tv/Video

ir.sendRaw(videoTv,68,38);

delay(100);

break;

case 'A':

for (int i = 0; i < 3; i++)

{ ir.sendNEC(0xFF30CF, 32); // Power the DVD

delay(40);

}

break;

case 'B':

for (int i = 0; i < 3; i++)

{

ir.sendNEC(0xFF00FF, 32); // Open /Close cd tray

delay(40);

}

break;

case 'C':

for (int i = 0; i < 3; i++)

{

ir.sendNEC(0xFF52AD, 32); // Play cd

delay(40);

}

break;

case 'D':

for (int i = 0; i < 3; i++)

{

ir.sendNEC(0xFF728D, 32); // Stop

delay(40);

}

break;

} // fin del switch }

//fin del if

}//fin del loop

Autor: sistemasymicros
26 proyectos 6 seguidores 0 siguiendo

Ingeniero en electrónica. Maker, apasionado por la programación. Sigueme en sistemasymicros.

PROYECTOS RELACIONADOS
COMENTARIOS
Para publicar un comentario debes
COMENTARIOS
sistemasymicros
hace 9 meses

@ISACC por favor instala una versión anterior de arduino, prueba con la versión 1.6.0.

ISAAC
hace 9 meses

BUENAS NOCHES AMIGO GRACIAS POR COMPARTIR TUS CONOCIMIENTOS, PERO TENGO DUDAS SOBRE ESTE PROYECTO, COPIE EL CODIGO FINAL PARA ARDUINO Y ME DA PROBLEMAS AL COMPILARLO ME APARECE "\\IRREMOTE.H\\: NO SUCH FILE OR DIRECTORY" ACTUALICE LA LIBRERIA A UNA VERSION ANTERIORI Y NO SE COMPUSO , QUE PODRIA SER, ME PODRIAS AYUDAR?