{"id":10465,"date":"2026-05-08T11:34:21","date_gmt":"2026-05-08T09:34:21","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=10465"},"modified":"2026-05-08T11:35:18","modified_gmt":"2026-05-08T09:35:18","slug":"magic-mirror","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/","title":{"rendered":"MAGIC MIRROR"},"content":{"rendered":"\n<p>\u201cMagic Mirror\u201d es un espejo inteligente que te permite hacer el uso habitual de un espejo junto a otras funcionalidades como consultar el tiempo o poner m\u00fasica a trav\u00e9s de una pantalla integrada. La navegaci\u00f3n debe ser a trav\u00e9s de gestos para dar el efecto de que es algo m\u00e1s all\u00e1 de un simple dispositivo con botones, adem\u00e1s de que de esta forma evitamos tocar el espejo y que pueda hacer su funci\u00f3n de igual forma independientemente del uso.<br><\/p>\n\n\n\n<p>El concepto de la idea apareci\u00f3 de casualidad, y quiz\u00e1 ha sido un proyecto demasiado ambicioso para las limitaciones presupuestarias y t\u00e9cnicas que hemos tenido, pero que conseguimos solventar lo suficientemente bien dadas las circunstancias.&nbsp;<\/p>\n\n\n\n<p>Si bien no es algo totalmente original, ya que investigando podemos encontrar alg\u00fan proyecto similar (no como parte de esta asignatura en otros a\u00f1os, sino realizados por personas con conocimiento en la materia), creemos que dada la naturaleza del proyecto da pie a una cantidad muy alta de variantes que hemos tenido que ir adaptando a nuestras posibilidades.<\/p>\n\n\n\n<p>El objetivo real de este proyecto es hacer un prototipo funcional de lo que ser\u00eda el producto para su uso, ajust\u00e1ndonos a las funcionalidades de poder mostrar el tiempo en distintas ciudades, conectarnos a Spotify y poner m\u00fasica de entre una selecci\u00f3n y consultar noticias recientes.&nbsp;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"461\" height=\"1024\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-83-461x1024.png\" alt=\"\" class=\"wp-image-10481\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-83-461x1024.png 461w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-83-135x300.png 135w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-83-768x1707.png 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-83-691x1536.png 691w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-83.png 900w\" sizes=\"auto, (max-width: 461px) 100vw, 461px\" \/><\/figure>\n<\/div>\n\n\n<p>Para ello haremos uso de una Raspberry Pi junto al Arduino y otros componentes de los que hablaremos a continuaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">COMPONENTES<\/h2>\n\n\n\n<p>Antes de meternos en detalles de software o similar, debemos recopilar cu\u00e1les han sido todos los componentes que forman el modelo final.<\/p>\n\n\n\n<p>Para empezar, la estructura externa sobre la que se sustenta el espejo y en la que est\u00e1n todos los aparatos, cables y dem\u00e1s materiales ha sido realizada con impresi\u00f3n 3D, usando filamento PLA.&nbsp;<\/p>\n\n\n\n<p>El dise\u00f1o consiste en 4 m\u00f3dulos que se unen a trav\u00e9s de unos cilindros situados en los extremos (es decir, equiparando cilindros y agujeros que encajan entre piezas). De esta forma conseguimos transportarlo de forma m\u00e1s c\u00f3moda y no llevarlo montado siempre. Viene dise\u00f1ado espec\u00edficamente para que todo encaje bien, sobre todo el \u201cespejo\u201d.<\/p>\n\n\n\n<p>Adem\u00e1s, es lo suficientemente profundo para ser capaz de albergar la Raspberry Pi, Arduino, una protoboard y varios cables.<\/p>\n\n\n\n<p>Respecto al cristal, realmente usamos un metacrilato de doble v\u00eda. El efecto conseguido es el mismo, y nos facilitaba mucho la vida en t\u00e9rminos econ\u00f3micos. Otras alternativas son usar un cristal de doble v\u00eda (la opci\u00f3n m\u00e1s profesional, pero se va de presupuesto por bastante) o usar un cristal normal con un vinilo de efecto espejo.&nbsp;<\/p>\n\n\n\n<p>El tama\u00f1o es 30x30cm, un tama\u00f1o bastante v\u00e1lido para nuestro trabajo y sobre el que hemos construido la estructura 3D.<\/p>\n\n\n\n<p>Ahora podemos pasar a los componentes m\u00e1s t\u00e9cnicos, y no solo partes de la estructura.&nbsp;<\/p>\n\n\n\n<p>La lista de componentes y materiales usados en la fabricaci\u00f3n del prototipo final es la siguiente, sin incluir componentes no usados pero s\u00ed comprados para pruebas o de los que hab\u00eda intenci\u00f3n de usar, como LEDs o sensores.&nbsp;<br><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Raspberry Pi Zero 2W<\/h4>\n\n\n\n<p>Esta placa es el n\u00facleo del proyecto ya que se encarga de ejecutar la interfaz gr\u00e1fica, conectarse a internet para obtener informaci\u00f3n en tiempo real y gestionar la comunicaci\u00f3n con Arduino y el resto de componentes.&nbsp;<\/p>\n\n\n\n<p>La raspberry pi ejecuta un sistema operativo basado en Linux y sobre ella corren los scripts en Python encargados de mostrar toda la interfaz del espejo inteligente. Este sistema operativo est\u00e1 instalado en una tarjeta micro SD que se incorpora a la raspberry.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Pantalla<\/h4>\n\n\n\n<p>La pantalla utilizada es una pantalla TFT de 10,1 pulgadas. Esta tiene una resoluci\u00f3n de 1024&#215;600 p\u00edxeles y se trata de una pantalla con una tecnolog\u00eda IPS integrada, lo que mejora los \u00e1ngulos de visi\u00f3n y la calidad de la imagen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Controlador LCD<\/h4>\n\n\n\n<p>Para poder utilizar la pantalla correctamente fue necesario emplear una placa controladora LCD HDMI. Este componente act\u00faa como intermediario entre la Raspberry Pi y la pantalla, ya que convierte la se\u00f1al HDMI de la Raspberry en una se\u00f1al compatible con la pantalla TFT.<\/p>\n\n\n\n<p>El controlador viene con un mando a distancia que se utiliza para controlar par\u00e1metros como brillo, contraste o modo de imagen de la pantalla.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Sensor APDS-9960<\/h4>\n\n\n\n<p>Es el sensor principal que se conecta con Arduino. Funciona tanto como sensor de proximidad como sensor de gestos (tambi\u00e9n de colores, pero no lo usaremos). Para poder usarlo hemos tenido que soldarlo junto a los 6 pines que tiene, de forma que las conexiones fueran perfectas y no tener riesgo de que se perdiera en alg\u00fan momento. Usa una interfaz de comunicaci\u00f3n I2C a trav\u00e9s de los pines SDA y SCL. Tiene los t\u00edpicos pines de conexi\u00f3n a tierra y a voltaje (GND y VCC respectivamente), un pin INT que se conecta al pin digital D2 del arduino y es el que hace que funcionen los gestos.&nbsp;<\/p>\n\n\n\n<p>Por \u00faltimo, el pin VL es el que controla la corriente que le llega al LED infrarrojo, que precisamente es donde reside la magia del sensor. Este LED es el encargado de detectar tanto la proximidad como los gestos (es decir, a trav\u00e9s de sus 4 receptores puede detectar movimientos hacia arriba, abajo, izquierda y derecha).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">COSTES<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">COMPONENTE<\/td><td class=\"has-text-align-center\" data-align=\"center\">PRECIO (euros)<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Raspberry Pi Zero 2W<\/td><td class=\"has-text-align-center\" data-align=\"center\">20<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Pantalla TFT<\/td><td class=\"has-text-align-center\" data-align=\"center\">15<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Controlador LCD<\/td><td class=\"has-text-align-center\" data-align=\"center\">30<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Sensor APDS-9960<\/td><td class=\"has-text-align-center\" data-align=\"center\">1,5<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Tarjeta micro SD<\/td><td class=\"has-text-align-center\" data-align=\"center\">25<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Metacrilato<\/td><td class=\"has-text-align-center\" data-align=\"center\">15<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Cables varios<\/td><td class=\"has-text-align-center\" data-align=\"center\">15<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Filamento PLA<\/td><td class=\"has-text-align-center\" data-align=\"center\">15<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Soldador<\/td><td class=\"has-text-align-center\" data-align=\"center\">11<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Total<\/td><td class=\"has-text-align-center\" data-align=\"center\">147,5<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Al final ha quedado un presupuesto bastante por encima de lo esperado pero que a\u00fan as\u00ed no nos permiti\u00f3 realizar el trabajo de forma \u00f3ptima.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00d3DIGO<\/h2>\n\n\n\n<p>El funcionamiento del espejo se sustenta en 3 archivos de c\u00f3digo: uno de Arduino, que controla el sensor, un script de Python que muestra la interfaz y permite navegar por ella, y otro script de Python que act\u00faa como puente entre las se\u00f1ales del sensor recibidas por Arduino y el script encargado de hacer funcionar el espejo. Vamos a entrar en detalle en cada uno de ellos:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">arduino_sensor.ino<\/h4>\n\n\n\n<p>El c\u00f3digo de arduino no es muy complejo y su funci\u00f3n es la de manejar el funcionamiento del sensor.&nbsp;<\/p>\n\n\n\n<p>La funci\u00f3n setup() simplemente inicializa el sensor, ajusta los par\u00e1metros de sensibilidad (c\u00f3mo recibe las se\u00f1ales tanto de proximidad como de gestos) y establece en el sensor que se active \u00fanicamente el modo de proximidad.<\/p>\n\n\n\n<p>En la funci\u00f3n loop() delimitamos ambos modos. Primero arranca como detector de proximidad; si alcanza un valor superior a 240 (es decir, acercamos el dedo directamente al sensor) cambiar\u00e1 a modo gestos y se desactivar\u00e1 la lectura de proximidad.&nbsp;<\/p>\n\n\n\n<p>Despu\u00e9s entra en el modo gestos, donde se encarga de leer las direcciones de forma correcta (en el c\u00f3digo est\u00e1n girados ya que la posici\u00f3n original del sensor es distinta a la que tenemos que usar para su disposici\u00f3n en el proyecto). Tambi\u00e9n tiene una forma de apagar acercando el dedo al sensor de nuevo, haciendo que vuelva al estado inicial.<\/p>\n\n\n\n<p>La vuelta a ese estado inicial se hace a trav\u00e9s de una funci\u00f3n <strong>resetearModo()<\/strong> que desactiva el modo de gestos y vuelve a activar el sensor de proximidad.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">puente.py<\/h4>\n\n\n\n<p>Este archivo es bastante simple; solo recibe la se\u00f1al de START de Arduino (que ya hemos visto que es cuando el valor de proximidad del sensor llega a 255, es decir, a efectos pr\u00e1cticos, que hemos acercado el dedo al sensor) y genera un subproceso que ejecuta el script de la interfaz. Adem\u00e1s, genera una ventana negra para que sea m\u00e1s natural el paso del estado base a la interfaz real del sistema (en la pr\u00e1ctica, por la limitada capacidad de la raspberry pi, no funciona exactamente como deber\u00eda, pero esa es la idea tras esas l\u00edneas de c\u00f3digo).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">mirror_gui.py<\/h4>\n\n\n\n<p>Dentro de este script recogemos todo lo relativo a dise\u00f1o, navegaci\u00f3n, interpretaci\u00f3n de gestos y todo lo que dirige la interfaz.&nbsp;<\/p>\n\n\n\n<p>Antes de entrar en el c\u00f3digo, es importante hablar de los datos que se ofrecen. Tanto los datos de clima y temperatura ofrecidos, como las noticias, como las playlists y canciones que suenan a trav\u00e9s de Spotify, se obtienen conect\u00e1ndonos a las respectivas APIs (API de openWeather, Spotify for Developers y de El Pais). <\/p>\n\n\n\n<p>Adem\u00e1s, ha sido necesario el uso de distintas librer\u00edas. Destacamos la librer\u00eda <strong>spotipy<\/strong>, fundamental para manejar todo lo relacionado con la funcionalidad asociada a spotify (coger las playlists de la cuenta real, activar spotify y moverse entre canciones de forma real, coger im\u00e1genes de las canciones que se reproducen), y la librer\u00eda <strong>tkinter,<\/strong> que es la encargada de hacer todo lo gr\u00e1fico (colocaci\u00f3n de los elementos, abrir la ventana con esa est\u00e9tica).<\/p>\n\n\n\n<p>Respecto al c\u00f3digo, se divide en distintas zonas que se encargan de funciones concretas dentro de la interfaz del espejo.<\/p>\n\n\n\n<p>La primera parte corresponde a toda la configuraci\u00f3n inicial del programa. Aqui se importan las librer\u00edas necesarias y se configuran elementos como las credenciales de Spotify, la API meteorol\u00f3gica o las variables globales. Tambi\u00e9n se inicializa la ventana principal de tkinter en pantalla completa.<\/p>\n\n\n\n<p>Posteriormente se definen todas las variables de navegaci\u00f3n. Estas variables almacenan informaci\u00f3n sobre el men\u00fa en el que nos encontramos actualmente, que ciudad del tiempo est\u00e1 seleccionada o qu\u00e9 playlist se encuentra activa.<\/p>\n\n\n\n<p>Tras esto nos encontramos con la secci\u00f3n que inicializa Spotify. Para ello usamos la librer\u00eda <strong>spotipy <\/strong>junto al sistema OAuth de Spotify for Developers. Luego existe una secci\u00f3n dedicada a la carga de im\u00e1genes c\u00f3mo los iconos de tiempo y Spotify. Estas im\u00e1genes son redimensionadas autom\u00e1ticamente para adaptarse correctamente a la interfaz.<\/p>\n\n\n\n<p>A continuaci\u00f3n se construye toda la interfaz gr\u00e1fica utilizando tkinter. La parte superior de la pantalla contiene la hora y la fecha. Debajo se sit\u00faa el contenido que va cambiando dependiendo de la secci\u00f3n en la que se encuentre el usuario.<\/p>\n\n\n\n<p>El sistema de comunicaci\u00f3n con Arduino se implementa mediante la funci\u00f3n <strong>iniciar_serial(). <\/strong>Esta funci\u00f3n abre un puerto serie y mantiene un hilo secundario constantemente escuchando los datos enviados por Arduino. Cuando recibe palabras como \u201cRIGHT\u201d, \u201cLEFT\u201d, \u201cUP\u201d o \u201cDOWN\u201d, ejecuta autom\u00e1ticamente las funciones correspondientes de navegaci\u00f3n.<\/p>\n\n\n\n<p>Las funciones <strong>gesto_derecha()<\/strong>,&nbsp; <strong>gesto_izquierda()<\/strong>,&nbsp; <strong>gesto_arriba()<\/strong> y <strong>&nbsp;gesto_abajo() <\/strong>son las encargadas de gestionar toda la navegaci\u00f3n del sistema. Dependiendo de la vista activa, un mismo gesto puede tener distintos efectos.<\/p>\n\n\n\n<p>La funci\u00f3n <strong>mostrar_menu() <\/strong>genera la pantalla principal del sistema. En ella aparecen los accesos principales al clima y Spotify, adem\u00e1s de una secci\u00f3n inferior con noticias recientes obtenidas autom\u00e1ticamente mediante RSS desde El Pa\u00eds.<\/p>\n\n\n\n<p>Por otro lado, <strong>mostrar_tiempo()<\/strong> se encarga de toda la interfaz meteorol\u00f3gica. Esta funci\u00f3n realiza peticiones a la API de OpenWeather y muestra tanto el tiempo actual como una previsi\u00f3n por horas y por d\u00edas. Adem\u00e1s, se puede ver el tiempo en distintas ciudades.<\/p>\n\n\n\n<p>La parte relacionada con Spotify se divide entre las funciones <strong>mostrar_spotify()<\/strong>, <strong>play()<\/strong> y <strong>reproductor()<\/strong>. La primera muestra las playlists disponibles; la segunda inicia la reproducci\u00f3n de la playlist seleccionada; y la tercera construye la interfaz del reproductor musical.<\/p>\n\n\n\n<p>Finalmente, el programa se ejecuta creando una instancia de la clase principal MagicMirror, que contiene toda la l\u00f3gica del sistema, y lanzando el bucle principal de tkinter mediante <strong>root.mainloop()<\/strong>. Esto mantiene activa la interfaz de forma permanente mientras el espejo est\u00e9 funcionando.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Interfaz<\/h4>\n\n\n\n<p>Nada m\u00e1s arrancar, se muestra la siguiente interfaz:<\/p>\n\n\n\n<p>La secci\u00f3n de noticias no es accesible m\u00e1s all\u00e1 (lo llegamos a implementar, pero abrir la noticia de forma extensa implica una capacidad de la raspberry con la que no contamos, por lo que la experiencia de uso empeorar\u00eda bastante, ya que de hecho ya limita algo los cambios de interfaces).&nbsp;<\/p>\n\n\n\n<p>La forma de navegar a trav\u00e9s de los gestos es:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Izquierda-Derecha para seleccionar las opciones de cada interfaz (en el men\u00fa principal, cambiar entre Clima y Spotify; en el men\u00fa Clima, cambiar entre ciudades; y en el men\u00fa Spotify, cambiar entre playlists o avanzar\/retroceder canci\u00f3n)<\/li>\n\n\n\n<li>Arriba para aceptar (funciona como un \u201cEnter\u201d una vez la opci\u00f3n est\u00e1 seleccionada)<\/li>\n\n\n\n<li>Abajo para volver al men\u00fa principal, en cualquier momento<\/li>\n<\/ul>\n\n\n\n<p>Adicionalmente y por comodidad a la hora de hacer pruebas &#8211; y detectar fallos con el sensor &#8211; es posible navegar a trav\u00e9s de teclas (siempre y cuando est\u00e9s visualizando la pantalla a trav\u00e9s de Raspberry Connect desde el ordenador, con la cuenta vinculada a la raspberry). De hecho, la transformaci\u00f3n de se\u00f1ales de Arduino a flujo en la interfaz es realmente decirle al programa que se pulse la tecla correspondiente (cada gesto equivale a su flecha). Esto hace m\u00e1s sencillo la conversi\u00f3n de un c\u00f3digo a otro.<\/p>\n\n\n\n<p>M\u00e1s detalles del funcionamiento se pueden observar en los videos del siguiente enlace a la carpeta de Drive:<\/p>\n\n\n\n<p>\/<a href=\"https:\/\/drive.google.com\/drive\/folders\/1GN1Ls8ZNRUsrXbYUYDW2-3vjfRlq9g7W?usp=drive_link\">https:\/\/drive.google.com\/drive\/folders\/1GN1Ls8ZNRUsrXbYUYDW2-3vjfRlq9g7W?usp=drive_link<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">PROBLEMAS Y SOLUCIONES<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">Organizaci\u00f3n<\/h4>\n\n\n\n<p>El primer problema a mencionar es posiblemente las limitaciones a la hora de plantear el sistema. Al requerir de una raspberry pi para funcionar, hemos tenido problemas para decidir c\u00f3mo de necesario era usar seg\u00fan qu\u00e9 sensores u otros componentes relacionados con Arduino, ya que este era el objetivo principal de la pr\u00e1ctica y era peligroso salirse de los m\u00e1rgenes delimitados. El tiempo requerido para organizar bien qu\u00e9 quer\u00edamos exactamente, para no pasarnos ni quedarnos cortos fue realmente un quebradero de cabeza. A lo largo del desarrollo planteamos muchas opciones, como usar sensores t\u00e1ctiles capacitivos (TTP223) para movernos por el espejo (descartado porque la idea de que lo movieras en el aire era bastante m\u00e1s atractiva), usar un sensor de movimiento PIR HC-SR501 para encender la pantalla al detectar movimiento (descartado porque la opci\u00f3n de acercar el dedo era m\u00e1s fiable) o a\u00f1adir luces LED alrededor del metacrilato (descartado porque pod\u00eda dar problemas con la visi\u00f3n de la pantalla al darle luz directa).<\/p>\n\n\n\n<p>Optamos por hacerlo seg\u00fan est\u00e1, manejando \u00fanicamente el sensor APDS-9960, por comodidad, ya que usar m\u00e1s componentes nos pod\u00eda dar muchos m\u00e1s problemas y de esta forma es perfectamente funcional, combinando ambos mundos.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Dise\u00f1o 3D<\/h4>\n\n\n\n<p>El dise\u00f1o 3D tambi\u00e9n result\u00f3 ciertamente complejo, aunque no por la propia naturaleza del proyecto y la estructura sino por querer hacerlo funcional, desmontable y autosuficiente. Es decir, los principales problemas asociados a esto vienen de incluir las ranuras para el cristal, soportes para la pantalla o el hueco asociado para el sensor, todo esto mientras deb\u00eda ser suficientemente grande para dar estabilidad a la estructura y poder guardar dentro los componentes. Esto hizo que, si bien el tiempo que tard\u00f3 es bastante (aproximadamente 30 horas de impresi\u00f3n entre las 4 piezas), el tiempo inicial era algo poco sostenible, y hubo que reajustar muchos detalles del dise\u00f1o as\u00ed como el gramaje, n\u00famero de capas y otros factores de la impresi\u00f3n.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Presupuesto<\/h4>\n\n\n\n<p>Muchos otros problemas han estado ligados al presupuesto.&nbsp;<\/p>\n\n\n\n<p>Para empezar, la Raspberry Pi encargada de gestionar todos los procesos operativos era una versi\u00f3n bastante pobre, muy lejos de las versiones caras. Por tanto, los tiempos de carga son lentos, ha habido que reducir contenido y reacondicionar algunos m\u00e9todos de navegaci\u00f3n en el producto final.<\/p>\n\n\n\n<p>El sensor funciona pero no es totalmente fiable, sobre todo teniendo en cuenta la idea del uso. Al estar fijo en una posici\u00f3n, es verdaderamente dif\u00edcil que capte todos los gestos bien, por simple l\u00f3gica de c\u00f3mo funciona el sensor infrarrojo (por ejemplo, si est\u00e1s situado a la izquierda del sensor, el movimiento previo a hacer el gesto derecha-izquierda para que detecte \u2018LEFT\u2019 ya es le\u00eddo por el sensor, haciendo que pueda no interpretar bien los datos). Con un presupuesto mayor habr\u00eda sido posible usar una c\u00e1mara que detectara bien con IA o con alg\u00fan otro modo los gestos de manera m\u00e1s fiable (la idea original era esa, pero por el motivo del presupuesto y de productos que no eran lo que esper\u00e1bamos acab\u00f3 quedando as\u00ed).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Montaje<\/h4>\n\n\n\n<p>El montaje tambi\u00e9n ha sido algo complicado, principalmente en 2 componentes; por un lado, la pantalla, o mejor dicho, el controlador de la pantalla, y por otro lado el sensor.&nbsp;<\/p>\n\n\n\n<p>Respecto de lo primero, por simple gravedad era muy dif\u00edcil ser capaz de que se mantuviera pegado, ya que ten\u00eda que estar en la parte trasera de la pantalla (para funcionar), pero al ser la pantalla vertical, y estar atado a distintas conexiones, el peso hac\u00eda que se cayera continuamente. Finalmente conseguimos que se mantuviera pegado con m\u00e1s capas de cinta, pero es una soluci\u00f3n nada \u00f3ptima.&nbsp;<\/p>\n\n\n\n<p>Con el sensor la historia es parecida. El agujero en el que tiene que usarse va justo para que se vea el infrarrojo, pero es algo muy delicado, por tanto si no est\u00e1 suficientemente \u201cfuera\u201d de la estructura (es decir, debe sobresalir ligeramente) confundir\u00e1 lo que recibe con la propia caja y no funcionar\u00e1 de forma correcta para detectar gestos.&nbsp;<\/p>\n\n\n\n<p>Esto, sumado a que ha sido necesario transportar la estructura varias veces, nos lleva a que es posiblemente el mayor problema, ya que sin que funcione se pierde toda la magia del proyecto.<\/p>\n\n\n\n<p><br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u201cMagic Mirror\u201d es un espejo inteligente que te permite hacer el uso habitual de un espejo junto a otras funcionalidades como consultar el tiempo o poner m\u00fasica a trav\u00e9s de una pantalla integrada. La&#46;&#46;&#46;<\/p>\n","protected":false},"author":338,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-10465","post","type-post","status-publish","format-standard","hentry","category-proyectos"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>MAGIC MIRROR - Proyectos con Arduino.<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MAGIC MIRROR - Proyectos con Arduino.\" \/>\n<meta property=\"og:description\" content=\"\u201cMagic Mirror\u201d es un espejo inteligente que te permite hacer el uso habitual de un espejo junto a otras funcionalidades como consultar el tiempo o poner m\u00fasica a trav\u00e9s de una pantalla integrada. La&#046;&#046;&#046;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-08T09:34:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-08T09:35:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-83.png\" \/>\n\t<meta property=\"og:image:width\" content=\"900\" \/>\n\t<meta property=\"og:image:height\" content=\"2000\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"seytrmo2526g10\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"seytrmo2526g10\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/magic-mirror\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/magic-mirror\\\/\"},\"author\":{\"name\":\"seytrmo2526g10\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/f5a06eb9ecf508c72a635530eeef3ec2\"},\"headline\":\"MAGIC MIRROR\",\"datePublished\":\"2026-05-08T09:34:21+00:00\",\"dateModified\":\"2026-05-08T09:35:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/magic-mirror\\\/\"},\"wordCount\":2996,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/magic-mirror\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2026\\\/05\\\/image-83-461x1024.png\",\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/magic-mirror\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/magic-mirror\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/magic-mirror\\\/\",\"name\":\"MAGIC MIRROR - Proyectos con Arduino.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/magic-mirror\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/magic-mirror\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2026\\\/05\\\/image-83-461x1024.png\",\"datePublished\":\"2026-05-08T09:34:21+00:00\",\"dateModified\":\"2026-05-08T09:35:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/magic-mirror\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/magic-mirror\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/magic-mirror\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2026\\\/05\\\/image-83.png\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2026\\\/05\\\/image-83.png\",\"width\":900,\"height\":2000},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/magic-mirror\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MAGIC MIRROR\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"name\":\"Proyectos con Arduino.\",\"description\":\"Blog de proyectos de Arduino de alumnos de la URJC\",\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\",\"name\":\"Universidad Rey Juan Carlos\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"width\":745,\"height\":288,\"caption\":\"Universidad Rey Juan Carlos\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/f5a06eb9ecf508c72a635530eeef3ec2\",\"name\":\"seytrmo2526g10\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b9d84ae23acfb19c054e2d7701f7697fec7d33976db1d0c24dbbd077e33ad653?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b9d84ae23acfb19c054e2d7701f7697fec7d33976db1d0c24dbbd077e33ad653?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b9d84ae23acfb19c054e2d7701f7697fec7d33976db1d0c24dbbd077e33ad653?s=96&d=mm&r=g\",\"caption\":\"seytrmo2526g10\"},\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/author\\\/seytrmo2526g10\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"MAGIC MIRROR - Proyectos con Arduino.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/","og_locale":"es_ES","og_type":"article","og_title":"MAGIC MIRROR - Proyectos con Arduino.","og_description":"\u201cMagic Mirror\u201d es un espejo inteligente que te permite hacer el uso habitual de un espejo junto a otras funcionalidades como consultar el tiempo o poner m\u00fasica a trav\u00e9s de una pantalla integrada. La&#46;&#46;&#46;","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2026-05-08T09:34:21+00:00","article_modified_time":"2026-05-08T09:35:18+00:00","og_image":[{"width":900,"height":2000,"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-83.png","type":"image\/png"}],"author":"seytrmo2526g10","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"seytrmo2526g10","Tiempo de lectura":"15 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/"},"author":{"name":"seytrmo2526g10","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/f5a06eb9ecf508c72a635530eeef3ec2"},"headline":"MAGIC MIRROR","datePublished":"2026-05-08T09:34:21+00:00","dateModified":"2026-05-08T09:35:18+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/"},"wordCount":2996,"commentCount":0,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-83-461x1024.png","articleSection":["Proyectos"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/","name":"MAGIC MIRROR - Proyectos con Arduino.","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-83-461x1024.png","datePublished":"2026-05-08T09:34:21+00:00","dateModified":"2026-05-08T09:35:18+00:00","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/#primaryimage","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-83.png","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-83.png","width":900,"height":2000},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/magic-mirror\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"MAGIC MIRROR"}]},{"@type":"WebSite","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","name":"Proyectos con Arduino.","description":"Blog de proyectos de Arduino de alumnos de la URJC","publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization","name":"Universidad Rey Juan Carlos","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","width":745,"height":288,"caption":"Universidad Rey Juan Carlos"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/f5a06eb9ecf508c72a635530eeef3ec2","name":"seytrmo2526g10","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/b9d84ae23acfb19c054e2d7701f7697fec7d33976db1d0c24dbbd077e33ad653?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/b9d84ae23acfb19c054e2d7701f7697fec7d33976db1d0c24dbbd077e33ad653?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b9d84ae23acfb19c054e2d7701f7697fec7d33976db1d0c24dbbd077e33ad653?s=96&d=mm&r=g","caption":"seytrmo2526g10"},"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/author\/seytrmo2526g10\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/10465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/users\/338"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/comments?post=10465"}],"version-history":[{"count":8,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/10465\/revisions"}],"predecessor-version":[{"id":10485,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/10465\/revisions\/10485"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=10465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=10465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=10465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}