{"id":9218,"date":"2024-12-19T22:25:47","date_gmt":"2024-12-19T21:25:47","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=9218"},"modified":"2024-12-19T22:25:48","modified_gmt":"2024-12-19T21:25:48","slug":"coffeeto","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/coffeeto\/","title":{"rendered":"Coffeeto"},"content":{"rendered":"\n<p class=\"has-text-align-center has-luminous-vivid-amber-color has-text-color has-link-color has-small-font-size wp-elements-a730dd8e9bd610dd4a1f41a8e1779f21\">Proyecto desarrollado por Sara Gallego Trigal para la asignatura de Dise\u00f1o de Sistemas Empotrados.<\/p>\n\n\n\n<h1 class=\"wp-block-heading has-pale-cyan-blue-color has-text-color has-link-color has-large-font-size wp-elements-32c997fe22bdfdfd8cff81b86b344531\" style=\"text-decoration:underline\"><a>1. Sobre el proyecto.<\/a><\/h1>\n\n\n\n<p>El objetivo inicial del proyecto era dise\u00f1ar un robot asistente que mejorara la experiencia de preparar bebidas calientes, como caf\u00e9 e infusiones, empleando \u00fanicamente parte de los componentes que conten\u00eda el kit Elegoo UNO R3 Super Starter; ni uno m\u00e1s, ni uno menos.<\/p>\n\n\n\n<p>As\u00ed, el robot deb\u00eda ser capaz de realizar tareas como servir agua caliente, medir la temperatura, remover los ingredientes, y controlar el tiempo de reposo mediante un temporizador, asegurando precisi\u00f3n y comodidad para el usuario.<\/p>\n\n\n\n<p>De estas ideas surgi\u00f3 Coffeeto, un robot que no solo automatiza pasos clave, sino que tambi\u00e9n a\u00f1ade un toque de personalizaci\u00f3n con opciones de temperatura y alertas visuales.<\/p>\n\n\n\n<p>Coffeeto se presenta como un simp\u00e1tico aliado en la cocina, con una estructura sencilla pero eficaz que promete una bebida perfecta en cada preparaci\u00f3n.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-imagen-1024x576.png\" alt=\"\" class=\"wp-image-9226\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-imagen-1024x576.png 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-imagen-300x169.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-imagen-768x432.png 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-imagen-1536x864.png 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-imagen.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<h1 class=\"wp-block-heading has-pale-cyan-blue-color has-text-color has-link-color has-large-font-size wp-elements-7ad4adafb2b89ea57f3938735613cccc\" style=\"text-decoration:underline\"><a>2. Implementaci\u00f3n.<\/a><\/h1>\n\n\n\n<p>Coffeeto se compone de diversos componentes electr\u00f3nicos integrados en un dise\u00f1o funcional:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Placa Elegoo UNO R3:<\/strong> El cerebro del robot, donde se controla toda la l\u00f3gica.<\/li>\n\n\n\n<li><strong>Pantalla LCD:<\/strong> Sirve como interfaz para el usuario, mostrando mensajes y gu\u00edas para este.<\/li>\n\n\n\n<li><strong>Sensor de humedad y temperatura (DHT11):<\/strong> Mide la temperatura para alcanzar el valor deseado.<\/li>\n\n\n\n<li><strong>Sensor ultras\u00f3nico (HC-SR04): <\/strong>Detecta la presencia y posici\u00f3n de la taza para garantizar su correcta colocaci\u00f3n.<\/li>\n\n\n\n<li><strong>Microservo (VarSpeedServo):<\/strong> Controla el movimiento del brazo que remueve la bebida.<\/li>\n\n\n\n<li><strong>Motor DC (L293D):<\/strong> Remueve los ingredientes con precisi\u00f3n.<\/li>\n\n\n\n<li><strong>M\u00f3dulo receptor IR y mando:<\/strong> Permite navegar por los men\u00fas con un control remoto.<\/li>\n\n\n\n<li><strong>LED amarillo:<\/strong> Sirve como indicador visual cuando la bebida est\u00e1 lista y para la correcta colocaci\u00f3n de la taza.<\/li>\n<\/ul>\n\n\n\n<p>Cada componente fue elegido con el objetivo de garantizar funcionalidad, facilidad de uso y un montaje sencillo.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"531\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2024-12-19-153615-1024x531.png\" alt=\"\" class=\"wp-image-9229\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2024-12-19-153615-1024x531.png 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2024-12-19-153615-300x156.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2024-12-19-153615-768x398.png 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2024-12-19-153615-1536x796.png 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2024-12-19-153615-2048x1062.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<h1 class=\"wp-block-heading has-pale-cyan-blue-color has-text-color has-link-color has-large-font-size wp-elements-570a15946ab60f353afa8f9adbbef734\" style=\"text-decoration:underline\"><a>3. Los pasos dados.<\/a><\/h1>\n\n\n\n<p>El desarrollo de Coffeeto se realiz\u00f3 en varias etapas cuidadosamente planificadas para garantizar un avance estructurado y eficiente (y que surgieran la menor cantidad de problemas posibles):<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-amber-color has-text-color has-link-color has-medium-font-size wp-elements-7b75a067c48c7225c55f254a470f4602\"><a>1. Planificaci\u00f3n.<\/a><\/h2>\n\n\n\n<p>En esta fase inicial, se definieron los objetivos principales y las funciones clave que deb\u00eda tener el robot: medir la temperatura, remover los ingredientes, controlar el tiempo de reposo y ofrecer alertas visuales y sonoras.<\/p>\n\n\n\n<p>Adem\u00e1s, se realizaron bocetos preliminares de lo que podr\u00eda ser la estructura del robot. Se barajaron varias opciones, incluyendo un dise\u00f1o compacto con un brazo articulado y una estructura modular que integrara todos los componentes. Finalmente, se opt\u00f3 por un dise\u00f1o sencillo que cumpliera con las funcionalidades b\u00e1sicas, asegurando estabilidad y \u201cfacilidad\u201d de montaje.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2024-12-19-184055-1024x576.png\" alt=\"\" class=\"wp-image-9230\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2024-12-19-184055-1024x576.png 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2024-12-19-184055-300x169.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2024-12-19-184055-768x432.png 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2024-12-19-184055-1536x863.png 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2024-12-19-184055-2048x1151.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-amber-color has-text-color has-link-color has-medium-font-size wp-elements-91259d7f53a0c1fe184d52c7d092dd2c\"><a>2. Dise\u00f1o del circuito.<\/a><\/h2>\n\n\n\n<p>Una vez definidos los objetivos, se procedi\u00f3 al dise\u00f1o del circuito con todos los componentes principales:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Placa Elegoo UNO R3 como n\u00facleo del robot.<\/li>\n\n\n\n<li>Sensores (ultras\u00f3nico y DHT11), encargados de detectar la posici\u00f3n de la taza y medir la temperatura.<\/li>\n\n\n\n<li>Actuadores, como el microservo y el motor DC para el movimiento del brazo y el dispositivo removedor.<\/li>\n\n\n\n<li>Pantalla LCD para la interacci\u00f3n con el usuario.<\/li>\n\n\n\n<li>M\u00f3dulo receptor IR y control remoto para la navegaci\u00f3n por los men\u00fas.<\/li>\n\n\n\n<li>Buzzer y LED, para proporcionar alertas visuales y sonoras durante el proceso de preparaci\u00f3n de bebidas.<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"453\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/DSE-Circuito-Coffeeto-inicial-con-buzzer-1024x453.png\" alt=\"\" class=\"wp-image-9232\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/DSE-Circuito-Coffeeto-inicial-con-buzzer-1024x453.png 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/DSE-Circuito-Coffeeto-inicial-con-buzzer-300x133.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/DSE-Circuito-Coffeeto-inicial-con-buzzer-768x340.png 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/DSE-Circuito-Coffeeto-inicial-con-buzzer-1536x679.png 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/DSE-Circuito-Coffeeto-inicial-con-buzzer.png 1879w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"has-text-align-center has-vivid-cyan-blue-color has-text-color has-link-color has-small-font-size wp-elements-a1e5d52d6e8c2e24af7e9107d80ae3c4\"><strong><em>En el circuito, aparece un potenci\u00f3metro. Esto en realidad se utiliza para representar el sensor de temperatura y humedad DHT11, ya que en la plataforma de Tinkercad no existe este elemento.<\/em><\/strong><\/p>\n\n\n\n<p class=\"has-luminous-vivid-amber-color has-text-color has-link-color has-medium-font-size wp-elements-39f54823cc451683e791a1fb2f4205e0\"><a><strong>3. Pruebas iniciales.<\/strong><\/a><\/p>\n\n\n\n<p>Antes de montar el circuito, se prob\u00f3 cada componente de manera individual para verificar su correcto funcionamiento. Estas pruebas incluyeron:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Detectar la distancia con el sensor ultras\u00f3nico.<\/li>\n\n\n\n<li>Comprobar el correcto funcionamiento de la pantalla LCD.<\/li>\n\n\n\n<li>Calcular la temperatura con el sensor DHT11 y asegurar su precisi\u00f3n.<\/li>\n\n\n\n<li>Verificar los movimientos del microservo y del motor DC.<\/li>\n\n\n\n<li>Confirmar la recepci\u00f3n de se\u00f1ales IR mediante el control remoto.<\/li>\n<\/ul>\n\n\n\n<p>Y es aqu\u00ed donde empezaron a surgir los primeros problemas, ya que muchos cables de la caja no funcionaban correctamente, y algunos de los componentes estaban estropeados, como el receptor de se\u00f1ales IR, que, s\u00ed que recib\u00eda se\u00f1ales, pero aleatorias, mostrando para un mismo bot\u00f3n c\u00f3digos diferentes en cada pulsaci\u00f3n.<\/p>\n\n\n\n<p>As\u00ed, estas pruebas permitieron identificar y solucionar fallos en componentes espec\u00edficos, como los cables defectuosos que fueron reemplazados por otros en buen estado, y el sensor IR, que se cambi\u00f3 por otro.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-amber-color has-text-color has-link-color has-medium-font-size wp-elements-afdeb2f394d4b258565779006620e626\"><a>4. Montaje del circuito inicial.<\/a><\/h2>\n\n\n\n<p>Una vez asegurado que los componentes funcionaban correctamente, se procedi\u00f3 al montaje f\u00edsico del circuito para poder realizar las pruebas pertinentes tras implementar el c\u00f3digo con el comportamiento del robot.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-amber-color has-text-color has-link-color has-medium-font-size wp-elements-c6be425a112dfe1ec382ae08a3585058\"><a>5. Definici\u00f3n del comportamiento de Coffeeto (flujo).<\/a><\/h2>\n\n\n\n<p>Para comenzar con la etapa de programaci\u00f3n e implementaci\u00f3n del c\u00f3digo, se realiz\u00f3 un documento en el que se describ\u00eda exactamente el flujo de informaci\u00f3n y comportamiento de Coffeeto con el objetivo de simplificar el proceso.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"724\" height=\"1024\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-descripcion-de-comportamiento-Diseno-de-Sistemas-Empotrados-724x1024.png\" alt=\"\" class=\"wp-image-9236\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-descripcion-de-comportamiento-Diseno-de-Sistemas-Empotrados-724x1024.png 724w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-descripcion-de-comportamiento-Diseno-de-Sistemas-Empotrados-212x300.png 212w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-descripcion-de-comportamiento-Diseno-de-Sistemas-Empotrados-768x1086.png 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-descripcion-de-comportamiento-Diseno-de-Sistemas-Empotrados-1086x1536.png 1086w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-descripcion-de-comportamiento-Diseno-de-Sistemas-Empotrados.png 1414w\" sizes=\"auto, (max-width: 724px) 100vw, 724px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-amber-color has-text-color has-link-color has-medium-font-size wp-elements-fe0d9a1f7a6d037466dc96a36011eff9\"><a>6. Integraci\u00f3n y programaci\u00f3n del c\u00f3digo.<\/a><\/h2>\n\n\n\n<p>Una vez asegurado que los componentes funcionaban correctamente y definido el flujo de comportamiento, se programaron las funciones del robot para trabajar de manera conjunta. Fue en esta etapa cuando surgieron conflictos con los temporizadores (timers), ya que tanto el sensor IR como el microservo y el buzzer intentaban utilizar el mismo recurso del microcontrolador, causando errores en su funcionamiento.<\/p>\n\n\n\n<p>Tras intentar solucionarlo por todos los medios posibles (cambiando las librer\u00edas que empleaban los componentes implicados, cambiando los pines) y no obtener resultado, se opt\u00f3 por eliminar el buzzer y utilizar una biblioteca espec\u00edfica para el microservo que evitara estos conflictos (VarSpeedServo.h).<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-cfa95d17eba4a7750267a84903c7db16\" style=\"color:#af9b81\"><a><em>6.1. Redise\u00f1o del circuito.<\/em><\/a><\/h3>\n\n\n\n<p>Tras eliminar el buzzer, se realiz\u00f3 un redise\u00f1o del circuito quitando elementos que ya no eran necesarios, quedando de la siguiente forma<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"453\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/DSE-Circuito-Coffeeto-final-1024x453.png\" alt=\"\" class=\"wp-image-9242\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/DSE-Circuito-Coffeeto-final-1024x453.png 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/DSE-Circuito-Coffeeto-final-300x133.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/DSE-Circuito-Coffeeto-final-768x340.png 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/DSE-Circuito-Coffeeto-final-1536x679.png 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/DSE-Circuito-Coffeeto-final.png 1879w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"has-text-align-center has-vivid-cyan-blue-color has-text-color has-link-color has-small-font-size wp-elements-a1e5d52d6e8c2e24af7e9107d80ae3c4\"><strong><em>En el circuito, aparece un potenci\u00f3metro. Esto en realidad se utiliza para representar el sensor de temperatura y humedad DHT11, ya que en la plataforma de Tinkercad no existe este elemento.<\/em><\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-amber-color has-text-color has-link-color has-medium-font-size wp-elements-9880725ad95a4abc110afb0c6ae1eeb2\"><a>7. Depuraci\u00f3n del c\u00f3digo.<\/a><\/h2>\n\n\n\n<p>Tras las modificaciones realizadas en el circuito, se ajust\u00f3 este para optimizar su funcionamiento y se resolvieron problemas estructurales.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-amber-color has-text-color has-link-color has-medium-font-size wp-elements-67567f58f94121492f43f0ad09816ebc\"><a>8. Montaje de Coffeeto.<\/a><\/h2>\n\n\n\n<p>En esta etapa, se pas\u00f3 al montaje de la estructura y circuito finales de Coffeeto.<\/p>\n\n\n\n<p>Primero, se realiz\u00f3 la estructura del robot. Para ello, se emplearon dos cajas (una para el cuerpo y otra que encajaba perfectamente en la estructura donde se situar\u00eda el circuito). Estas se pintaron a mano con pintura acr\u00edlica (\ud83d\udc2emuuuchas muchas capas de pintura) y se les realizaron las perforaciones pertinentes en los lugares donde ir\u00edan algunos de los componentes, como el agujerito para el LED amarillo, la pantalla LCD, el receptor IR o el brazo con el servo y el motor. Adem\u00e1s, se dise\u00f1\u00f3 una estructura rectangular para tapar donde ir\u00eda el brazo removedor y dar una apariencia m\u00e1s limpia al robot.<\/p>\n\n\n\n<p>Todo esto se peg\u00f3 y decor\u00f3 para darle el toque final al aspecto de Coffeeto, intentando aportarle una apariencia simp\u00e1tica y agradable.<\/p>\n\n\n\n<p>Despu\u00e9s, se desmont\u00f3 el circuito completo que se hab\u00eda empleado para probar el c\u00f3digo fuera de la estructura, y se comenz\u00f3 a montarlo dentro de la estructura final del robot empleando cables m\u00e1s largos y adaptando la estructura a las necesidades de cada uno de los componentes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-amber-color has-text-color has-link-color has-medium-font-size wp-elements-edeaae0fddd2005bd2c65bdcf50f9232\"><a>9. Presentaci\u00f3n final.<\/a><\/h2>\n\n\n\n<p>En la etapa final, una vez integrado todo en una misma estructura, Coffeeto fue sometido a pruebas completas, ejecutando tanto funciones manuales como autom\u00e1ticas. El robot demostr\u00f3 (tras unos cuantos ajustes y retoques) ser capaz de preparar caf\u00e9 e infusiones, llevando a cabo las tareas para las que fue creado, como medir la temperatura, controlar el tiempo de reposo y remover los ingredientes de forma precisa.<\/p>\n\n\n\n<p>El resultado fue un prototipo funcional que cumpli\u00f3 con casi todos los objetivos iniciales del proyecto, listo para ser presentado y utilizado.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"648\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_195437914-1024x648.png\" alt=\"\" class=\"wp-image-9246\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_195437914-1024x648.png 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_195437914-300x190.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_195437914-768x486.png 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_195437914.png 1308w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<br>\n<figure class=\"wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"video-container\"><iframe loading=\"lazy\" title=\"[DSE - Grupo 15] Coffeeto - Sara Gallego\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/hs1UxEj6doI?feature=oembed&#038;wmode=opaque\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading has-pale-cyan-blue-color has-text-color has-link-color has-large-font-size wp-elements-6a8d6f62fcdb0b4c131678186fb1e0df\" style=\"text-decoration:underline\"><a>4. Reparto de tareas.<\/a><\/h1>\n\n\n\n<p>En este proyecto, al ser realizado por una \u00fanica persona todas las tareas fueron realizadas por m\u00ed, lo que implic\u00f3 asumir m\u00faltiples roles a lo largo del desarrollo.<\/p>\n\n\n\n<p>Desde el planteamiento inicial, pasando por el dise\u00f1o y montaje, hasta las pruebas y la depuraci\u00f3n, cada paso requiri\u00f3 una planificaci\u00f3n cuidadosa y una ejecuci\u00f3n meticulosa. En particular, el desarrollo del c\u00f3digo fue un aspecto clave y un desaf\u00edo, ya que deb\u00eda coordinar el funcionamiento de diversos componentes electr\u00f3nicos y superar problemas t\u00e9cnicos, como los conflictos de temporizadores entre el microservo, el buzzer y el sensor IR.<\/p>\n\n\n\n<p>Desde mi punto de vista, aunque en algunos momentos la carga de trabajo puede haber resultado pesada al haber decidido realizar el proyecto sola, ha resultado en una experiencia enriquecedora y gratificante, ya que una vez se tiene el proyecto finalizado y funcionando correctamente, se siente una gran satisfacci\u00f3n al ver materializado todo el esfuerzo y dedicaci\u00f3n invertidos.<\/p>\n\n\n\n<h1 class=\"wp-block-heading has-pale-cyan-blue-color has-text-color has-link-color has-large-font-size wp-elements-e5e4b77df98b7dcf36c51708732c1bd5\" style=\"text-decoration:underline\"><a>5. Costes de materiales<\/a>.<\/h1>\n\n\n\n<p>Como se ha comentado anteriormente, desde un principio se quer\u00eda realizar un proyecto empleando \u00fanicamente componentes incluidos en el Kit Elegoo UNO R3 Super Starter, y, aunque algunos componentes de los que ven\u00edan no funcionaban correctamente, se pudieron sustituir por otros iguales que fueron prestados por amigos.<\/p>\n\n\n\n<p>A continuaci\u00f3n, se detalla una tabla con todos los componentes empleados, su procedencia y coste:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"402\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2024-12-19-200052-1024x402.png\" alt=\"\" class=\"wp-image-9252\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2024-12-19-200052-1024x402.png 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2024-12-19-200052-300x118.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2024-12-19-200052-768x301.png 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2024-12-19-200052.png 1420w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading has-pale-cyan-blue-color has-text-color has-link-color has-large-font-size wp-elements-9e48e887aed4957e202385f259321ae1\" style=\"text-decoration:underline\"><a>6. Problemas y soluciones encontradas.<\/a><\/h1>\n\n\n\n<p>Durante el desarrollo surgieron varios retos:<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-amber-color has-text-color has-link-color has-medium-font-size wp-elements-7a9c44f2bf967b6f09aab91266396870\"><a>6.1. Conflictos de temporizadores.<\/a><\/h2>\n\n\n\n<p>El microservo, el buzzer y el sensor IR depend\u00edan del mismo temporizador interno, lo que generaba fallos en su funcionamiento, como ya se ha mencionado anteriormente.<\/p>\n\n\n\n<p>Tras buscar soluciones cambiando de librer\u00edas y pines, y no encontrar ninguna, se opt\u00f3 por eliminar el buzzer y utilizar bibliotecas alternativas que resolvieran el conflicto entre el microservo y el sensor IR.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-amber-color has-text-color has-link-color has-medium-font-size wp-elements-446748306f12a7ab8bf2f6ce73d80f00\"><a>6.2. Cables defectuosos.<\/a><\/h2>\n\n\n\n<p>Algunos cables del kit no funcionaban correctamente, por lo que se cambiaron los cables los cables da\u00f1ados por otros en buen estado que hab\u00edan sido prestados por amigos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-amber-color has-text-color has-link-color has-medium-font-size wp-elements-d8c99ddf798085b6eb43cea970c35cd3\"><a>6.3. Dise\u00f1o estructural \u2013 brazo removedor.<\/a><\/h2>\n\n\n\n<p>El brazo que remueve la bebida no ten\u00eda la estabilidad necesaria y a veces se atascaba al bajar o al subir la cuchara. Por ello se a\u00f1adieron estructuras auxiliares para mejorar la funcionalidad y mitigar estos problemas.<\/p>\n\n\n\n<h1 class=\"wp-block-heading has-pale-cyan-blue-color has-text-color has-link-color has-large-font-size wp-elements-81ab8afebd01362d55b9c2f0b189a03f\" style=\"text-decoration:underline\"><a>7. C\u00f3digo y casos de uso.<\/a><\/h1>\n\n\n\n<p>El c\u00f3digo implementado en el robot Coffeeto combina m\u00faltiples funcionalidades para lograr un sistema automatizado y eficiente de preparaci\u00f3n de bebidas calientes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-amber-color has-text-color has-link-color has-medium-font-size wp-elements-db332e856e9285006cb6f6fb1befca4e\"><a>7.1. Sobre el c\u00f3digo.<\/a><\/h2>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-4ca63c4648e677d2afef7a56a80f895a\" style=\"color:#af9b81\"><a>7.1.1. Estructura general.<\/a><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" style=\"text-decoration:underline\">Librer\u00edas:<\/h4>\n\n\n\n<p>Se incluyen librer\u00edas necesarias para manejar los componentes: LiquidCrystal para la pantalla LCD, DHT para el sensor de temperatura y humedad, VarSpeedServo para el servo motor, e IRremote para el receptor de infrarrojos.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" style=\"text-decoration:underline\">Definici\u00f3n de pines:<\/h4>\n\n\n\n<p>Se configuran los pines correspondientes para conectar cada componente, como el sensor ultras\u00f3nico, el motor DC, el LED y el receptor IR.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" style=\"text-decoration:underline\">Declaraci\u00f3n de variables:<\/h4>\n\n\n\n<p>Variables globales como currentMenu permiten gestionar el men\u00fa, y otras como tiempoRemover y tiempoTemporizador establecen valores predeterminados para las funciones espec\u00edficas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-ce6dc150f7f93b333acb016018ad2cc3\" style=\"color:#af9b81\"><a>7.1.2. Fases principales del c\u00f3digo.<\/a><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" style=\"text-decoration:underline\">Setup.<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">-Inicializaci\u00f3n:<\/h5>\n\n\n\n<p>Se configura el LCD, el servo, el sensor DHT11, y el receptor IR, y se muestran mensajes iniciales en la pantalla LCD para guiar al usuario.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">-Caracteres especiales:<\/h5>\n\n\n\n<p>Se crean flechas personalizadas para mejorar la experiencia visual en el desplazamiento lateral entre los men\u00fas.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" style=\"text-decoration:underline\">Loop:<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">-Recepci\u00f3n de se\u00f1ales IR:<\/h5>\n\n\n\n<p>El c\u00f3digo espera entradas desde el control remoto IR. Seg\u00fan el bot\u00f3n pulsado, se llama a la funci\u00f3n procesarEntradaIR(), que maneja la navegaci\u00f3n entre men\u00fas y la ejecuci\u00f3n de funciones.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" style=\"text-decoration:underline\">Gesti\u00f3n del men\u00fa.<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">-Men\u00fa principal:<\/h5>\n\n\n\n<p>Permite elegir entre los modos manual y autom\u00e1tico:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Manual:<\/strong> Ejecuta funciones espec\u00edficas como remover, medir temperatura o usar el temporizador.<\/li>\n\n\n\n<li><strong>Autom\u00e1tico:<\/strong> Realiza un flujo completo de preparaci\u00f3n de caf\u00e9 o infusi\u00f3n, que incluye medir temperatura y remover para la preparaci\u00f3n de caf\u00e9s, y lo mismo para las infusiones pero agregando la funci\u00f3n de temporizador.<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">-Funciones auxiliares:<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>mostrarMensajeLCD() para mostrar mensajes en la pantalla.<\/li>\n\n\n\n<li>beepError() para alertar al usuario mediante el LED (se nombr\u00f3 as\u00ed porque en un principio, adem\u00e1s de alertar visualmente mediante el led, se hac\u00eda mediante el buzzer).<\/li>\n\n\n\n<li>esperarTaza() para verificar la posici\u00f3n correcta de la taza con el sensor ultras\u00f3nico.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-415cbccd7316ff27dab032c467bab0dd\" style=\"color:#af9b81\"><a>7.1.3. Funciones principales.<\/a><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" style=\"text-decoration:underline\">Medir temperatura:<\/h4>\n\n\n\n<p>Utiliza el sensor DHT11 para medir la temperatura actual de la bebida y compara los valores con el rango seleccionado por el usuario.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" style=\"text-decoration:underline\">Remover:<\/h4>\n\n\n\n<p>Activa el motor DC y mueve el servo para simular el movimiento de una cuchara que remueve los ingredientes durante el tiempo configurado.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" style=\"text-decoration:underline\">Temporizador:<\/h4>\n\n\n\n<p>Realiza una cuenta regresiva visible en la pantalla LCD. Es \u00fatil para controlar el tiempo de reposo en infusiones.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" style=\"text-decoration:underline\">Preparaci\u00f3n autom\u00e1tica:<\/h4>\n\n\n\n<p>Incluye un flujo completo que integra las funciones anteriores para preparar caf\u00e9 o infusi\u00f3n seg\u00fan la selecci\u00f3n del usuario.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-amber-color has-text-color has-link-color has-medium-font-size wp-elements-4a516860a871db3758b5a9d6f35d06f6\"><a>7.2. Casos de uso<\/a><\/h2>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-4de547b5469d869bed4e8747b84dadbd\" style=\"color:#af9b81\"><a>Modo manual.<\/a><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Remover:<\/strong> El usuario puede usar el control remoto para activar esta funci\u00f3n cuando quiera mezclar los ingredientes de forma precisa.<\/li>\n\n\n\n<li><strong>Medir temperatura:<\/strong> El robot muestra por pantalla la temperatura de la bebida actual, una vez colocada en la posici\u00f3n correcta. As\u00ed, el usuario se puede asegurar f\u00e1cilmente de que la bebida alcance la temperatura deseada.<\/li>\n\n\n\n<li><strong>Temporizador:<\/strong> \u00datil para controlar el tiempo de reposo de las infusiones.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-29ec3e2b756bd05fdcfaefde37fd8a4b\" style=\"color:#af9b81\"><a>Modo autom\u00e1tico.<\/a><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Caf\u00e9:<\/strong> El robot mide la temperatura, espera a que sea la adecuada seg\u00fan la seleccionada por el usuario, y remueve la bebida tras detectar que la taza est\u00e1 en su lugar.<\/li>\n\n\n\n<li><strong>Infusi\u00f3n:<\/strong> Incluye un temporizador inicial y luego sigue el flujo para verificar la temperatura seg\u00fan la seleccionada por el usuario y as\u00ed remover la bebida finalmente.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Librer\u00edas\n#include &lt;LiquidCrystal.h&gt;\n#include &lt;DHT.h&gt;\n#include &lt;VarSpeedServo.h&gt;\n#include &lt;IRremote.h&gt;\n\n\/\/ Pines\nconst int piezoPin = 6;\nconst int trigPin = 4;\nconst int echoPin = 3;\nconst int motorPin1 = 9;\nconst int motorPin2 = 6;\nconst int ledPin = 11;\nconst int pinDHT11 = 10;\nconst int IR_PIN = 2;\n\n\/\/ Configuraci\u00f3n del LCD\nLiquidCrystal lcd(A0, A1, A5, A4, A3, A2);\n\n\/\/ Configuraci\u00f3n del Servo\nVarSpeedServo myServo;\n\n\/\/ Configuraci\u00f3n del sensor DHT11\n#define DHTTYPE DHT11\nDHT dht(pinDHT11, DHTTYPE);\n\n\/\/ Inicializa el receptor IR\nvoid procesarEntradaIR(int boton);\n\n\/\/ Variables del sensor ultras\u00f3nico\nlong duration;\nint distance;\n\n\/\/ Variables del men\u00fa\nint currentMenu = 0;\n\nint tiempoRemover = 10;   \/\/ Tiempo predeterminado en segundos para remover\nint tiempoTemporizador = 20;  \/\/ Tiempo predeterminado en segundos para el temporizador\n\nint tempSeleccionadaMin = 0;  \/\/ Temperatura m\u00ednima del rango\nint tempSeleccionadaMax = 0;  \/\/ Temperatura m\u00e1xima del rango\n\n\/\/ Funciones\nvoid procesarEntradaIR(int boton);\nvoid ejecutarManual(int opcion);\nvoid prepararBebida(bool esCafe);\nvoid medirDistancia();\nvoid mostrarMensajeLCD(const char* linea1, const char* linea2);\nvoid beepError();\nvoid esperarTaza();\nvoid medirTemperatura();\nvoid temporizador(int segundos); \nvoid remover();\nvoid indicarFinDeFase();\nint mapCodeToButton(unsigned long code);\nvoid configurarTiempo(int* tiempo);\n\n\/\/ Caracter especial -&gt;\nbyte flechaDerecha&#091;] = {\n  B00000,\n  B00100,\n  B00010,\n  B11111,\n  B00010,\n  B00100,\n  B00000,\n  B00000\n};\n\n\/\/ Caracter especial &lt;-\nbyte flechaIzquierda&#091;] = {\n  B00000,\n  B00100,\n  B01000,\n  B11111,\n  B01000,\n  B00100,\n  B00000,\n  B00000\n};\n\nvoid setup() {\n  Serial.begin(9600);\n\n  lcd.begin(16, 2);\n  lcd.print(\"Iniciando...\");\n\n  pinMode(piezoPin, OUTPUT);\n  pinMode(trigPin, OUTPUT);\n  pinMode(echoPin, INPUT);\n  pinMode(motorPin1, OUTPUT);\n  pinMode(motorPin2, OUTPUT);\n  pinMode(ledPin, OUTPUT);\n\n  myServo.attach(7);\n  IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);\n  dht.begin();\n  delay(2000);\n\n  lcd.createChar(0, flechaDerecha);\n  lcd.createChar(1, flechaIzquierda);\n\n  myServo.write(80, 90);\n\n  lcd.clear();\n  lcd.setCursor(15, 0);\n  lcd.write(byte(0));\n  mostrarMensajeLCD(\"Bienvenido\", \"Seleccione menu\");\n}\n\nvoid loop() { \n  if (IrReceiver.decode()) {\n    unsigned long code = IrReceiver.decodedIRData.decodedRawData;\n    int button = mapCodeToButton(code);\n\n    if (button != -1) {\n      Serial.print(F(\"Bot\u00f3n presionado: \"));\n      Serial.println(button);\n      procesarEntradaIR(button);\n    } else {\n      Serial.println(F(\"C\u00f3digo IR no reconocido\"));\n    }\n    IrReceiver.resume();\n  }\n}\n\nvoid procesarEntradaIR(int boton) {\n  switch (currentMenu) {\n    \/\/ Men\u00fa principal\n    case 0: \n      \/\/ Manual\n      if (boton == 1) {\n        currentMenu = 1;\n        lcd.clear();\n        lcd.setCursor(15, 0);\n        lcd.write(byte(0));\n        mostrarMensajeLCD(\"1-Remover\", \"2-Temperatura\");\n      \/\/ Autom\u00e1tico\n      } else if (boton == 2) {\n        currentMenu = 2;\n        lcd.clear();\n        mostrarMensajeLCD(\"1-Cafe\", \"2-Infusion\");\n      \/\/ Inicio derecha\n      } else if (boton == 15) {\n        lcd.clear();\n        lcd.setCursor(15, 0);\n        lcd.write(byte(1));\n        mostrarMensajeLCD(\"1-Manual\", \"2-Automatico\");\n      \/\/ Inicio izquierda\n      } else if (boton == 13) {\n        lcd.clear();\n        lcd.setCursor(15, 0);\n        lcd.write(byte(0));\n        mostrarMensajeLCD(\"Bienvenido\", \"Seleccione menu\");\n      }\n      break;\n    \n    \/\/ Men\u00fa manual\n    case 1:  \n      \/\/ Manual izquierda\n      if (boton == 13) {\n        lcd.clear();\n        lcd.setCursor(15, 0);\n        lcd.write(byte(0));\n        mostrarMensajeLCD(\"1-Remover\", \"2-Temperatura\");\n      \/\/ Manual derecha\n      } else if (boton == 15) {\n        lcd.clear();\n        lcd.setCursor(15, 1);\n        lcd.write(byte(1));\n        mostrarMensajeLCD(\"3-Temporizador\", \"\");\n      \/\/ Remover, temperatura, temporizador\n      } else if (boton &gt;= 1 &amp;&amp; boton &lt;= 3) {\n        ejecutarManual(boton);  \/\/ Ejecuta la opci\u00f3n seleccionada\n        currentMenu = 0;\n        lcd.clear();\n        lcd.setCursor(15, 0);\n        lcd.write(byte(0));\n        mostrarMensajeLCD(\"Bienvenido\", \"Seleccione menu\");\n      \/\/ Volver men\u00fa\n      } else if (boton == 0) {\n        lcd.clear();\n        mostrarMensajeLCD(\"Volviendo\", \"al menu...\");\n        delay(500);\n        lcd.clear();\n        lcd.setCursor(15, 0);\n        lcd.write(byte(0));\n        mostrarMensajeLCD(\"Bienvenido\", \"Seleccione menu\");\n        currentMenu = 0;\n      }\n      break;\n    \n    \/\/ Men\u00fa autom\u00e1tico\n    case 2: \n      \/\/ Caf\u00e9\n      if (boton == 1) {\n        ejecutarAuto(true);\n        currentMenu = 0;\n        lcd.clear();\n        lcd.setCursor(15, 0);\n        lcd.write(byte(0));\n        mostrarMensajeLCD(\"Bienvenido\", \"Seleccione menu\");\n      \/\/ Infusi\u00f3n\n      } else if (boton == 2) {\n        ejecutarAuto(false);\n        currentMenu = 0;\n        lcd.clear();\n        lcd.setCursor(15, 0);\n        lcd.write(byte(0));\n        mostrarMensajeLCD(\"Bienvenido\", \"Seleccione menu\");\n      \/\/ Volver men\u00fa\n      } else if (boton == 0) {\n        lcd.clear();\n        mostrarMensajeLCD(\"Volviendo\", \"al menu...\");\n        delay(500);\n        lcd.clear();\n        lcd.setCursor(15, 0);\n        lcd.write(byte(0));\n        mostrarMensajeLCD(\"Bienvenido\", \"Seleccione menu\");\n        currentMenu = 0;\n      }\n      break;\n  }\n}\n\nvoid ejecutarManual(int opcion) {\n  switch (opcion) {\n    \/\/ Remover\n    case 1:\n      limpiarBufferIR();\n      esperarTaza();\n      configurarTiempo(&amp;tiempoRemover);\n      remover();\n      break;\n    \/\/ Temperatura\n    case 2:\n      esperarTaza();\n      medirTemperatura();\n      break;\n    \/\/ Temporizador\n    case 3:\n      limpiarBufferIR();\n      configurarTiempo(&amp;tiempoTemporizador);\n      temporizador();\n      break;\n  }\n}\n\nvoid ejecutarAuto(bool esCafe) {\n  limpiarBufferIR();\n\n  \/\/ Caf\u00e9\n  if (esCafe) {\n    esperarTaza();\n\n    seleccionarTemperatura();\n\n    bool midiendoTemperatura = true;\n    while (midiendoTemperatura) {\n      float temperatura = dht.readTemperature();\n      \/\/float humedad = dht.readHumidity();\n      if (!isnan(temperatura)) {\n      \/\/if (!isnan(temperatura) &amp;&amp; !isnan(humedad)) {\n        lcd.clear();\n        mostrarMensajeLCD(\"Temperatura:\", (String(temperatura) + \" g. celsius\").c_str());\n        delay(1000);\n      } else {\n      mostrarMensajeLCD(\"Error\", \"DHT11\");\n      }\n\n      if (IrReceiver.decode()) {\n        unsigned long c = IrReceiver.decodedIRData.decodedRawData;\n        int b = mapCodeToButton(c);\n\n        if (b == 0) {\n          midiendoTemperatura = false;\n          return;\n        }\n        IrReceiver.resume();\n      }\n\n      if (temperatura &gt;= tempSeleccionadaMin &amp;&amp; temperatura &lt;= tempSeleccionadaMax) {\n        midiendoTemperatura = false;\n      }\n    }\n\n    esperarRetiroTaza();\n    delay(3000);\n    esperarTaza();\n    delay(4000);\n    remover();\n\n  \/\/ Infusi\u00f3n\n  } else {\n    temporizador();\n\n    esperarTaza();\n\n    seleccionarTemperatura();\n\n    bool midiendoTemperatura = true;\n    while (midiendoTemperatura) {\n      float temperatura = dht.readTemperature();\n      \/\/float humedad = dht.readHumidity();\n      if (!isnan(temperatura)) {\n      \/\/if (!isnan(temperatura) &amp;&amp; !isnan(humedad)) {\n        lcd.clear();\n        mostrarMensajeLCD(\"Temperatura:\", (String(temperatura) + \" g. celsius\").c_str());\n        delay(1000);\n      } else {\n      mostrarMensajeLCD(\"Error\", \"DHT11\");\n      }\n\n      if (IrReceiver.decode()) {\n        unsigned long c = IrReceiver.decodedIRData.decodedRawData;\n        int b = mapCodeToButton(c);\n\n        if (b == 0) {\n          midiendoTemperatura = false;\n          return;\n        }\n        IrReceiver.resume();\n      }\n\n      if (temperatura &gt;= tempSeleccionadaMin &amp;&amp; temperatura &lt;= tempSeleccionadaMax) {\n        midiendoTemperatura = false;\n      }\n    }\n    \n    esperarRetiroTaza();\n    delay(3000);\n    esperarTaza();\n    delay(4000);\n    remover();\n  }\n}\n\nvoid mostrarMensajeLCD(const char* linea1, const char* linea2) {\n  lcd.setCursor(0, 0);\n  lcd.print(linea1);\n  lcd.setCursor(0, 1);\n  lcd.print(linea2);\n  Serial.print(\"LCD: \");\n  Serial.print(linea1);\n  Serial.print(\" | \");\n  Serial.println(linea2);\n}\n\nvoid beepError() {\n  \/\/tone(piezoPin, 1000, 500);\n\n  for (int i = 0; i &lt; 4; i++) {\n    digitalWrite(ledPin, HIGH);\n    delay(100);\n    digitalWrite(ledPin, LOW);\n    delay(100);\n  }\n}\n\nvoid indicarFinDeFase() {\n  \/\/tone(piezoPin, 1000, 1000); \/\/ Beep de 1 segundo\n\n  digitalWrite(ledPin, HIGH);\n  delay(500); \/\/ Mantiene el LED encendido y el buzzer sonando por un tiempo\n  digitalWrite(ledPin, LOW);\n}\n\nvoid medirDistancia() {\n  digitalWrite(trigPin, LOW);\n  delayMicroseconds(2);\n  digitalWrite(trigPin, HIGH);\n  delayMicroseconds(10);\n  digitalWrite(trigPin, LOW);\n\n  duration = pulseIn(echoPin, HIGH);\n  distance = duration * 0.034 \/ 2;\n}\n\nvoid esperarTaza() {\n  do {\n    medirDistancia();\n    if (distance &lt; 2 || distance &gt; 4) {\n      lcd.clear();\n      mostrarMensajeLCD(\"Coloque la taza\", \"en su lugar\");\n      beepError();\n    }\n  } while (distance &lt; 2 || distance &gt; 4);\n}\n\nvoid esperarRetiroTaza() {\n  do {\n    medirDistancia();\n    if (distance &gt;= 2 &amp;&amp; distance &lt;= 4) {\n      lcd.clear();\n      mostrarMensajeLCD(\"Retire la taza y\", \"eche endulzante\");\n      beepError();\n    }\n  } while (distance &gt;= 2 &amp;&amp; distance &lt;= 4);\n}\n\nvoid seleccionarTemperatura() {\n  lcd.clear();\n  mostrarMensajeLCD(\"Seleccione Temp\", \"1-F 2-T 3-C\");\n\n  bool esperandoSeleccion = true;\n  while (esperandoSeleccion) {\n    if (IrReceiver.decode()) {\n      unsigned long code = IrReceiver.decodedIRData.decodedRawData;\n      int boton = mapCodeToButton(code);\n\n      if (boton == 1) {\n        \/\/ Fr\u00edo: menor que 20\u00b0C\n        tempSeleccionadaMin = 0;  \/\/ No hay un l\u00edmite m\u00ednimo espec\u00edfico, cualquier valor menor que 20\n        tempSeleccionadaMax = 19;  \/\/ Limite superior es 19\u00b0C\n        esperandoSeleccion = false;\n        lcd.clear();\n        mostrarMensajeLCD(\"Temperatura\", \"Frio\");\n        delay(2000);\n      } else if (boton == 2) {\n        \/\/ Templado: entre 20\u00b0C y 40\u00b0C\n        tempSeleccionadaMin = 20;  \/\/ L\u00edmite inferior es 20\u00b0C\n        tempSeleccionadaMax = 40;  \/\/ L\u00edmite superior es 40\u00b0C\n        esperandoSeleccion = false;\n        lcd.clear();\n        mostrarMensajeLCD(\"Temperatura\", \"Templado\");\n        delay(2000);\n      } else if (boton == 3) {\n        \/\/ Caliente: mayor que 40\u00b0C\n        tempSeleccionadaMin = 41;  \/\/ L\u00edmite inferior es 41\u00b0C\n        tempSeleccionadaMax = 100;  \/\/ Limite superior arbitrario (podr\u00eda ser cualquier valor mayor que 40\u00b0C)\n        esperandoSeleccion = false;\n        lcd.clear();\n        mostrarMensajeLCD(\"Temperatura\", \"Caliente\");\n        delay(2000);\n      } else if (boton == 0) {\n        lcd.clear();\n        mostrarMensajeLCD(\"Volviendo\", \"al menu...\");\n        delay(500);\n        currentMenu = 0;\n        esperandoSeleccion = false;\n      }\n      IrReceiver.resume();\n    }\n  }\n}\n\nvoid medirTemperatura() {\n  float temperatura = dht.readTemperature();\n  float humedad = dht.readHumidity();\n  if (!isnan(temperatura) &amp;&amp; !isnan(humedad)) {\n    lcd.clear();\n    mostrarMensajeLCD(\"Temperatura:\", (String(temperatura) + \" g. celsius\").c_str());\n    delay(5000);\n  } else {\n    mostrarMensajeLCD(\"Error\", \"DHT11\");\n  }\n}\n\nvoid temporizador() {\n  for (int i = tiempoTemporizador; i &gt;= 0; i--) {\n    lcd.clear();\n    lcd.setCursor(0, 0);\n    lcd.print(\"Tiempo restante:\");\n    lcd.setCursor(0, 1);\n    lcd.print(i);\n    delay(1000);\n  }\n  indicarFinDeFase();\n}\n\nvoid remover() {\n  lcd.clear();\n  mostrarMensajeLCD(\"Removiendo\", \"...\");\n\n  myServo.write(0, 90);\n  delay(2000);\n\n  \/\/digitalWrite(motorPin1, HIGH);\n  analogWrite(motorPin1, 255);\n\n  \/\/ Bucle para mostrar el tiempo restante en la pantalla LCD\n  for (int i = tiempoRemover; i &gt; 0; i--) {\n    lcd.clear();\n    mostrarMensajeLCD(\"Removiendo:\", String(i).c_str());\n    \n    delay(1000);  \/\/ Espera 1 segundo entre cada decremento\n  }\n\n  \/\/digitalWrite(motorPin1, LOW);  \/\/ Apagar el motor cuando el tiempo se agota\n  analogWrite(motorPin1, 0);  \/\/ Apagar el motor cuando el tiempo se agota\n\n  myServo.write(90, 90);  \/\/ Detener el servo motor\n  indicarFinDeFase();  \/\/ Indicar que la fase ha terminado\n}\n\nvoid limpiarBufferIR() {\n  \/\/ Aseg\u00farate de que no hay datos residuales del IR\n  while (IrReceiver.decode()) {\n    IrReceiver.resume();  \/\/ Ignorar el valor actual\n  }\n}\n\nvoid configurarTiempo(int* tiempo) {\n  lcd.clear();\n  mostrarMensajeLCD(\"Tiempo en seg:\", String(*tiempo).c_str());\n  \n  bool firstTime = true;\n\n  while (true) {\n    if (IrReceiver.decode()) {\n      unsigned long codigo = IrReceiver.decodedIRData.decodedRawData;\n      int boton = mapCodeToButton(codigo);\n\n      \/\/ Si el bot\u00f3n es un n\u00famero del 0 al 9\n      if (boton &gt;= 0 &amp;&amp; boton &lt;= 9 &amp;&amp; firstTime) {\n        firstTime = false;\n        *tiempo = 0;\n        *tiempo = (*tiempo * 10) + boton;  \/\/ Construir el n\u00famero de tiempo\n        lcd.clear();\n        mostrarMensajeLCD(\"Tiempo en seg:\", String(*tiempo).c_str());\n      } else if (boton &gt;= 0 &amp;&amp; boton &lt;= 9) {\n        *tiempo = (*tiempo * 10) + boton;  \/\/ Construir el n\u00famero de tiempo\n        lcd.clear();\n        mostrarMensajeLCD(\"Tiempo en seg:\", String(*tiempo).c_str());\n      } else if (boton == 14) {  \/\/ Bot\u00f3n OK para confirmar\n        lcd.clear();\n        mostrarMensajeLCD(\"Tiempo fijado:\", String(*tiempo).c_str());\n        delay(2000);\n        break;  \/\/ Salir del bucle cuando el usuario confirma\n      }\n      IrReceiver.resume();\n    }\n  }\n}\n\nint mapCodeToButton(unsigned long code) {\n  switch (code) {\n    case 0xE916FF00: return 0; \/\/ Bot\u00f3n \"0\"\n    case 0xF30CFF00: return 1; \/\/ Bot\u00f3n \"1\"\n    case 0xE718FF00: return 2; \/\/ Bot\u00f3n \"2\"\n    case 0xA15EFF00: return 3; \/\/ Bot\u00f3n \"3\"\n    case 0xF708FF00: return 4; \/\/ Bot\u00f3n \"4\"\n    case 0xE31CFF00: return 5; \/\/ Bot\u00f3n \"5\"\n    case 0xA55AFF00: return 6; \/\/ Bot\u00f3n \"6\"\n    case 0xBD42FF00: return 7; \/\/ Bot\u00f3n \"7\"\n    case 0xAD52FF00: return 8; \/\/ Bot\u00f3n \"8\"\n    case 0xB54AFF00: return 9; \/\/ Bot\u00f3n \"9\"\n    case 0xBA45FF00: return 10; \/\/ Bot\u00f3n \"Apagar\/Encender\"\n    case 0xB946FF00: return 11; \/\/ Bot\u00f3n \"Subir volumen\"\n    case 0xB847FF00: return 12; \/\/ Bot\u00f3n \"FUNC\/STOP\"\n    case 0xBB44FF00: return 13; \/\/ Bot\u00f3n \"LEFT\"\n    case 0xBF40FF00: return 14; \/\/ Bot\u00f3n \"OK\"\n    case 0xBC43FF00: return 15; \/\/ Bot\u00f3n \"RIGHT\"\n    case 0xF807FF00: return 16; \/\/ Bot\u00f3n \"DOWN\"\n    case 0xEA15FF00: return 17; \/\/ Bot\u00f3n \"Bajar volumen\"\n    case 0xF609FF00: return 18; \/\/ Bot\u00f3n \"UP\"\n    case 0xE619FF00: return 19; \/\/ Bot\u00f3n \"EQ\"\n    case 0xF20DFF00: return 20; \/\/ Bot\u00f3n \"ST\/REP\"\n    default: return -1; \/\/ C\u00f3digo no reconocido\n  }\n}\n\n\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Proyecto desarrollado por Sara Gallego Trigal para la asignatura de Dise\u00f1o de Sistemas Empotrados. 1. Sobre el proyecto. El objetivo inicial del proyecto era dise\u00f1ar un robot asistente que mejorara la experiencia de preparar&#46;&#46;&#46;<\/p>\n","protected":false},"author":251,"featured_media":9286,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-9218","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-proyectos"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Coffeeto - 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\/coffeeto\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Coffeeto - Proyectos con Arduino.\" \/>\n<meta property=\"og:description\" content=\"Proyecto desarrollado por Sara Gallego Trigal para la asignatura de Dise\u00f1o de Sistemas Empotrados. 1. Sobre el proyecto. El objetivo inicial del proyecto era dise\u00f1ar un robot asistente que mejorara la experiencia de preparar&#046;&#046;&#046;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/coffeeto\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2024-12-19T21:25:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-12-19T21:25:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-imagen-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"dse2425g15\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"dse2425g15\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 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\\\/coffeeto\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/coffeeto\\\/\"},\"author\":{\"name\":\"dse2425g15\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/dab1fa3ec82f6759947076fddc27f6f7\"},\"headline\":\"Coffeeto\",\"datePublished\":\"2024-12-19T21:25:47+00:00\",\"dateModified\":\"2024-12-19T21:25:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/coffeeto\\\/\"},\"wordCount\":2279,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/coffeeto\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2024\\\/12\\\/Coffeeto-imagen-1.png\",\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/coffeeto\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/coffeeto\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/coffeeto\\\/\",\"name\":\"Coffeeto - Proyectos con Arduino.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/coffeeto\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/coffeeto\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2024\\\/12\\\/Coffeeto-imagen-1.png\",\"datePublished\":\"2024-12-19T21:25:47+00:00\",\"dateModified\":\"2024-12-19T21:25:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/coffeeto\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/coffeeto\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/coffeeto\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2024\\\/12\\\/Coffeeto-imagen-1.png\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2024\\\/12\\\/Coffeeto-imagen-1.png\",\"width\":1920,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/coffeeto\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Coffeeto\"}]},{\"@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\\\/dab1fa3ec82f6759947076fddc27f6f7\",\"name\":\"dse2425g15\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8855b3ba67020876fbecb07c2fcb9b7131fe8e04953682b96a3614f4317c0762?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8855b3ba67020876fbecb07c2fcb9b7131fe8e04953682b96a3614f4317c0762?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8855b3ba67020876fbecb07c2fcb9b7131fe8e04953682b96a3614f4317c0762?s=96&d=mm&r=g\",\"caption\":\"dse2425g15\"},\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/author\\\/dse2425g15\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Coffeeto - 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\/coffeeto\/","og_locale":"es_ES","og_type":"article","og_title":"Coffeeto - Proyectos con Arduino.","og_description":"Proyecto desarrollado por Sara Gallego Trigal para la asignatura de Dise\u00f1o de Sistemas Empotrados. 1. Sobre el proyecto. El objetivo inicial del proyecto era dise\u00f1ar un robot asistente que mejorara la experiencia de preparar&#46;&#46;&#46;","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/coffeeto\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2024-12-19T21:25:47+00:00","article_modified_time":"2024-12-19T21:25:48+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-imagen-1.png","type":"image\/png"}],"author":"dse2425g15","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"dse2425g15","Tiempo de lectura":"19 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/coffeeto\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/coffeeto\/"},"author":{"name":"dse2425g15","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/dab1fa3ec82f6759947076fddc27f6f7"},"headline":"Coffeeto","datePublished":"2024-12-19T21:25:47+00:00","dateModified":"2024-12-19T21:25:48+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/coffeeto\/"},"wordCount":2279,"commentCount":0,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/coffeeto\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-imagen-1.png","articleSection":["Proyectos"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/coffeeto\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/coffeeto\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/coffeeto\/","name":"Coffeeto - Proyectos con Arduino.","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/coffeeto\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/coffeeto\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-imagen-1.png","datePublished":"2024-12-19T21:25:47+00:00","dateModified":"2024-12-19T21:25:48+00:00","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/coffeeto\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/coffeeto\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/coffeeto\/#primaryimage","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-imagen-1.png","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Coffeeto-imagen-1.png","width":1920,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/coffeeto\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"Coffeeto"}]},{"@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\/dab1fa3ec82f6759947076fddc27f6f7","name":"dse2425g15","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/8855b3ba67020876fbecb07c2fcb9b7131fe8e04953682b96a3614f4317c0762?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/8855b3ba67020876fbecb07c2fcb9b7131fe8e04953682b96a3614f4317c0762?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8855b3ba67020876fbecb07c2fcb9b7131fe8e04953682b96a3614f4317c0762?s=96&d=mm&r=g","caption":"dse2425g15"},"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/author\/dse2425g15\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9218","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\/251"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/comments?post=9218"}],"version-history":[{"count":7,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9218\/revisions"}],"predecessor-version":[{"id":9293,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9218\/revisions\/9293"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media\/9286"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=9218"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=9218"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=9218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}