{"id":7157,"date":"2023-12-20T10:31:49","date_gmt":"2023-12-20T09:31:49","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=7157"},"modified":"2023-12-20T10:36:34","modified_gmt":"2023-12-20T09:36:34","slug":"cuatro-en-raya","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/cuatro-en-raya\/","title":{"rendered":"Cuatro en raya"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Proyecto DSE<\/h2>\n\n\n\n<p>Autores: Sergio Zarco M\u00e1rmol, Cristian Y\u00e1nez Cervino y Eva Ruiz Aguado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introducci\u00f3n<\/h2>\n\n\n\n<p>El proyecto que vamos a presentar a continuaci\u00f3n consiste en una consola port\u00e1til con la que jugar al cuatro en raya. Entre sus caracter\u00edsticas cuenta con un LDR, el cual cambia el color de la pantalla en funci\u00f3n de la luz ambiente tanto ( lo que llamamos el modo oscuro o el modo claro del dispositivo), un led RGB que indica el color del jugador al cual le toca jugar (Jugador rojo o azul) y un buzzer que se encarga de reproducir sonido cada vez que se suelta una pieza, se gana la partida, toca un bot\u00f3n o se elige un jugador para comenzar, El sistema est\u00e1 empotrado y usa una bater\u00eda que permite su f\u00e1cil movilidad y c\u00f3modo uso.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Piezas de Hardware y Costes<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Componente<\/td><td>Detalles<\/td><td>Precio por unidad<\/td><td>Unidades<\/td><td>Total<\/td><\/tr><tr><td>EELEGOO UNO R3<\/td><td><\/td><td>19,99\u20ac<\/td><td>1<\/td><td>19,99\u20ac<\/td><\/tr><tr><td>Protoboard<\/td><td>400 puntos<\/td><td>3\u20ac<\/td><td>1<\/td><td>3\u20ac<\/td><\/tr><tr><td>Cableado<\/td><td>1 metro de cable<br>21 cables macho-hembra<\/td><td>1\u20ac\/m<br>5\u20ac\/pack de 40<\/td><td>1m<br>1 pack<\/td><td>6\u20ac<\/td><\/tr><tr><td>Zumbador<\/td><td><\/td><td>0,75\u20ac<\/td><td>1<\/td><td>0,75\u20ac<\/td><\/tr><tr><td>LED RGB<\/td><td><\/td><td>0,56\u20ac<\/td><td>1<\/td><td>0,56\u20ac<\/td><\/tr><tr><td>LDR<\/td><td><\/td><td>0,67\u20ac<\/td><td>1<\/td><td>0,67\u20ac<\/td><\/tr><tr><td>Interruptor de bot\u00f3n<\/td><td><\/td><td>0,10\u20ac<\/td><td>3<\/td><td>0,30\u20ac<\/td><\/tr><tr><td>Pantalla ILI9341<\/td><td>240*320 5V\/3.3V<\/td><td>15,99\u20ac<\/td><td>1<\/td><td>15,99\u20ac<\/td><\/tr><tr><td>Carcasa<\/td><td>Hecha a medida e impresa en 3D<\/td><td>25\u20ac<\/td><td>1<\/td><td>25\u20ac<\/td><\/tr><tr><td>Resistencias<\/td><td>6 x 1K\u03a9, 100\u03a9,<br>5 x 5K\u03a9, 4 x 10K\u03a9<\/td><td>0,02\u20ac<\/td><td>16<\/td><td>0,32\u20ac<\/td><\/tr><tr><td>Pila<\/td><td>9V<\/td><td>3,63\u20ac<\/td><td>1<\/td><td>3,63\u20ac<\/td><\/tr><tr><td>Total<\/td><td><\/td><td><\/td><td><\/td><td>76,21\u20ac<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Modelo Carcasa para imprimir en 3D<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"898\" height=\"632\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/image-17.png\" alt=\"\" class=\"wp-image-7264\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/image-17.png 898w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/image-17-300x211.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/image-17-768x541.png 768w\" sizes=\"auto, (max-width: 898px) 100vw, 898px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Implementaci\u00f3n del hardware<\/h2>\n\n\n\n<figure class=\"wp-block-video\"><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Zumbador<\/strong>: conectamos una de las patas a tierra y la otra pata al controlador del Arduino.<\/li>\n\n\n\n<li><strong>LED<\/strong> <strong>RGB<\/strong>: conectamos el c\u00e1todo a tierra y el pin rojo y azul al controlador con una resistencia de 330\u03a9. No conectamos el pin verde porque no lo vamos a utilizar y as\u00ed nos ahorramos un puerto.&nbsp;<\/li>\n\n\n\n<li><strong>Botones<\/strong>: cada bot\u00f3n est\u00e1 conectado por una pin a negativo con una resistencia de 1K\u03a9, ese mismo pin se conecta a un puerto de control del Arduino con un divisor de tensi\u00f3n y el otro pin estar\u00e1 conectado a positivo.<\/li>\n\n\n\n<li><strong>LDR<\/strong>: conectamos uno de los pines a negativo con una resistencia de 1K\u03a9,el mismo pin se conectar\u00e1 tambi\u00e9n al controlador con un divisor de tensi\u00f3n y por \u00faltimo conectamos el otro pin a positivo.<\/li>\n\n\n\n<li><strong>Pantalla<\/strong>: conectamos los 6 pines de la pantalla con una resistencia de 5K\u03a9 a los controladores del Arduino, luego el pin LED de la pantalla se conecta con una resistencia de 100 \u03a9 a positivo. Por \u00faltimo, conectamos los pines de tierra y positivo de la pantalla.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Conexiones del arduino<\/h2>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Nombre del pin<\/td><td>Numero de pin en Arduino<\/td><\/tr><tr><td>LDR<\/td><td>1 (pin analogico)<\/td><\/tr><tr><td>BOTON_ACCION<\/td><td>2<\/td><\/tr><tr><td>BOTON_DER<\/td><td>3<\/td><\/tr><tr><td>BOTON_IZQ<\/td><td>4<\/td><\/tr><tr><td>BLUE(led)<\/td><td>5<\/td><\/tr><tr><td>RED(led)<\/td><td>6<\/td><\/tr><tr><td>BUZZER<\/td><td>7<\/td><\/tr><tr><td>TFT_RESET<\/td><td>8<\/td><\/tr><tr><td>TFT_DC<\/td><td>9<\/td><\/tr><tr><td>TFT_CS<\/td><td>10<\/td><\/tr><tr><td>TFT_MOSI<\/td><td>11<\/td><\/tr><tr><td>TFT_MISO<\/td><td>12<\/td><\/tr><tr><td>TFT_SCK<\/td><td>13<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n<\/div>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Diagrama de conexiones del proyecto<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"423\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/ProyectoDSE-1024x423.png\" alt=\"\" class=\"wp-image-7186\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/ProyectoDSE-1024x423.png 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/ProyectoDSE-300x124.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/ProyectoDSE-768x317.png 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/ProyectoDSE.png 1495w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Pantallas, Dise\u00f1o y funcionamiento<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Videos del sistema<\/h3>\n\n\n\n<figure class=\"wp-block-embed 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=\"Consola port\u00e1til: Cuatro en raya\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/0M_Lk7n7tw8?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<h3 class=\"wp-block-heading\">Dise\u00f1o general del sistema empotrado<\/h3>\n\n\n\n<p>Consiste en una peque\u00f1a carcasa c\u00f3moda y funcional con los botones, LDR, led y pantalla puestos a medida<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"1024\" data-id=\"7279\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaDerecha-2-576x1024.jpeg\" alt=\"\" class=\"wp-image-7279\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaDerecha-2-576x1024.jpeg 576w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaDerecha-2-169x300.jpeg 169w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaDerecha-2-768x1365.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaDerecha-2-864x1536.jpeg 864w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaDerecha-2.jpeg 900w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"1024\" data-id=\"7277\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaFrontal-3-576x1024.jpeg\" alt=\"\" class=\"wp-image-7277\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaFrontal-3-576x1024.jpeg 576w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaFrontal-3-169x300.jpeg 169w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaFrontal-3-768x1365.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaFrontal-3-864x1536.jpeg 864w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaFrontal-3.jpeg 900w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"1024\" data-id=\"7278\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaIzquierda-2-576x1024.jpeg\" alt=\"\" class=\"wp-image-7278\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaIzquierda-2-576x1024.jpeg 576w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaIzquierda-2-169x300.jpeg 169w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaIzquierda-2-768x1365.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaIzquierda-2-864x1536.jpeg 864w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaIzquierda-2.jpeg 900w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"900\" height=\"789\" data-id=\"7276\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaSuperior-2.jpeg\" alt=\"\" class=\"wp-image-7276\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaSuperior-2.jpeg 900w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaSuperior-2-300x263.jpeg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaSuperior-2-768x673.jpeg 768w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/figure>\n<\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Tapa de carcasa<\/h3>\n\n\n\n<p>La tapa de la carcasa se puede abrir y se puede sacar a conveniencia, adem\u00e1s los cables est\u00e1n soldados para mantener el sistema sin desconexiones<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" data-id=\"7280\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/TapaconCablesSoldados-1024x576.jpeg\" alt=\"\" class=\"wp-image-7280\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/TapaconCablesSoldados-1024x576.jpeg 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/TapaconCablesSoldados-300x169.jpeg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/TapaconCablesSoldados-768x432.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/TapaconCablesSoldados-1536x864.jpeg 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/TapaconCablesSoldados.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"1024\" data-id=\"7281\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/TapaDeslizable-576x1024.jpeg\" alt=\"\" class=\"wp-image-7281\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/TapaDeslizable-576x1024.jpeg 576w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/TapaDeslizable-169x300.jpeg 169w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/TapaDeslizable-768x1365.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/TapaDeslizable-864x1536.jpeg 864w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/TapaDeslizable.jpeg 900w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/figure>\n<\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Circuito interno empotrado<\/h3>\n\n\n\n<p>El sistema est\u00e1 lo m\u00e1s empotrado posible permitiendo cerrarse y usarse c\u00f3modamente de manera port\u00e1til<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/HWinterno-1024x576.jpeg\" alt=\"\" class=\"wp-image-7283\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/HWinterno-1024x576.jpeg 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/HWinterno-300x169.jpeg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/HWinterno-768x432.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/HWinterno-1536x864.jpeg 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/HWinterno.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Men\u00fa<\/h3>\n\n\n\n<p>el men\u00fa del juego puede estar tanto en modo oscuro como en modo claro dependiendo de la luz ambiente en el momento, la pantalla consta de un bot\u00f3n para jugar y una flecha que parpadea y que puedes accionar.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" data-id=\"7284\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/menuModoClaro.jpg\" alt=\"\" class=\"wp-image-7284\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/menuModoClaro.jpg 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/menuModoClaro-300x169.jpg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/menuModoClaro-768x432.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" data-id=\"7285\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/menuModoOscuro-1.jpg\" alt=\"\" class=\"wp-image-7285\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/menuModoOscuro-1.jpg 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/menuModoOscuro-1-300x169.jpg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/menuModoOscuro-1-768x432.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Elegir Turno<\/h3>\n\n\n\n<p>Para elegir turno se hace un peque\u00f1o pre\u00e1mbulo cambiando la luz del led y la imagen de pantalla a azul y rojo hasta que se escoge al jugador sonando en el proceso una m\u00fasica<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"771\" height=\"1024\" data-id=\"7287\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/elegirColorAzul-771x1024.jpeg\" alt=\"\" class=\"wp-image-7287\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/elegirColorAzul-771x1024.jpeg 771w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/elegirColorAzul-226x300.jpeg 226w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/elegirColorAzul-768x1020.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/elegirColorAzul-1157x1536.jpeg 1157w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/elegirColorAzul.jpeg 1536w\" sizes=\"auto, (max-width: 771px) 100vw, 771px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"771\" height=\"1024\" data-id=\"7288\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/elegirColorRojo-771x1024.jpeg\" alt=\"\" class=\"wp-image-7288\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/elegirColorRojo-771x1024.jpeg 771w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/elegirColorRojo-226x300.jpeg 226w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/elegirColorRojo-768x1020.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/elegirColorRojo-1157x1536.jpeg 1157w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/elegirColorRojo.jpeg 1536w\" sizes=\"auto, (max-width: 771px) 100vw, 771px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"771\" height=\"1024\" data-id=\"7289\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/turnoElegido-771x1024.jpeg\" alt=\"\" class=\"wp-image-7289\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/turnoElegido-771x1024.jpeg 771w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/turnoElegido-226x300.jpeg 226w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/turnoElegido-768x1020.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/turnoElegido-1157x1536.jpeg 1157w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/turnoElegido.jpeg 1536w\" sizes=\"auto, (max-width: 771px) 100vw, 771px\" \/><\/figure>\n<\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Pantalla del Juego<\/h3>\n\n\n\n<p>El juego empezar\u00e1 en modo claro o en modo oscuro, se podr\u00e1n soltar fichas y moverse por el tablero con libertad<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-5 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" data-id=\"7290\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/juegoModoClaro.jpg\" alt=\"\" class=\"wp-image-7290\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/juegoModoClaro.jpg 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/juegoModoClaro-300x169.jpg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/juegoModoClaro-768x432.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" data-id=\"7291\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/juegoModoOscuro.jpg\" alt=\"\" class=\"wp-image-7291\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/juegoModoOscuro.jpg 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/juegoModoOscuro-300x169.jpg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/juegoModoOscuro-768x432.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Victorias<\/h3>\n\n\n\n<p>La victorias pueden ser horizontales, verticales o diagonales<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-6 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"723\" height=\"597\" data-id=\"7294\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/victoriaDiagonalModoClaro.png\" alt=\"\" class=\"wp-image-7294\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/victoriaDiagonalModoClaro.png 723w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/victoriaDiagonalModoClaro-300x248.png 300w\" sizes=\"auto, (max-width: 723px) 100vw, 723px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" data-id=\"7292\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/victoriaHorizontalModoClaro.jpg\" alt=\"\" class=\"wp-image-7292\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/victoriaHorizontalModoClaro.jpg 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/victoriaHorizontalModoClaro-300x169.jpg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/victoriaHorizontalModoClaro-768x432.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"867\" height=\"597\" data-id=\"7293\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/victoriaVerticalModoClaro.png\" alt=\"\" class=\"wp-image-7293\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/victoriaVerticalModoClaro.png 867w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/victoriaVerticalModoClaro-300x207.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/victoriaVerticalModoClaro-768x529.png 768w\" sizes=\"auto, (max-width: 867px) 100vw, 867px\" \/><\/figure>\n<\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Pantalla del Final<\/h2>\n\n\n\n<p>Indicar\u00e1 que persona gan\u00f3 o si se empat\u00f3 <\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-7 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"857\" height=\"560\" data-id=\"7296\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/Empate.png\" alt=\"\" class=\"wp-image-7296\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/Empate.png 857w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/Empate-300x196.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/Empate-768x502.png 768w\" sizes=\"auto, (max-width: 857px) 100vw, 857px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" data-id=\"7295\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/pantallaGanadorModoClaro.jpg\" alt=\"\" class=\"wp-image-7295\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/pantallaGanadorModoClaro.jpg 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/pantallaGanadorModoClaro-300x169.jpg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/pantallaGanadorModoClaro-768x432.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Implementaci\u00f3n del software<\/h2>\n\n\n\n<p>El sistema se ha dise\u00f1ado como una m\u00e1quina de estados, que va cambiando de estado seg\u00fan van ocurriendo diferentes eventos como la pulsaci\u00f3n de botones o condiciones que se cumplen.<\/p>\n\n\n\n<p>Dichos estados se han representado mediante funciones, de forma que cada funci\u00f3n implementa la l\u00f3gica de un estado, y la l\u00f3gica del cambio de estado al siguiente. Los estado son:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Men\u00fa principal<\/li>\n\n\n\n<li>Eligiendo turno inicial<\/li>\n\n\n\n<li>En partida<\/li>\n\n\n\n<li>Comprobando victoria<\/li>\n\n\n\n<li>Mostrando ganador<\/li>\n<\/ul>\n\n\n\n<p>Adem\u00e1s, se han utilizado otras funciones auxiliares que mejoran la sem\u00e1ntica y facilitan la lectura del c\u00f3digo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3digo empleado<\/h2>\n\n\n\n<p>Para poder utilizar la pantalla, se han incluido las siguientes librer\u00edas, que permiten utilizar la pantalla de una manera m\u00e1s c\u00f3moda y f\u00e1cil:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;SPI.h&gt;<br>#include &lt;Adafruit_GFX.h&gt;<br>#include &lt;Adafruit_ILI9341.h&gt;<\/code><\/pre>\n\n\n\n<p>El c\u00f3digo comienza con una secci\u00f3n de constantes, que se utilizan para establecer valores de pines, adem\u00e1s de otros valores utilizados recurrentemente, que facilitan la lectura y el mantenimiento del c\u00f3digo:<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<pre class=\"wp-block-code\"><code>\/\/ Valores notas\n#define NOTE_A3 220\n#define NOTE_D4 294\n#define NOTE_DS5 622\n#define NOTE_E5 659\n#define NOTE_F5 698\n#define NOTE_G5 784\n#define NOTE_G2 98\n#define NOTE_A2 110\n#define NOTE_C4 262\n#define NOTE_E4 330\n#define NOTE_G4 392\n#define REST 0\n\n\/\/ Pines pantalla\n#define TFT_RESET 8\n#define TFT_DC 9\n#define TFT_CS 10\n#define TFT_MOSI 11\n#define TFT_MISO 12\n#define TFT_SCK 13\n\n\/\/ Otros pines\n#define LDR 1\n#define BOTON_ACCION 2\n#define BOTON_DER 3\n#define BOTON_IZQ 4\n#define BLUE 5\n#define RED 6\n#define BUZZER 7\n\n\/\/ Medidas del tablero\n#define FILAS 6\n#define COLUMNAS 7\n\n\/\/ Constantes del tablero\n#define X 1\n#define O 2\n#define E 3\n\n\/\/ Delay para la pulsaci\u00f3n de botones IZQ y DER\n#define DELAY 350\n\n\/\/ Color morado del empate y el error\n#define ILI9341_PURPLE 0x780F\n\n\/\/ sonidos\n#define SONIDOBOTON 392\n#define SONIDOERROR 110<\/code><\/pre>\n<\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Variables globales<\/h3>\n\n\n\n<p>Se han utilizado algunas variables globales, que deben ser persistentes entre diferentes iteraciones de loop<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int colorFondo;                \/\/ Color del fondo\n\n\/\/ Referencia a la pantalla\nAdafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCK, TFT_RESET, TFT_MISO);          \nint ganador;                   \/\/ Ganador de la partida\nint contFich;                  \/\/ Fichas colocadas en el tablero en una partida\nint fichasColumna&#091;COLUMNAS];   \/\/ Fichas colocadas en cada columna\nint tablero&#091;FILAS]&#091;COLUMNAS];  \/\/ Matriz para el tablero<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">setup<\/h3>\n\n\n\n<p>La hemos utilizado para establecer ciertos pines como entrada y salida, adem\u00e1s de para inicializar la pantalla.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void setup() {\n  \/\/ Establecer modo de los pines\n  pinMode(BOTON_ACCION, INPUT);\n  pinMode(BOTON_IZQ, INPUT);\n  pinMode(BOTON_DER, INPUT);\n  pinMode(RED, OUTPUT);\n  pinMode(BLUE, OUTPUT);\n  pinMode(BUZZER, OUTPUT);\n\n  \/\/Inicializar la pantalla\n  tft.begin();\n  tft.setRotation(3);\n  tft.setTextSize(8);\n  delay(1000);\n}\n\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">loop<\/h3>\n\n\n\n<p>La funci\u00f3n loop inicializa las variables del tablero para que comience la partida vac\u00edo. Despu\u00e9s, llama a las funciones pintarMenu, jugarPartida y mostrarGanador, que son los principales estados del sistema<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void loop() {\n  \/\/ Inicializar fichas por columna a 0\n  for (int i = 0; i &lt; COLUMNAS; i++) {\n    fichasColumna&#091;i] = 0;\n  }\n\n  \/\/ Inicializar tablero vac\u00edo\n  for (int i = 0; i &lt; FILAS; i++) {\n    for (int j = 0; j &lt; COLUMNAS; j++) {\n      tablero&#091;i]&#091;j] = 0;\n      fichasColumna&#091;j] = 0;\n    }\n  }\n\n  pintarMenu();\n  jugarPartida();\n  mostrarGanador();\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">pintarMenu<\/h3>\n\n\n\n<p>Esta funci\u00f3n se encarga de pintar el men\u00fa en la pantalla. Despu\u00e9s, pinta una flecha que parpadea pint\u00e1ndola en negro y blanco, y comprueba si se pulsa el bot\u00f3n para jugar la partida, en cuyo caso finaliza hace sonar una nota en el buzzer<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void pintarMenu() {\n\n\n  \/\/nos aseguramos de que cada vez que se pinte el men\u00fa est\u00e9 apagado el led\n\n  digitalWrite(RED, LOW);\n  digitalWrite(RED, LOW);\n\n  \/\/Se usa el valor que genera el LDR para decidir el color del texto y fondos\n\n  int val = analogRead(LDR);\n\n  if (val &lt; 350) {\n    colorFondo = ILI9341_BLACK;\n    tft.fillScreen(ILI9341_BLACK);\n    tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);\n    tft.setCursor(25, 75);\n    tft.setTextSize(5);\n    tft.print(\"4 en raya\");\n\n    tft.setCursor(10, 205);\n    tft.setTextSize(3);\n    tft.fillRoundRect(103, 145, 120, 50, 10, ILI9341_WHITE);\n    tft.setCursor(115, 155);\n    tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);\n    tft.print(\"Jugar!\");\n\n  } else {\n\n    colorFondo = ILI9341_WHITE;\n\n    tft.fillScreen(ILI9341_WHITE);\n    tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);\n    tft.setCursor(25, 75);\n    tft.setTextSize(5);\n    tft.print(\"4 en raya\");\n\n    tft.setCursor(10, 205);\n    tft.setTextSize(3);\n    tft.fillRoundRect(103, 145, 120, 50, 10, ILI9341_BLACK);\n    tft.setCursor(115, 155);\n    tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);\n    tft.print(\"Jugar!\");\n  }\n\n  \/\/Boton de jugar partida con una flecha que parpadea\n\n  long currentMilis = millis();\n  long time = currentMilis;\n  int color = 1;\n  tft.fillTriangle(35, 147, 70, 170, 35, 192, ILI9341_BLACK);\n\n  while (digitalRead(BOTON_ACCION) == LOW) {\n    currentMilis = millis();\n    if (currentMilis - time &gt; 850) {\n      if (color == 0) {\n        tft.fillTriangle(35, 147, 70, 170, 35, 192, ILI9341_BLACK);\n        color = 1;\n        time = currentMilis;\n      } else {\n        tft.fillTriangle(35, 147, 70, 170, 35, 192, ILI9341_WHITE);\n        color = 0;\n        time = currentMilis;\n      }\n    }\n  }\n\n  \/\/sonido al presionar el bot\u00f3n\n\n  tone(BUZZER, SONIDOBOTON, 200);\n  delay(200);\n  noTone(BUZZER);\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">jugarPartida<\/h3>\n\n\n\n<p>Esta funci\u00f3n implementa toda la l\u00f3gica necesaria para jugar una partida. Para ello, elegir\u00e1 un turno inicial aleatorio mediante la funci\u00f3n <em>elegirTurnoInicial()<\/em>, pintar\u00e1 el tablero en la pantalla, y a partir de ah\u00ed, ir\u00e1 alternando turnos hasta que alguien gane o se llene el tablero.<\/p>\n\n\n\n<p>Cada turno consistir\u00e1 en dejar que el jugador elija la columna en la que quiere colocar su ficha, comprobando mediante sentencias <em>if<\/em> si se han pulsado los botones laterales.<\/p>\n\n\n\n<p>Esto suceder\u00e1 hasta que se pulse el bot\u00f3n central, momento en el que se colocar\u00e1 la ficha en la columna elegida, coloc\u00e1ndose lo m\u00e1s abajo posible, implementado mediante el array <em>fichasColumna<\/em>, que representa las fichas colocadas en cada columa.<\/p>\n\n\n\n<p>Por \u00faltimo, antes de cambiar de turno, llama a la funci\u00f3n <em>comprobarVictoria()<\/em> para ver si ha ganado alguien, y comprobar\u00e1 si se ha llenado el tablero, para informar del empate.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nvoid jugarPartida() {\n  int turno = elegirTurnoInicial();\n  pintarTablero();\n  int victoria = 0;\n  contFich = 0;\n  int columna = 0;\n\n  while (victoria == 0) {\n    uint16_t color;\n    (turno == 1) ? color = ILI9341_RED : color = ILI9341_BLUE;\n\n    \/\/ Comprobar botones cambio de columna\n    long time = millis();\n    long currentMilis = time;\n    int columnaActual = columna;\n\n    int currentParpadeo = millis();\n    int parpadeo = millis();\n\n    while (digitalRead(BOTON_ACCION) == LOW) {\n\n      \/\/para el RGB\n\n      if (turno == 1) {\n        digitalWrite(RED, HIGH);  \/\/ Enciende el LED rojo\n        digitalWrite(BLUE, LOW);  \/\/ Apaga el LED azul\n      } else {\n        digitalWrite(RED, LOW);    \/\/ Apaga el LED rojo\n        digitalWrite(BLUE, HIGH);  \/\/ Enciende el LED azul\n      }\n\n      columnaActual = columna;\n      currentParpadeo = millis();\n\n      if (currentParpadeo - parpadeo &gt; 400) {\n        parpadeo = currentParpadeo;\n\n        if (color != colorFondo &amp;&amp; colorFondo != ILI9341_BLACK) {\n          color = ILI9341_WHITE;\n        } else if (color != colorFondo &amp;&amp; colorFondo == ILI9341_BLACK) {\n          color = ILI9341_BLACK;\n        } else {\n          color = (turno == 1) ? ILI9341_RED : ILI9341_BLUE;\n        }\n      }\n\n      tft.fillCircle(columnaActual * 40 + 40, 30, 10, color);\n      currentMilis = millis();\n\n      if (digitalRead(BOTON_IZQ) == HIGH &amp;&amp; currentMilis - time &gt; DELAY) {\n        time = currentMilis;\n        if (--columna &lt; 0) columna = COLUMNAS - 1;\n        tone(BUZZER, NOTE_E5, 100);\n        delay(100);\n        noTone(BUZZER);\n      }\n      if (digitalRead(BOTON_DER) == HIGH &amp;&amp; currentMilis - time &gt; DELAY) {\n        time = currentMilis;\n        columna = (++columna) % COLUMNAS;\n        tone(BUZZER, NOTE_E5, 100);\n        delay(100);\n        noTone(BUZZER);\n      }\n      if (columnaActual != columna) tft.fillCircle(columnaActual * 40 + 40, 30, 10, colorFondo);\n    }\n    if (fichasColumna&#091;columna] &gt;= FILAS) {\n      \/\/ poner una X cuando no est\u00e9 permitido poner m\u00e1s fichas\n      tft.fillCircle(columnaActual * 40 + 40, 30, 10, colorFondo);\n      drawX(columnaActual * 40 + 40, 30, 10, ILI9341_PURPLE);\n      tone(BUZZER, SONIDOERROR, 100);\n      delay(200);\n      drawX(columnaActual * 40 + 40, 30, 10, colorFondo);\n      continue;\n    }\n\n    tablero&#091;FILAS - 1 - fichasColumna&#091;columna]]&#091;columna] = turno;\n\n    \/\/ Dibujar ficha en el tablero\n    uint16_t colorFicha;\n    (turno == 1) ? colorFicha = ILI9341_RED : colorFicha = ILI9341_BLUE;\n    tft.fillCircle(40 * columna + 40, 210 - 30 * fichasColumna&#091;columna]++, 10, colorFicha);\n    tft.fillCircle(columnaActual * 40 + 40, 30, 10, colorFondo);\n    sonidoColocarFicha();\n\n    contFich++;\n\n    delay(DELAY);\n\n    if (contFich == FILAS * COLUMNAS) {\n      ganador = E;\n      victoria = E;\n      contFich = 0;\n    }\n\n    if (victoria == 0) {\n      if (victoria = comprobar_victoria(turno) != 0) ganador = turno;\n    }\n\n    turno = (turno == 1) ? 2 : 1;  \/\/ Cambiar turno\n  }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">elegirTurnoInicial<\/h3>\n\n\n\n<p>Esta funci\u00f3n elige un n\u00famero aleatorio entre 1 y 2, y hace una animaci\u00f3n alternando colores, que finaliza en el color del turno inicial. Durante esta animaci\u00f3n, el buzzer va haciendo sonidos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int elegirTurnoInicial() {\n\n  \/\/Inicializaciones\n  randomSeed(millis());\n\n  int val = analogRead(LDR);\n\n  if (val &lt; 350) {\n    colorFondo = ILI9341_BLACK;\n  }else{\n    colorFondo = ILI9341_WHITE;\n  }\n\n  tft.fillScreen(colorFondo);\n  tft.setTextSize(3);\n  tft.setTextColor(ILI9341_BLUE, colorFondo);\n\n  \/\/ Elegir aleatoriamente el turno inicial\n  int turnoInicial = random() % 2 + 1;  \/\/ Genera un n\u00famero aleatorio entre 1 y 2\n\n  \/\/ Hacer que el LED parpadee de azul a rojo\n  int ledColor = ILI9341_BLUE;\n  int parpadeo = millis();\n\n  int centroX = tft.width() \/ 2;\n  int centroY = tft.height() \/ 2;\n  int radioFicha = 30;\n\n  for (int i = 0; i &lt; 10; ++i) {  \/\/ Parpadear 10 veces tanto el circulo en pantalla como el led\n\n    if (ledColor == ILI9341_BLUE) {\n      digitalWrite(BLUE, HIGH);\n      digitalWrite(RED, LOW);\n      tft.fillCircle(centroX, centroY, radioFicha, ILI9341_BLUE);\n      tone(BUZZER, NOTE_A2, 200);  \/\/ Tono grave para el color azul\n\n    } else {\n      digitalWrite(BLUE, LOW);\n      digitalWrite(RED, HIGH);\n      tft.fillCircle(centroX, centroY, radioFicha, ILI9341_RED);\n      tone(BUZZER, NOTE_G2, 200);  \/\/ Tono grave para el color rojo\n    }\n\n\n    delay(200);  \/\/ Pausa entre cambios de color\n    ledColor = (ledColor == ILI9341_BLUE) ? ILI9341_RED : ILI9341_BLUE;\n  }\n\n  \/\/finalmente para mostrar al decidido comprobamos el turno inicial\n  \/\/ e imprimimos un msj\n\n  if (turnoInicial == 1) {\n\n    digitalWrite(BLUE, LOW);\n    digitalWrite(RED, HIGH);\n    tft.fillCircle(centroX, centroY, radioFicha, ILI9341_RED);\n\n    tft.setTextColor(ILI9341_RED, colorFondo);\n    tft.setCursor(60, 170);\n    tft.print(\"Jugador Rojo\");\n    tft.setCursor(80, 200);\n    tft.print(\"Comienza!!\");\n\n  } else if (turnoInicial == 2) {\n    digitalWrite(BLUE, HIGH);\n    digitalWrite(RED, LOW);\n    tft.fillCircle(centroX, centroY, radioFicha, ILI9341_BLUE);\n\n    tft.setTextColor(ILI9341_BLUE, colorFondo);\n    tft.setCursor(60, 170);\n    tft.print(\"Jugador Azul\");\n    tft.setCursor(80, 200);\n    tft.print(\"Comienza!!\");\n  }\n  \/\/un delay para que se pueda leer con calma\n  delay(250);\n\n  \/\/ Tocar una m\u00fasica de victoria al finalizar\n  if (turnoInicial == 1) {\n    \/\/ Tono para el jugador rojo\n    tone(BUZZER, NOTE_C4, 200);\n    delay(200);\n    tone(BUZZER, NOTE_E4, 200);\n    delay(200);\n    tone(BUZZER, NOTE_G4, 400);\n  } else {\n    \/\/ Tono para el jugador azul\n    tone(BUZZER, NOTE_G4, 200);\n    delay(200);\n    tone(BUZZER, NOTE_E4, 200);\n    delay(200);\n    tone(BUZZER, NOTE_C4, 400);\n  }\n\n  noTone(BUZZER);  \/\/ Apagar el tono\n\n  return turnoInicial;\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">pintarTablero<\/h3>\n\n\n\n<p>Esta funci\u00f3n simplemente se encarga de pintar en la pantalla las l\u00edneas necesarias para formar el tablero<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void pintarTablero() {\n\n  \/\/ Para pintar el tablero leemos el valor del LDR para saber si es necesario\n  \/\/poner el modo oscuro o el modo claro y dibujamos las l\u00edneas del tablero 7x7\n\n  int val = analogRead(LDR);\n\n  if (val &lt; 350) {\n\n    colorFondo = ILI9341_BLACK;\n    tft.fillScreen(ILI9341_BLACK);\n\n    for (int i = 0; i &lt;= tft.width(); i += 40) {\n      tft.drawLine(20 + i, 45, 20 + i, 225, ILI9341_WHITE);\n    }\n    for (int i = 30; i &lt;= tft.height(); i += 30) {\n      tft.drawLine(20, 15 + i, 300, 15 + i, ILI9341_WHITE);\n    }\n\n  } else {\n\n    colorFondo = ILI9341_WHITE;\n    tft.fillScreen(ILI9341_WHITE);\n\n    for (int i = 0; i &lt;= tft.width(); i += 40) {\n      tft.drawLine(20 + i, 45, 20 + i, 225, ILI9341_BLACK);\n    }\n    for (int i = 30; i &lt;= tft.height(); i += 30) {\n      tft.drawLine(20, 15 + i, 300, 15 + i, ILI9341_BLACK);\n    }\n  }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">comprobarVictoria<\/h3>\n\n\n\n<p>Esta funci\u00f3n es llamada al final de cada turno, y se encarga de recorrer el tablero buscando combinaciones de 4 fichas consecutivas iguales. Para ello. recibe el turno actual, y, mediante 4 series de bucles anidados recorre el tablero buscando victorias horizontales, verticales y diagonales respectivamente.<\/p>\n\n\n\n<p>En el caso de haber encontrado una victoria, se pinta una linea que parpadea indicando las 4 fichas que causan la victoria, y devuelve un valor que indica la victoria<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nint comprobar_victoria(int jugador) {\n  int fila, columna, i;\n  \/\/ Comprobar horizontal\n  for (fila = 0; fila &lt; FILAS; fila++) {\n    for (columna = 0; columna &lt; COLUMNAS - 3; columna++) {\n      int ganador = 1;\n      for (i = 0; i &lt; 4; i++) {\n        if (tablero&#091;fila]&#091;columna + i] != jugador) {\n          ganador = 0;\n          break;\n        }\n      }\n      if (ganador) {\n        ganar(columna, fila, columna + 3, fila);\n        return jugador;\n      }\n    }\n  }\n\n  \/\/ Comprobar vertical\n  for (columna = 0; columna &lt; COLUMNAS; columna++) {\n    for (fila = 0; fila &lt; FILAS - 3; fila++) {\n      int ganador = 1;\n      for (i = 0; i &lt; 4; i++) {\n        if (tablero&#091;fila + i]&#091;columna] != jugador) {\n          ganador = 0;\n          break;\n        }\n      }\n      if (ganador) {\n        ganar(columna, fila, columna, fila + 3);\n        return jugador;\n      }\n    }\n  }\n\n  \/\/ Comprobar diagonal (de izquierda a derecha)\n\n  for (fila = 0; fila &lt; FILAS - 3; fila++) {\n    for (columna = 0; columna &lt; COLUMNAS - 3; columna++) {\n      int ganador = 1;\n      for (i = 0; i &lt; 4; i++) {\n        if (tablero&#091;fila + i]&#091;columna + i] != jugador) {\n          ganador = 0;\n          break;\n        }\n      }\n      if (ganador) {\n        ganar(columna, fila, columna + 3, fila + 3);\n        return jugador;\n      }\n    }\n  }\n\n  \/\/ Comprobar diagonal (de derecha a izquierda)\n  for (fila = 0; fila &lt; FILAS - 3; fila++) {\n    for (columna = 3; columna &lt; COLUMNAS; columna++) {\n      int ganador = 1;\n      for (i = 0; i &lt; 4; i++) {\n        if (tablero&#091;fila + i]&#091;columna - i] != jugador) {\n          ganador = 0;\n          break;\n        }\n      }\n      if (ganador) {\n        ganar(columna, fila, columna - 3, fila + 3);\n        return jugador;\n      }\n    }\n  }\n\n  return 0;  \/\/ No hay ganador\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">mostrarGanador<\/h3>\n\n\n\n<p>Esta funci\u00f3n es llamada cuando finaliza una partida, y se encarga de mostrar en la pantalla el ganador de la partida, o informar del empate caso de que se diera.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void mostrarGanador() {\n  \/\/ para mostrar el ganador primero llenamos la pantalla con el color asignado\n  \/\/ para el modo claro o oscuro\n\n int val = analogRead(LDR);\n\n  if (val &lt; 350) {\n    colorFondo = ILI9341_BLACK;\n  }else{\n    colorFondo = ILI9341_WHITE;\n  }\n\n  tft.fillScreen(colorFondo);\n\n  \/\/colocamos el cursor desde donde queremos pintar y elegimos el tam de letra\n  tft.setCursor(50, 90);\n  tft.setTextSize(3);\n\n  \/\/si gana el 1 significa que gan\u00f3 el jugador rojo y el texto estar\u00e1 de su color\n  \/\/si es el 2 ser\u00eda el az\u00fal y para el empate se elige un morado intermedio\n\n  if (ganador == 1) {\n    tft.setTextColor(ILI9341_RED, colorFondo);\n    tft.print(\"Jugador Rojo\");\n    tft.setCursor(100, 140);\n    tft.print(\"Gana!!!\");\n    digitalWrite(RED, HIGH);\n\n  } else if (ganador == 2) {\n    tft.setTextColor(ILI9341_BLUE, colorFondo);\n    tft.print(\"Jugador Azul\");\n    tft.setCursor(100, 140);\n    tft.print(\"Gana!!!\");\n    digitalWrite(BLUE, HIGH);\n\n  } else {\n    tft.setTextColor(ILI9341_PURPLE, colorFondo);\n    tft.setCursor(80, 110);\n    tft.print(\"EMPATE!!!\");\n\n    digitalWrite(RED, HIGH);\n    digitalWrite(BLUE, HIGH);\n  }\n\n  sonidoVictoria();\n}<\/code><\/pre>\n\n\n\n<p>Adicionalmente, se han utilizado algunas funciones auxiliares, que facilitan la lectura del c\u00f3digo adem\u00e1s de mejorar su sem\u00e1ntica<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">drawX<\/h3>\n\n\n\n<p>Funcni\u00f3n que dibuja una X cuando intentas colocar una ficha en una columna que ya est\u00e1 llena<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void drawX(int x, int y, int size, uint16_t color) {\n  \/\/ Dibuja la primera l\u00ednea de la \"x\"\n  tft.drawLine(x - size, y - size, x + size, y + size, color);\n  \/\/ Dibuja la segunda l\u00ednea de la \"x\"\n  tft.drawLine(x - size, y + size, x + size, y - size, color);\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ganar<\/h3>\n\n\n\n<p>Funci\u00f3n que dibuja una l\u00ednea que parpadea entre las 4 fichas que conforman la combinaci\u00f3n ganadora<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void ganar(int x0, int y0, int x1, int y1) {\n  for (int i = 0; i &lt; 4; i++) {\n    tft.drawLine(x0 * 40 + 40, y0 * 30 + 60, x1 * 40 + 40, y1 * 30 + 60, ILI9341_BLACK);\n    delay(500);\n    tft.drawLine(x0 * 40 + 40, y0 * 30 + 60, x1 * 40 + 40, y1 * 30 + 60, ILI9341_WHITE);\n    delay(500);\n  }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">sonidoVictoria<\/h3>\n\n\n\n<p>Funci\u00f3n que toca una melod\u00eda de victoria en el buzzer cuando un jugador gana la partida<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void sonidoVictoria() {\n\n  \/\/sonido original para la victoria de un jugador, con sus notas escritas\n\n  int melody&#091;] = {\n    NOTE_G5, NOTE_G5, NOTE_G5, NOTE_G5,  \/\/ Sol\n    NOTE_DS5,                            \/\/ RE #\n    NOTE_F5,                             \/\/ Fa\n    NOTE_G5, NOTE_F5,                    \/\/ Sol, Fa\n    NOTE_G5                              \/\/ Sol\n  };\n\n  int noteDurations&#091;] = {\n    200, 200, 200, 500,  \/\/ Duraciones de las primeras notas\n    400,                 \/\/ Duraci\u00f3n de D#5\n    400,                 \/\/ Duraci\u00f3n de Fa\n    300, 300,            \/\/ Duraciones de Sol y Fa\n    500                  \/\/ Duraci\u00f3n de la \u00faltima nota\n  };\n\n  for (int i = 0; i &lt; sizeof(melody) \/ sizeof(melody&#091;0]); i++) {\n    tone(BUZZER, melody&#091;i], noteDurations&#091;i]);\n    delay(noteDurations&#091;i] + 20);  \/\/ peque\u00f1o delay entre notas\n  }\n  delay(200);  \/\/ Pausa final\n  noTone(BUZZER);\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">sonidoColocarFicha<\/h2>\n\n\n\n<p>Se llama a esta funci\u00f3n cada vez que se coloca una ficha en el tablero. Toca una peque\u00f1a melod\u00eda en el zumbador indicando que la ficha se ha colocado.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void sonidoColocarFicha() {\n\n  \/\/sonido al colocar la ficha, 3 simples todos ascendentes agradables de escuchar\n\n  int melody&#091;] = { NOTE_A3, NOTE_D4 };\n  int durations&#091;] = { 200, 200 };  \/\/ Duraci\u00f3n en milisegundos para cada nota\n\n  for (int i = 0; i &lt; sizeof(melody) \/ sizeof(melody&#091;0]); i++) {\n\n    tone(BUZZER, melody&#091;i], durations&#091;i]);\n    delay(durations&#091;i] + 50);  \/\/ Pausa peque\u00f1a entre cada nota\n    noTone(BUZZER);\n  }\n}<\/code><\/pre>\n\n\n\n<p>Finalmente, a\u00f1adir que el color de la pantalla cambia en base al valor de luminosidad que detecta el LDR, lo cual a\u00f1ade c\u00f3digo en muchas de las funciones.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Problemas y soluciones encontradas<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Pantalla<\/strong>: No logr\u00e1bamos conectar adecuadamente la pantalla. Para solucionarlo, buscamos varias gu\u00edas en YouTube para encontrar c\u00f3mo conectarla adecuadamente, adem\u00e1s de leer la documentaci\u00f3n para poder utilizar sus funciones.<\/li>\n\n\n\n<li><strong>Carcasa<\/strong>: Nos fue dif\u00edcil encontrar la manera m\u00e1s adecuada y \u00f3ptima de empotrar el circuito en una carcasa hecha a medida. Tuvimos que imprimirla varias veces. Finalmente lo solucionamos tras mucho ensayo y error.<\/li>\n\n\n\n<li><strong>Cableado<\/strong>: Una vez ten\u00edamos la carcasa, tuvimos problemas para cablear todo el circuito, cortarlos y mantener un tama\u00f1o adecuado para el sistema.<\/li>\n\n\n\n<li><strong>Zumbador<\/strong>: Tuvimos un fallo con el zumbador pues un error de conexi\u00f3n hizo que lo quem\u00e1ramos y tuvimos que conseguir otro<\/li>\n\n\n\n<li><strong>Concurrencia<\/strong>: Necesitamos que el Arduino haga m\u00e1s de una cosa a la vez en muchos casos, por lo que fue dif\u00edcil simular una concurrencia. Para solucionarlo, utilizamos la funci\u00f3n millis(), con sucesiones de condicionales.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Proyecto DSE Autores: Sergio Zarco M\u00e1rmol, Cristian Y\u00e1nez Cervino y Eva Ruiz Aguado. Introducci\u00f3n El proyecto que vamos a presentar a continuaci\u00f3n consiste en una consola port\u00e1til con la que jugar al cuatro en&#46;&#46;&#46;<\/p>\n","protected":false},"author":184,"featured_media":7627,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-7157","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.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Cuatro en raya - 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\/cuatro-en-raya\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cuatro en raya - Proyectos con Arduino.\" \/>\n<meta property=\"og:description\" content=\"Proyecto DSE Autores: Sergio Zarco M\u00e1rmol, Cristian Y\u00e1nez Cervino y Eva Ruiz Aguado. Introducci\u00f3n El proyecto que vamos a presentar a continuaci\u00f3n consiste en una consola port\u00e1til con la que jugar al cuatro en&#046;&#046;&#046;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/cuatro-en-raya\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2023-12-20T09:31:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-20T09:36:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaFrontal-4.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"757\" \/>\n\t<meta property=\"og:image:height\" content=\"949\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"DSE_2023_24_G03\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"DSE_2023_24_G03\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 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\\\/cuatro-en-raya\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/cuatro-en-raya\\\/\"},\"author\":{\"name\":\"DSE_2023_24_G03\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/4cdf5b735f0a5a95d6fdb38617f81b85\"},\"headline\":\"Cuatro en raya\",\"datePublished\":\"2023-12-20T09:31:49+00:00\",\"dateModified\":\"2023-12-20T09:36:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/cuatro-en-raya\\\/\"},\"wordCount\":1550,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/cuatro-en-raya\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2023\\\/12\\\/VistaFrontal-4.jpeg\",\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/cuatro-en-raya\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/cuatro-en-raya\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/cuatro-en-raya\\\/\",\"name\":\"Cuatro en raya - Proyectos con Arduino.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/cuatro-en-raya\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/cuatro-en-raya\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2023\\\/12\\\/VistaFrontal-4.jpeg\",\"datePublished\":\"2023-12-20T09:31:49+00:00\",\"dateModified\":\"2023-12-20T09:36:34+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/cuatro-en-raya\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/cuatro-en-raya\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/cuatro-en-raya\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2023\\\/12\\\/VistaFrontal-4.jpeg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2023\\\/12\\\/VistaFrontal-4.jpeg\",\"width\":757,\"height\":949},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/cuatro-en-raya\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cuatro en raya\"}]},{\"@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\\\/4cdf5b735f0a5a95d6fdb38617f81b85\",\"name\":\"DSE_2023_24_G03\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5538a503f3957e923f17064e5eda86a5ebbf9a086861156c39b7460fb605173b?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5538a503f3957e923f17064e5eda86a5ebbf9a086861156c39b7460fb605173b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5538a503f3957e923f17064e5eda86a5ebbf9a086861156c39b7460fb605173b?s=96&d=mm&r=g\",\"caption\":\"DSE_2023_24_G03\"},\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/author\\\/dse202324g03\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Cuatro en raya - 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\/cuatro-en-raya\/","og_locale":"es_ES","og_type":"article","og_title":"Cuatro en raya - Proyectos con Arduino.","og_description":"Proyecto DSE Autores: Sergio Zarco M\u00e1rmol, Cristian Y\u00e1nez Cervino y Eva Ruiz Aguado. Introducci\u00f3n El proyecto que vamos a presentar a continuaci\u00f3n consiste en una consola port\u00e1til con la que jugar al cuatro en&#46;&#46;&#46;","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/cuatro-en-raya\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2023-12-20T09:31:49+00:00","article_modified_time":"2023-12-20T09:36:34+00:00","og_image":[{"width":757,"height":949,"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaFrontal-4.jpeg","type":"image\/jpeg"}],"author":"DSE_2023_24_G03","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"DSE_2023_24_G03","Tiempo de lectura":"16 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/cuatro-en-raya\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/cuatro-en-raya\/"},"author":{"name":"DSE_2023_24_G03","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/4cdf5b735f0a5a95d6fdb38617f81b85"},"headline":"Cuatro en raya","datePublished":"2023-12-20T09:31:49+00:00","dateModified":"2023-12-20T09:36:34+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/cuatro-en-raya\/"},"wordCount":1550,"commentCount":0,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/cuatro-en-raya\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaFrontal-4.jpeg","articleSection":["Proyectos"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/cuatro-en-raya\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/cuatro-en-raya\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/cuatro-en-raya\/","name":"Cuatro en raya - Proyectos con Arduino.","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/cuatro-en-raya\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/cuatro-en-raya\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaFrontal-4.jpeg","datePublished":"2023-12-20T09:31:49+00:00","dateModified":"2023-12-20T09:36:34+00:00","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/cuatro-en-raya\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/cuatro-en-raya\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/cuatro-en-raya\/#primaryimage","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaFrontal-4.jpeg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/VistaFrontal-4.jpeg","width":757,"height":949},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/cuatro-en-raya\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"Cuatro en raya"}]},{"@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\/4cdf5b735f0a5a95d6fdb38617f81b85","name":"DSE_2023_24_G03","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/5538a503f3957e923f17064e5eda86a5ebbf9a086861156c39b7460fb605173b?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5538a503f3957e923f17064e5eda86a5ebbf9a086861156c39b7460fb605173b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5538a503f3957e923f17064e5eda86a5ebbf9a086861156c39b7460fb605173b?s=96&d=mm&r=g","caption":"DSE_2023_24_G03"},"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/author\/dse202324g03\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/7157","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\/184"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/comments?post=7157"}],"version-history":[{"count":16,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/7157\/revisions"}],"predecessor-version":[{"id":7626,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/7157\/revisions\/7626"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media\/7627"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=7157"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=7157"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=7157"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}