{"id":7588,"date":"2023-12-20T23:33:25","date_gmt":"2023-12-20T22:33:25","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=7588"},"modified":"2024-01-25T13:27:10","modified_gmt":"2024-01-25T12:27:10","slug":"pokemon-con-nfcs","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pokemon-con-nfcs\/","title":{"rendered":"Pok\u00e9mon con NFCs"},"content":{"rendered":"\n<p class=\"has-medium-font-size\"><strong>Introducci\u00f3n<\/strong><\/p>\n\n\n\n<p>El objetivo de este proyecto es crear una m\u00e1quina que permita jugar a un juego como Pok\u00e9mon. Las partidas son de un jugador contra otro jugador. La principal innovaci\u00f3n de este sistema es que utiliza c\u00f3digos NFC, de manera que dependiendo de la tarjeta que se pase por el lector se juega con un Pok\u00e9mon u otro, siendo cada tarjeta una especie de Pokeball.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Problemas durante el desarrollo<\/strong><\/p>\n\n\n\n<p>Durante el transcurso de este proyecto nos hemos encontrado diversos problemas a la hora de hacer funcionar todos los componentes en conjunto.<\/p>\n\n\n\n<p>El primer problema con el que dimos fue al montar la pantalla en la placa UNO, que al ser de tipo \u201cshield\u201d y montarse justo encima de esta, ocupaba casi la totalidad de sus puertos, por tanto no era posible conectar tambi\u00e9n el lector NFC.<br>Nuestra soluci\u00f3n fue adquirir la placa MEGA 2560, con la que obtuvimos m\u00e1s puertos libres con los que trabajar.<br>Y aqu\u00ed lleg\u00f3 nuestro segundo problema: vimos que el lector NFC necesitaba los mismos pines que el lector de tarjetas microSD de la pantalla, estos son los pines del bus SPI, que no se pueden cambiar, as\u00ed que a\u00f1adimos al sistema una prototype board con la que duplicamos estos pines y pudimos utilizarlos para los dos componentes sin problema.<\/p>\n\n\n\n<p>Cabe destacar que otra soluci\u00f3n a estos dos problemas tambi\u00e9n podr\u00eda haber sido usar dos placas UNO en conjunto, pero decidimos usar la MEGA con la prototype board por simplicidad y para conseguir un resultado bastante m\u00e1s compacto a la hora de introducirlo en una carcasa estilo GameBoy. <\/p>\n\n\n\n<p>En cuanto al lector NFC, desconoc\u00edamos que su correcto uso requer\u00eda soldarlo, por lo que estuvimos bastante tiempo intentando averiguar por qu\u00e9 no hac\u00eda contacto correctamente hasta que dimos con la soluci\u00f3n. Una vez soldado dej\u00f3 de dar problemas.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Componentes<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Nombre<\/strong><\/td><td><strong>Unidades<\/strong><\/td><td><strong>Precio (31\u20ac)<\/strong><\/td><\/tr><tr><td>ELEGOO Pantalla T\u00e1ctil TFT de 2,8 Pulgadas<\/td><td>1<\/td><td>15\u20ac<\/td><\/tr><tr><td>Pila 9V<\/td><td>1<\/td><td>4\u20ac<\/td><\/tr><tr><td>AZDelivery RFID (lector NFC)<\/td><td>1<\/td><td>7\u20ac<\/td><\/tr><tr><td>AZDelivery RFID Chips<\/td><td>4<\/td><td>5\u20ac<\/td><\/tr><tr><td>Arduino Mega 2560<\/td><td>1<\/td><td>&#8211;<\/td><\/tr><tr><td>MicroSD Sandisk 16GB<\/td><td>1<\/td><td>&#8211;<\/td><\/tr><tr><td>Cableado<\/td><td>&#8211;<\/td><td>&#8211;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Hardware<\/strong><\/p>\n\n\n\n<p>Placa Arduino Mega 2560<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"405\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/arduinoMega.jpg\" alt=\"\" class=\"wp-image-7808\" style=\"width:764px;height:auto\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/arduinoMega.jpg 720w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/arduinoMega-300x169.jpg 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"405\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/placa.jpg\" alt=\"\" class=\"wp-image-7813\" style=\"width:764px;height:auto\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/placa.jpg 720w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/placa-300x169.jpg 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Lector de tarjetas<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"407\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/lectorRFID.jpg\" alt=\"\" class=\"wp-image-7809\" style=\"width:764px;height:auto\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/lectorRFID.jpg 720w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/lectorRFID-300x170.jpg 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"522\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/llavero.jpg\" alt=\"\" class=\"wp-image-7816\" style=\"width:764px;height:auto\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/llavero.jpg 720w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/llavero-300x218.jpg 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Pantalla t\u00e1ctil TFT<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"405\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/pantalla.jpg\" alt=\"\" class=\"wp-image-7815\" style=\"width:764px;height:auto\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/pantalla.jpg 720w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/pantalla-300x169.jpg 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"405\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/pantalla-por-detras.jpg\" alt=\"\" class=\"wp-image-7819\" style=\"width:764px;height:auto\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/pantalla-por-detras.jpg 720w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/pantalla-por-detras-300x169.jpg 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Sistema completo conectado<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"405\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/proyecto2.jpg\" alt=\"\" class=\"wp-image-7807\" style=\"width:764px;height:auto\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/proyecto2.jpg 720w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/proyecto2-300x169.jpg 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"405\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/proyecto1.jpg\" alt=\"\" class=\"wp-image-7806\" style=\"width:764px;height:auto\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/proyecto1.jpg 720w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/proyecto1-300x169.jpg 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Software<\/strong><\/p>\n\n\n\n<p>En cuanto a la base de datos, para crear los distintos pok\u00e9mon hemos usado unas funciones que nos permiten escribir y guardarlos en la tarjeta SD. Para el proyecto solo tenemos 4 c\u00f3digos NFC por lo que solo hemos creado 4 pok\u00e9mon, cada uno con sus atributos. Tambi\u00e9n hemos usado una funci\u00f3n para crear f\u00e1cilmente los movimientos y los pok\u00e9mon. De esta forma, para incluir un nuevo pok\u00e9mon solamente habr\u00eda que aplicar los distintos atributos en la funciones y crear la imagen .bmp para el combate. La nueva informaci\u00f3n de pok\u00e9mon o de movimiento se env\u00eda a unos documentos en la SD que guardan toda la informaci\u00f3n, funcionando de forma similar a una base de datos.\u00a0Las funciones de escritura para guardar en la base reciben todos los campos y los escriben en sus documentos de text. Las funciones de lectura reciben un pokemon o un movimiento y su identificador, buscan en el documento de texto la informaci\u00f3n solicitada y rellenan los atributos.\u00a0<\/p>\n\n\n\n<p>Al inicio del juego, se pide por pantalla que el jugador 1 acerque su tarjeta NFC al lector. Una vez le\u00eddo, pide lo mismo para el Jugador 2 y crea una imagen de fondo con los dos pok\u00e9mon le\u00eddos. Estas tarjetas tienen un c\u00f3digo que se utiliza como identificador para los pok\u00e9mon. Al leer las tarjetas se accede a la base de datos para obtener los dem\u00e1s campos conociendo el ID.<\/p>\n\n\n\n<p>Sobre la pantalla, es importante destacar que es bastante nueva y emplea sus propias librer\u00edas por lo que hay pocos ejemplos en internet. Sin embargo, viene con un par de programas de prueba que pueden resultar muy \u00fatiles. Lo primero es inicializar la pantalla con los pines correctos. Programar el texto y las pantallas fue muy sencillo, bastaba con recurrir a las funciones de las librer\u00edas. Con cada combinaci\u00f3n de pok\u00e9mon se cre\u00f3 un fondo en formato .bmp de 24 bits para que as\u00ed la pantalla representase fehacientemente el combate. Con los botones pudimos volver a utilizar las librer\u00edas. Resulta interesante destacar que permiten bastante personalizaci\u00f3n, pudiendo variar el color del interior, de la l\u00ednea exterior e incluyendo un texto dentro del bot\u00f3n.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright\"><img loading=\"lazy\" decoding=\"async\" width=\"367\" height=\"489\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/image-95.png\" alt=\"\" class=\"wp-image-7848\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/image-95.png 367w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/image-95-225x300.png 225w\" sizes=\"auto, (max-width: 367px) 100vw, 367px\" \/><\/figure>\n<\/div>\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"367\" height=\"489\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/image-95.png\" alt=\"\" class=\"wp-image-7847\" style=\"width:246px;height:auto\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/image-95.png 367w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/image-95-225x300.png 225w\" sizes=\"auto, (max-width: 367px) 100vw, 367px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>El diagrama de flujo de una partida completa es el siguiente:<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><img decoding=\"async\" width=\"665px;\" height=\"498px;\" src=\"https:\/\/lh7-us.googleusercontent.com\/Km_yofsniPqMiPNVuK8BFsWDulAF_NTQjwwTenXDdl75WPdi-XQsBgefxOq3mxH4FPvSHrE84Th78T579WtNDzMigqPuH1nhzVv2SfNVM7rJdp_fi6iE1w_rbca_IC6jAeSWhopbIo14JjDic-47vxsCeA=s2048\"><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>V\u00eddeo explicativo<\/strong><\/p>\n\n\n\n<p>Enlace al v\u00eddeo con la explicaci\u00f3n y una prueba del funcionamiento del sistema:<\/p>\n\n\n\n<p><a href=\"https:\/\/drive.google.com\/file\/d\/1ntK_a7MnPx4Yf6eTb42QroKLgJClUcXY\/view?usp=sharing\">https:\/\/drive.google.com\/file\/d\/1ntK_a7MnPx4Yf6eTb42QroKLgJClUcXY\/view?usp=sharing<\/a><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>C\u00f3digo completo<\/strong><\/p>\n\n\n\n<p>Aqu\u00ed el c\u00f3digo del proyecto con algunos comentarios<\/p>\n\n\n\n<pre class=\"wp-block-code has-text-color has-link-color wp-elements-d58eb1a82201d384bc535c3b36a46048\" style=\"color:#0d0d12\"><code>#include &lt;Elegoo_GFX.h&gt;    \/\/ Core graphics library\n#include &lt;Elegoo_TFTLCD.h&gt; \/\/ Hardware-specific library\n\n#include &lt;TouchScreen.h&gt;   \/\/ Touch screen library \n\n#include &lt;SD.h&gt;\n#include &lt;SPI.h&gt;\n\n#include &lt;MFRC522.h&gt;      \/\/ Lector NFC\n\n#define MINPRESSURE 10      \/\/ presi\u00f3n del tactil\n#define MAXPRESSURE 1000\n\n#define YP A3               \/\/pines para el tactil\n#define XM A2  \n#define YM 9  \n#define XP 8   \n\n#define TS_MINX 120          \/\/tama\u00f1o del tactil\n#define TS_MAXX 900\n#define TS_MINY 70\n#define TS_MAXY 920\n\n#define LCD_CS A3 \/\/ Chip Select goes to Analog 3\n#define LCD_CD A2 \/\/ Command\/Data goes to Analog 2\n#define LCD_WR A1 \/\/ LCD Write goes to Analog 1\n#define LCD_RD A0 \/\/ LCD Read goes to Analog 0\n#define PIN_SD_CS 10 \/\/ Elegoo SD shields and modules: pin 10\n\n#define RST_PIN         19          \/\/ NFC\n#define SS_PIN          20          \/\/ NFC\n\n#define LCD_RESET A4 \/\/ Arduino's reset pin\n\n\/\/ colores\n#define  BLACK   0x0000\n#define BLUE    0x001F\n#define RED     0xF800\n#define GREEN   0x07E0\n#define CYAN    0x07FF\n#define MAGENTA 0xF81F\n#define YELLOW  0xFFE0\n#define WHITE   0xFFFF\n\n\/\/ \/\/ Color definitions\n#define ILI9341_DARKGREEN   0x03E0      \/*   0, 128,   0 *\/\n#define ILI9341_DARKGREY    0x7BEF      \/* 128, 128, 128 *\/\n#define ILI9341_BLUE        0x001F      \/*   0,   0, 255 *\/\n#define ILI9341_RED         0xF800      \/* 255,   0,   0 *\/\n#define ILI9341_ORANGE      0xFD20      \/* 255, 165,   0 *\/\n\n\n\/\/ Inicializar la pantalla TFT y el lector NFC\nElegoo_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);\n\nTouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);\nMFRC522 mfrc522(SS_PIN, RST_PIN);\n\n#define MAX_BMP         10                      \/\/ bmp file num\n\/\/#define FILE_OVERWRITE (O_READ | O_WRITE | O_CREAT)\n#define FILENAME_LEN    30                      \/\/ max file name length\n#define BUFFPIXEL       60                      \/\/ buffers\n#define BUFFPIXEL_X3    180                     \n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ VARIABLES DE IMAGEN \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nconst int __Gnbmp_height = 320;                 \/\/ bmp hight\nconst int __Gnbmp_width  = 240;                 \/\/ bmp width\n\nunsigned char __Gnbmp_image_offset  = 0;        \/\/ offset\n\nFile bmpFile;\n\nElegoo_GFX_Button button&#091;4];      \/\/botones y etiquetas para ellos\nchar mov1, mov2, mov3, mov4;\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ VARIABLES DE GAMEPLAY \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nstruct movimiento {\n  String nombre;\n  short tipo;     \/\/ 0 normal, 1 agua, 2 fuego, 3 planta\n  short efecto;   \/\/ 0 da\u00f1o, 1 defensa, 2 subir ataque, 3 subir salud, 4 resurreccion\n  float valorEfecto; \/\/valor inicial del efecto al que se le aplican las stats del pokemon para obtener el valor final del ataque\n  float precision;\n};\n\nstruct pokemon {\n  String id;   \/\/codigo nfc\n  String nombre;\n  short tipo;     \/\/0 normal, 1 agua, 2 fuego, 3 planta\n  struct movimiento movimientos&#091;4] = {{\"\", 0, 0, 0, 0},{\"\", 0, 0, 0, 0},{\"\", 0, 0, 0, 0},{\"\", 0, 0, 0, 0}};\n  float vida;\n  short velocidad;\n  float ataque;      \/\/ataque y defensa son valores float entre 1 y 3 por ejemplo, que se multiplican por el da\u00f1o o defensa del movimiento\n  float defensa;\n  bool defensaActiva = false;\n};\n\n\/\/variables globales\n\nstruct pokemon p1;\nstruct pokemon p2;\nbool turno_p1;              \/\/indica de que jugador es el turno\nstruct movimiento mov;      \/\/para el movimiento a usar en cada turno\nbool escaneados= false;    \/\/ true tras escanear ambos pokemons\nbool iniciaCombate = true;  \/\/asignar ciertos valores al inicio del combate\nbool jugada=false;         \/\/ true tras pulsar un boton para que se realice una jugada\nFile dataFile1;           \/\/para los archivos de la SD\nFile dataFile2;\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\nvoid writePokemon(String id, String nombre, short tipo, String movimientos1, String movimientos2, String movimientos3, \n                 String movimientos4, float vida, short velocidad, int ataque, int defensa) {\n  dataFile1 = SD.open(\"pokemon.txt\", FILE_WRITE); \/\/ Abre o crea el archivo \"pokemon.txt\" en modo de escritura\n  \n  if (dataFile1) {\n    \/\/ Escribir un registro en el formato deseado\n    dataFile1.print(id);\n    dataFile1.print(\" \");\n    dataFile1.print(nombre);\n    dataFile1.print(\" \");\n    dataFile1.print(tipo);\n    dataFile1.print(\" \");\n    dataFile1.print(movimientos1);\n    dataFile1.print(\" \");\n    dataFile1.print(movimientos2);\n    dataFile1.print(\" \");\n    dataFile1.print(movimientos3);\n    dataFile1.print(\" \");\n    dataFile1.print(movimientos4);\n    dataFile1.print(\" \");\n    dataFile1.print(vida);\n    dataFile1.print(\" \");\n    dataFile1.print(velocidad);\n    dataFile1.print(\" \");\n    dataFile1.print(ataque);\n    dataFile1.print(\" \");\n    dataFile1.println(defensa);\n    }\n  dataFile1.close();\n}\n\nvoid writeMovimientos (String nombre, short tipo, short efecto, int valor, float precision) {\n  dataFile1 = SD.open(\"movs.txt\", FILE_WRITE); \/\/ Abre o crea el archivo \"pokemon.txt\" en modo de escritura\n\n  if (dataFile1) {\n    \/\/ Escribir un registro en el formato deseado\n    dataFile1.print(nombre);\n    dataFile1.print(\" \");\n    dataFile1.print(tipo);\n    dataFile1.print(\" \");\n    dataFile1.print(efecto);\n    dataFile1.print(\" \");\n    dataFile1.print(valor);\n    dataFile1.print(\" \");\n    dataFile1.println(precision);\n    }\n  dataFile1.close();\n}\n\nvoid bmpdraw(File f, int x, int y){              \/\/dibujar la imagen de fondo\n    bmpFile.seek(__Gnbmp_image_offset);\n\n    uint32_t time = millis();\n\n    uint8_t sdbuffer&#091;BUFFPIXEL_X3];                 \/\/ 3 * pixels to buffer\n\n    for (int i=0; i&lt; __Gnbmp_height; i++) {\n        for(int j=0; j&lt;(240\/BUFFPIXEL); j++) {\n            bmpFile.read(sdbuffer, BUFFPIXEL_X3);\n            \n            uint8_t buffidx = 0;\n            int offset_x = j*BUFFPIXEL;\n            unsigned int __color&#091;BUFFPIXEL];\n            \n            for(int k=0; k&lt;BUFFPIXEL; k++) {\n                __color&#091;k] = sdbuffer&#091;buffidx+2]&gt;&gt;3;                        \/\/ read\n                __color&#091;k] = __color&#091;k]&lt;&lt;6 | (sdbuffer&#091;buffidx+1]&gt;&gt;2);      \/\/ green\n                __color&#091;k] = __color&#091;k]&lt;&lt;5 | (sdbuffer&#091;buffidx+0]&gt;&gt;3);      \/\/ blue\n                \n                buffidx += 3;\n            }\n\n      for (int m = 0; m &lt; BUFFPIXEL; m ++) {\n              tft.drawPixel(m+offset_x, i,__color&#091;m]);\n      }\n        }\n    }\n    \n    Serial.print(millis() - time, DEC);\n    Serial.println(\" ms\");\n}\n\nboolean bmpReadHeader(File f){           \/\/leer el archivo bmp de la imagen\n    \/\/ read header\n    uint32_t tmp;\n    uint8_t bmpDepth;\n    \n    if (read16(f) != 0x4D42) {\n        \/\/ magic bytes missing\n        return false;\n    }\n\n    \/\/ read file size\n    tmp = read32(f);\n    Serial.print(\"size 0x\");\n    Serial.println(tmp, HEX);\n\n    \/\/ read and ignore creator bytes\n    read32(f);\n\n    __Gnbmp_image_offset = read32(f);\n    Serial.print(\"offset \");\n    Serial.println(__Gnbmp_image_offset, DEC);\n\n    \/\/ read DIB header\n    tmp = read32(f);\n    Serial.print(\"header size \");\n    Serial.println(tmp, DEC);\n    \n    int bmp_width = read32(f);\n    int bmp_height = read32(f);\n    \n    if(bmp_width != __Gnbmp_width || bmp_height != __Gnbmp_height)  {    \/\/ if image is not 320x240, return false\n        return false;\n    }\n\n    if (read16(f) != 1)\n    return false;\n\n    bmpDepth = read16(f);\n    Serial.print(\"bitdepth \");\n    Serial.println(bmpDepth, DEC);\n\n    if (read32(f) != 0) {\n        \/\/ compression not supported!\n        return false;\n    }\n\n    Serial.print(\"compression \");\n    Serial.println(tmp, DEC);\n\n    return true;\n}\n\n\/\/ read data from the SD card file and convert them to big endian\nuint16_t read16(File f){\n    uint16_t d;\n    uint8_t b;\n    b = f.read();\n    d = f.read();\n    d &lt;&lt;= 8;\n    d |= b;\n    return d;\n}\n\nuint32_t read32(File f){\n    uint32_t d;\n    uint16_t b;\n\n    b = read16(f);\n    d = read16(f);\n    d &lt;&lt;= 16;\n    d |= b;\n    return d;\n}\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/ FUNCIONES AUXILIARES \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\n\/\/funciones para leer la SD y sacar los atributos\nstruct movimiento readMovimiento(struct movimiento mov, String nombre) {\n  dataFile2 = SD.open(\"movs.txt\", FILE_READ);\n\n  int en_proceso = 1;\n  String token;\n\n  if(dataFile2){\n    while (dataFile2.available() &amp;&amp; en_proceso==1) {\n      while(en_proceso == 1){\n        token = dataFile2.readStringUntil(' ');\n        if ((token==nombre)||(token==\"\")){\n          en_proceso = 0;\n        }else{\n          dataFile2.readStringUntil('\\n');\n        }\n      }      \n      if (token == nombre){\n        \/\/ if(dataFile2.readStringUntil(' ') == nombre) {\n        \/\/lee cada campo de la linea, separados por un espacio\n        mov.nombre = nombre;\n        mov.tipo = dataFile2.readStringUntil(' ').toInt();\n        mov.efecto = dataFile2.readStringUntil(' ').toInt();\n        mov.valorEfecto = dataFile2.readStringUntil(' ').toInt();\n        mov.precision = dataFile2.readStringUntil(' ').toFloat();\n        \/\/}\n\n        \/\/ Imprimir los valores (prueba)\n        Serial.print(mov.nombre);\n        Serial.print(\" \");\n        Serial.print(mov.tipo);\n        Serial.print(\" \");\n        Serial.print(mov.efecto);\n        Serial.print(\" \");\n        Serial.print(mov.valorEfecto);\n        Serial.print(\" \");\n        Serial.println(mov.precision);\n      }\n    }\n    dataFile2.close();\n  }\n  return mov;\n}\n\n\/\/ void readPokemon(struct pokemon p, String id) {\nstruct pokemon readPokemon(struct pokemon p, String id) {\n  Serial.print(\"Buscando ID \");\n  Serial.println(id);\n  dataFile1 = SD.open(\"pokemon.txt\", FILE_READ);\n  \n  int en_proceso = 1;\n  String token;\n\n  if(dataFile1){\n    while (dataFile1.available() &amp;&amp; en_proceso==1) {\n      while(en_proceso == 1){\n        token = dataFile1.readStringUntil(' ');\n        if ((token==id)||(token==\"\")){\n          en_proceso = 0;\n        }else{\n          dataFile1.readStringUntil('\\n');\n        }\n      }      \n\n      if (token == id){\n        Serial.println(\"ID encontrado\");\n\n        \/\/ if(dataFile1.readStringUntil(' ') == id) {\n        \/\/lee cada campo de la linea, separados por un espacio\n        p.id = id;\n        p.nombre = dataFile1.readStringUntil(' ');\n        Serial.println(\"Leyendo nombre\");\n        Serial.println(p.nombre);\n        \/\/p.tipo = dataFile1.readStringUntil('').toInt();\n        p.tipo = dataFile1.readStringUntil(' ').toInt();\n\n        p.movimientos&#091;0].nombre = dataFile1.readStringUntil(' ');\n        Serial.println(\"Leyendo  movimientos\");\n        p.movimientos&#091;0] = readMovimiento(p.movimientos&#091;0], p.movimientos&#091;0].nombre);\n\n        p.movimientos&#091;1].nombre = dataFile1.readStringUntil(' ');\n        p.movimientos&#091;1] = readMovimiento(p.movimientos&#091;1], p.movimientos&#091;1].nombre);\n        \n        p.movimientos&#091;2].nombre = dataFile1.readStringUntil(' ');\n        p.movimientos&#091;2] = readMovimiento(p.movimientos&#091;2], p.movimientos&#091;2].nombre);\n\n        p.movimientos&#091;3].nombre = dataFile1.readStringUntil(' ');\n        p.movimientos&#091;3] = readMovimiento(p.movimientos&#091;3], p.movimientos&#091;3].nombre);\n        \n        p.vida = dataFile1.readStringUntil(' ').toFloat();\n        p.velocidad = dataFile1.readStringUntil(' ').toInt();\n        p.ataque = dataFile1.readStringUntil(' ').toInt();\n        p.defensa = dataFile1.readStringUntil(' ').toInt();\n        \n        \/\/ Imprimir los valores (prueba)\n        Serial.print(p.id);\n        Serial.print(\" \");\n        Serial.print(p.nombre);\n        Serial.print(\" \");\n        Serial.print(p.tipo);\n        Serial.print(\" \");\n        Serial.print(p.movimientos&#091;0].nombre);\n        Serial.print(\" \");\n        Serial.print(p.movimientos&#091;1].nombre);\n        Serial.print(\" \");\n        Serial.print(p.movimientos&#091;2].nombre);\n        Serial.print(\" \");\n        Serial.print(p.movimientos&#091;3].nombre);\n        Serial.print(\" \");\n        Serial.print(p.vida);\n        Serial.print(\" \");\n        Serial.print(p.velocidad);\n        Serial.print(\" \");\n        Serial.print(p.ataque);\n        Serial.print(\" \");\n        Serial.println(p.defensa);\n      }\n    }\n    dataFile1.close();\n  }\n  return p;\n}\n\nvoid DrawBotones(){          \/\/imprime los botones para el manejo de los pokes durante el combate\n  char buttonLabel1&#091;6];\n  char buttonLabel2&#091;6];\n  char buttonLabel3&#091;6];\n  char buttonLabel4&#091;6];\n\n  if(turno_p1){                            \/\/dependiendo de quien sea el turno imprime unos movimientos u otros\n    for(int i=0; i&lt;5; i++){\n      buttonLabel1&#091;i] = p1.movimientos&#091;0].nombre&#091;i];\n      buttonLabel2&#091;i] = p1.movimientos&#091;1].nombre&#091;i];\n      buttonLabel3&#091;i] = p1.movimientos&#091;2].nombre&#091;i];\n      buttonLabel4&#091;i] = p1.movimientos&#091;3].nombre&#091;i];\n    }\n    \/\/mov1= p1.movimientos&#091;0].nombre&#091;0];\n    \/\/mov2= p1.movimientos&#091;1].nombre&#091;0];\n    \/\/mov3= p1.movimientos&#091;2].nombre&#091;0];\n    \/\/mov4= p1.movimientos&#091;3].nombre&#091;0];\n  }\n  else{\n    for(int i=0; i&lt;5; i++){\n      buttonLabel1&#091;i] = p2.movimientos&#091;0].nombre&#091;i];\n      buttonLabel2&#091;i] = p2.movimientos&#091;1].nombre&#091;i];\n      buttonLabel3&#091;i] = p2.movimientos&#091;2].nombre&#091;i];\n      buttonLabel4&#091;i] = p2.movimientos&#091;3].nombre&#091;i];\n    }\n  }\n  buttonLabel1&#091;5] = '\\0';\n  buttonLabel2&#091;5] = '\\0';\n  buttonLabel3&#091;5] = '\\0';\n  buttonLabel4&#091;5] = '\\0';\n\n  delay(1000);\n\n  button&#091;0].initButton(&amp;tft, 60, 205, 80, 30, BLACK, WHITE, BLACK, buttonLabel1, 1);\n  button&#091;0].drawButton();\n\n  button&#091;1].initButton(&amp;tft, 60, 265, 80, 30, BLACK, WHITE, BLACK, buttonLabel2, 1);\n  button&#091;1].drawButton();\n\n  button&#091;2].initButton(&amp;tft, 180, 205, 80, 30, BLACK, WHITE, BLACK, buttonLabel3, 1);\n  button&#091;2].drawButton();\n\n  button&#091;3].initButton(&amp;tft, 180, 265, 80, 30, BLACK, WHITE, BLACK, buttonLabel4, 1);\n  button&#091;3].drawButton();\n\n}\n\n\/\/FUNCIONES DE GAMEPLAY\n\nvoid leerTarjeta(struct pokemon *p){    \n  Serial.println(\" Lectura de tarjeta\");\n\n  int lectura_ok = 0;\n  while (lectura_ok == 0){\n                                            \/\/leer una tarjeta NFC\n    if (mfrc522.PICC_IsNewCardPresent() &amp;&amp; mfrc522.PICC_ReadCardSerial()) {\n      String idLeido = \"\";\n      int tam = mfrc522.uid.size;\n      if (tam &gt; 0){\n        for (byte i = 0; i &lt; tam; i++) {\n            idLeido += String(mfrc522.uid.uidByte&#091;i] &lt; 0x10 ? \"0\" : \"\") + String(mfrc522.uid.uidByte&#091;i], HEX);\n        }\n        idLeido.toUpperCase();\n        p-&gt;id = idLeido; \/\/ Asigna el ID le\u00eddo al pokemon\n        lectura_ok = 1;\n      }else{\n        Serial.print(\"Intentalo de nuevo\");\n      }\n\n    }\n  }\n  \/\/ Aqu\u00ed puedes a\u00f1adir m\u00e1s l\u00f3gica para asignar otros valores al pokemon si es necesario\n  mfrc522.PICC_HaltA(); \/\/ Halt PICC\n}\n\nvoid leerTarjetaOld(struct pokemon *p){    \n  Serial.println(\" Entrando en leer tarjeta\");\n                                          \/\/leer una tarjeta NFC\n  if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {\n        return;\n    }\n\n    String idLeido = \"\";\n    for (byte i = 0; i &lt; mfrc522.uid.size; i++) {\n        idLeido += String(mfrc522.uid.uidByte&#091;i] &lt; 0x10 ? \"0\" : \"\") + String(mfrc522.uid.uidByte&#091;i], HEX);\n    }\n    idLeido.toUpperCase();\n\n    p-&gt;id = idLeido; \/\/ Asigna el ID le\u00eddo al pokemon\n\n    \/\/ Aqu\u00ed puedes a\u00f1adir m\u00e1s l\u00f3gica para asignar otros valores al pokemon si es necesario\n    mfrc522.PICC_HaltA(); \/\/ Halt PICC\n}\n\nint devolverEfectividadTipo(int tipo1, int tipo2) {          \/\/IN GAME calcular la efectividad del movimiento en funcion del tipo del pokemon\n    if ((tipo1 == 0 || tipo2 == 0)||tipo1==tipo2) {\n      \/\/si alguno es de tipo normal o son iguales se devuelve 1\n      return 1;\n    }\n    \/\/hay que comprobar cual es cada una\n    if(tipo1==1){\n      if (tipo2 == 2)\n        return 2;\n      else\n        return 0.5;\n    }\n    if (tipo1 == 2) {\n      if (tipo2 == 3)\n        return 2;\n      else \n        return 0.5;\n    }\n    if (tipo1 == 3) {\n      if (tipo2 == 1)\n        return 2;\n      else \n        return 0.5;\n    }\n    \/\/si no ha saltado ninguna se devuelve -1 (ha habido algun error)\n    return -1;\n  }\n\nint calculoAtaque(struct pokemon atacante, struct movimiento mov, int tipoAtacado){ \/\/pokemon que ataca para conocer sus habilidades (velocidad, nivel,...), el movimiento que usa y el pokemon atacado para quitarle mas o menos vida dependiendo de su tipo\n  float aleatorio;\n  aleatorio = random(0, 1);\n  Serial.print(\"--------- Aleatorio \");\n  Serial.println(aleatorio);\n  Serial.print(\"--------- Efecto \");\n  Serial.println(mov.efecto);\n  Serial.print(\"--------- Precisi\u00f3n \");\n  Serial.println(mov.precision);\n  Serial.print(\"--------- Valor efecto \");\n  Serial.println(mov.valorEfecto);\n\n  if(mov.efecto != 1) {     \/\/ efectos: 0 da\u00f1o, 1 defensa\n    if(mov.precision &gt;= aleatorio)\n      return (mov.valorEfecto);\n    else\n      return 0;\n  }\n  else{\n    atacante.defensaActiva = true;     \/\/si efecto = 1 es un movimiento de defensa y activa la defensa\n    return 0;                          \/\/se defiende, no hace da\u00f1o\n  }\n}\n\n\/\/ void ataque(struct pokemon atacante, struct movimiento mov, struct pokemon atacado) {      \/\/realizar el movimiento del pokemon \n\/\/   int valorAtaque = calculoAtaque(atacante, mov, atacado.tipo);\n\/\/   int potenciador = devolverEfectividadTipo(atacante.tipo, atacado.tipo);\n\/\/   Serial.print(\"Da\u00f1o del ataque = \");\n\/\/   Serial.println(valorAtaque);\n\/\/   if(mov.efecto == 0){\n\/\/     if (atacado.defensaActiva){\n\/\/       if (atacado.defensa &lt;= valorAtaque)\n\/\/         atacado.vida -= ((valorAtaque * potenciador + atacante.ataque) - atacado.defensa);    \/\/si la defensa es menor o igual que el da\u00f1o, se causa el da\u00f1o restando la defensa al valor del ataque\n\/\/       else                                          \/\/si la defensa es mayor no se causa da\u00f1o\n\/\/         atacado.vida -= 0;\n\/\/       atacado.defensaActiva = false;                \/\/se desactiva este campo ya que no hay mas defensa\n\/\/     }\n\/\/   }\n\/\/   else if(mov.efecto == 1)  \/\/defensa\n\/\/     atacante.defensaActiva = true;\n\/\/   else if (mov.efecto == 2)  \/\/ataque\n\/\/     atacante.ataque += mov.valorEfecto;\n\/\/   else if (mov.efecto == 2)  \/\/salud\n\/\/     atacante.vida += mov.valorEfecto;\n\/\/   else if (mov.efecto == 4)  \/\/resurreccion\n\/\/     atacante.vida += mov.valorEfecto;\n\/\/ }\n\nvoid funcionBotones(){          \/\/control de la funcionalidad de los botones\n  \n  digitalWrite(13, HIGH);\n  TSPoint p = ts.getPoint();\n  digitalWrite(13, LOW);\n\n  pinMode(XM, OUTPUT);\n  pinMode(YP, OUTPUT);\n\n  Serial.println(\"---- Paso 1\");\n  Serial.println(p.z);\n  if (p.z &gt; MINPRESSURE &amp;&amp; p.z &lt; MAXPRESSURE) {\n    \/\/ scale from 0-&gt;1023 to tft.width\n    Serial.println(\"Paso 2\");\n    p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0);\n    p.y = (tft.height()-map(p.y, TS_MINY, TS_MAXY, tft.height(), 0));\n   }\n   \n  Serial.println(\"primer bucle\");\n  \/\/ go thru all the button, checking if they were pressed\n  for (uint8_t b=0; b&lt;4; b++) {\n    if (button&#091;b].contains(p.x, p.y)) {\n      Serial.print(\"Pressing: \"); Serial.println(b);\n      button&#091;b].press(true);  \/\/ tell the button it is pressed\n    } else {\n      button&#091;b].press(false);  \/\/ tell the button it is NOT pressed\n    }\n  }\n\n  \/\/ now we can ask the button if their state has changed\n  for (uint8_t b=0; b&lt;4; b++) {\n    if (button&#091;b].justReleased()) {\n      Serial.print(\"Released: \"); Serial.println(b);\n      button&#091;b].drawButton();  \/\/ draw normal\n    }\n    \n    if (button&#091;b].justPressed()) {\n      jugada=true;\n      Serial.println(\"Pressed\");\n      button&#091;b].drawButton(true);  \/\/ draw invert\n      if(turno_p1)                 \/\/ selecciona el movimiento del pokemon a hacer y activa la jugada\n        mov = p1.movimientos&#091;b];\n    }\n    else{\n      mov = p2.movimientos&#091;b];\n    }\n  }\n}\n\nchar* elegirFondo(char* filename){                                \/\/seleccionar la imagen de fondo en funcion de los pokes escaneados\n  \/\/char filename&#091;11];\n\n  for(int i=0; i&lt;=2; i++)  \/\/3 primeras letras de un poke\n  {filename&#091;i] = p1.nombre&#091;i];\n  Serial.println(p1.nombre&#091;i]);\n  }\n\n  for(int i=3; i&lt;=5; i++) \/\/3 primeras letras del otro poke\n  {filename&#091;i] = p2.nombre&#091;i-3];}\n\n  filename&#091;6] = '.';\n  filename&#091;7] = 'b';\n  filename&#091;8] = 'm';\n  filename&#091;9] = 'p';\n  filename&#091;10] = '\\0';\n\n  Serial.print(\"Filename: \");\n  Serial.println(filename);\n\n  return filename;\n}\n\nElegoo_GFX_Button buttons&#091;15];\n\/* create 15 buttons, in classic candybar phone style *\/\nchar buttonlabels&#091;15]&#091;5] = {\"Send\", \"Clr\", \"End\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"*\", \"0\", \"#\" };\nuint16_t buttoncolors&#091;15] = {ILI9341_DARKGREEN, ILI9341_DARKGREY, ILI9341_RED, \n                             ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE, \n                             ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE, \n                             ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE, \n                             ILI9341_ORANGE, ILI9341_BLUE, ILI9341_ORANGE};\n                             \nvoid setup(void) {\n\n  Serial.begin(9600);        \/\/ Initialize serial communications with the PC\n  Serial.println(\"======================\");\n  Serial.println(\"======================\");\n  tft.reset();\n   \n  tft.begin(0x9341);\n  \n  \n  #define MEGA2560_SD_CS_PIN 53\n  \/\/Init SD_Card\n  pinMode(MEGA2560_SD_CS_PIN, OUTPUT);\n\n  if (!SD.begin(10)) {\n    Serial.println(\"initialization failed!\");\n    tft.setCursor(0, 0);\n    tft.setTextColor(WHITE);    \n    tft.setTextSize(1);\n    tft.println(\"SD Card Init fail.\");   \n  }else\n  Serial.println(\"initialization done.\"); \n\n  SD.remove(\"pokemon.txt\");\n  SD.remove(\"movs.txt\");\n  delay(1000);\n  \/\/para pokemon\n  dataFile1 = SD.open(\"pokemon.txt\", FILE_WRITE); \/\/ Abre o crea el archivo \"pokemon.txt\" en modo de escritura\n  if (dataFile1) {\n    \/\/codigo, nombre, tipo, movimientos, vida, velocidad, ataque, defensa\n    writePokemon(\"537554A6\", \"Ratatta\", 0, \"Golpe\", \"Placaje\", \"Furia\", \"GranGolpe\", 100, 72, 56, 35);\n    writePokemon(\"A343D2A6\", \"Squirtle\", 1, \"PistolaAgua\", \"Tsunami\", \"FuerteEspiritu\", \"Defensa\", 50, 43, 48, 65);\n    writePokemon(\"63B176A6\", \"Charmander\", 2, \"Lanzallamas\", \"Abrasar\", \"Furia\", \"Defensa\", 100, 65, 52, 43);\n    writePokemon(\"932977B7\", \"Bulbasur\", 3, \"HojaAfilada\", \"FlorAfilada\", \"Resurreccion\", \"Defensa\", 85, 45, 49, 49);\n    dataFile1.close(); \/\/ Cierra el archivo despu\u00e9s de escribir los datos\n    Serial.println(\"Datos escritos en la tarjeta SD\");\n  } \n  else {\n    Serial.println(\"Error al abrir el archivo\");\n  }\n  \/\/para movimientos\n  dataFile1 = SD.open(\"movs.txt\", FILE_WRITE); \/\/ Abre o crea el archivo \"movimientos.txt\" en modo de escritura\n\n  if (dataFile1) {\n    \/\/ String nombre, short tipo (normal, agua, fuego, planta), short efecto (da\u00f1o, defensa, subir ataque, subir salud, resurreccion), int valor, float precision\n    \/\/de da\u00f1o\n    writeMovimientos(\"Golpe\", 0, 0, 80, 0.7);    \/\/normal\n    writeMovimientos(\"Placaje\", 0, 0, 60, 1.0);\n    writeMovimientos(\"GranGolpe\", 0, 0, 90, 0.4);\n    writeMovimientos(\"PistolaAgua\", 1, 0, 80, 0.7); \/\/agua\n    writeMovimientos(\"Tsunami\", 1, 0, 80, 0.6);\n    writeMovimientos(\"Lanzallamas\", 2, 0, 90, 0.5); \/\/fuego\n    writeMovimientos(\"Abrasar\", 2, 0, 70, 0.7);\n    writeMovimientos(\"HojaAfilada\", 3, 0, 85, 0.7); \/\/planta\n    writeMovimientos(\"FlorAfilada\", 3, 0, 65, 0.8);\n    \/\/de efecto\n    writeMovimientos(\"Defensa\", 0, 1, 1, 0.75); \/\/Defensa: 75 de precisi\u00f3n de defenderte del ataque del rival\n    writeMovimientos(\"Furia\", 0, 2, 25, 1); \/\/Furia: aumenta el ataque\n    writeMovimientos(\"FuerteEspiritu\", 0, 3, 50, 1); \/\/Fuerte esp\u00edritu: aumenta la vida actual\n    writeMovimientos(\"Resurreccion\", 0, 4, 145, 0.3); \/\/Resurrecci\u00f3n: 30 de precisi\u00f3n de que te cure toda la vida\n    dataFile1.close(); \/\/ Cierra el archivo despu\u00e9s de escribir los datos\n    Serial.println(\"Datos escritos en la tarjeta SD\");\n  } \n  else {\n    Serial.println(\"Error al abrir el archivo\");\n  }\n\n  \/\/\/\/\/\/\/\/\/\/\/\/ Pantalla de inicio \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n  tft.setRotation(2);               \/\/Vertical.         \n  tft.fillScreen(BLACK);    \/\/Fondo negro\n  tft.setTextColor(WHITE);  \/\/Texto blanco\n  tft.setTextSize(1);\n  tft.setCursor(30,60);\n  tft.print(\"Listo para un combate?\");\n  tft.setTextSize(3);\n  tft.setTextColor(CYAN);\n  tft.setCursor(20,150);\n  tft.print(\"ESCANEA TU\");\n  tft.setCursor(40,200);\n  tft.print(\"POKEMON\");\n\n  pinMode(SS_PIN, OUTPUT);\n  while (!Serial);           \/\/ Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)\n  SPI.begin();               \/\/ Init SPI bus\n  mfrc522.PCD_Init();        \/\/ Init MFRC522\n  Serial.println(F(\"Acerca el PICC para leer el UID...\"));\n  delay(3000);\n \n}\n\nvoid loop(void) {\n  \/\/ \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n  \/\/ INSERTANDO LOOP\n\n  delay(10);     \/\/ OJO! delay reducido!!\n\n  if(iniciaCombate){\n    Serial.println(\" Leyendo tarjeta 1\");\n    delay(1000);     \/\/ OJO! delay a\u00f1adidoido!!\n\n    leerTarjeta(&amp;p1);  \/\/escanear pokemon 1\n\n    tft.setRotation(2);               \/\/esperando que escanee al otro\n    tft.fillScreen(MAGENTA);    \n    tft.setTextSize(3);\n    tft.setTextColor(BLACK);\n    tft.setCursor(15,100);\n    tft.print(\"ESCANEA OTRO\");\n    tft.setCursor(40,160);\n    tft.print(\"POKEMON\");\n\n    Serial.println(\" Leyendo tarjeta 2\");\n    delay(4000);  \/\/espera para no leer dos veces el mismo\n\n    leerTarjeta(&amp;p2);  \/\/escanear pokemon 2\n\n    tft.fillScreen(BLACK); \n\n    \/\/ imprimir datos de poke\n    if (p1.id != \"\" &amp;&amp; p2.id != \"\") {\n        Serial.println(\"ID del Pokemon: \" + p1.id);\n        Serial.println(\"ID del Pokemon: \" + p2.id);\n        \/\/ Imprimir m\u00e1s informaci\u00f3n del pokemon si es necesario\n    }\n    \n    \/\/ Leer datos de los pokemons\n    p1 = readPokemon(p1, p1.id);\n    p2 = readPokemon(p2, p2.id);\n\n    tft.setRotation(0);\n\n    \/\/ Serial.println(elegirfFondo());\n    char filename&#091;11];\n    elegirFondo(filename);\n    bmpFile = SD.open(filename);\n    if (! bmpFile) {\n      Serial.println(\"didnt find image\");\n      tft.setTextColor(WHITE);    tft.setTextSize(1);\n      tft.println(\"didnt find BMPimage\");\n      while (1);\n    }\n   \n    if(! bmpReadHeader(bmpFile)) {\n      Serial.println(\"bad bmp\");\n      tft.setTextColor(WHITE);    tft.setTextSize(1);\n      tft.println(\"bad bmp\");\n      return;\n    }\n\n    bmpdraw(bmpFile, 0, 0);\n    bmpFile.close();\n    iniciaCombate = false;\n    Serial.println(\"Comparar velocidad\");\n    if(p1.velocidad &gt;= p2.velocidad)\n      turno_p1 = true;\n    else\n      turno_p1 = false;\n    \n    tft.setRotation(2);\n    DrawBotones(); \n    tft.fillRect(40, 30, 75, 20, WHITE);\n    tft.fillRect(160, 30, 75, 20, WHITE);\n        \n  }\n\n  \/\/ \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n  \/\/ FUNCION BOTONES\n\n  digitalWrite(13, HIGH);\n  TSPoint p = ts.getPoint();\n  digitalWrite(13, LOW);\n\n  pinMode(XM, OUTPUT);\n  pinMode(YP, OUTPUT);\n\n  \/\/ Serial.print(\"---- Presi\u00f3n \");\n  \/\/ Serial.println(p.z);\n  if (p.z &gt; MINPRESSURE &amp;&amp; p.z &lt; MAXPRESSURE) {\n    \/\/ scale from 0-&gt;1023 to tft.width\n    Serial.print(\"---- Presi\u00f3n detectada \");\n    Serial.println(p.z);\n    p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0);\n    p.y = (tft.height()-map(p.y, TS_MINY, TS_MAXY, tft.height(), 0));\n    \/\/ Serial.print(\"---- Coordenadas \");\n    Serial.print(p.x);\n    Serial.print(\"  , \");\n    Serial.println(p.y);\n   }\n\n  \/\/ Serial.println(\"primer bucle\");\n  \/\/ \/\/ go thru all the button, checking if they were pressed\n  for (uint8_t b=0; b&lt;4; b++) {\n    if (button&#091;b].contains(p.x, p.y)) {\n      Serial.print(\"---- Pulsaci\u00f3n capturada boton \");    \n      Serial.println(b);    \n      button&#091;b].press(true);  \/\/ tell the button it is pressed\n    } else {\n      button&#091;b].press(false);  \/\/ tell the button it is NOT pressed\n    }\n  }\n\n  \/\/ now we can ask the button if their state has changed\n  for (uint8_t b=0; b&lt;4; b++) {\n    if (button&#091;b].justReleased()) {\n      \/\/ Serial.print(\"Released: \"); Serial.println(b);\n      button&#091;b].drawButton();  \/\/ draw normal\n    }\n    \n    if (button&#091;b].justPressed()) {\n      jugada=true;\n      Serial.println(\"Pressed.  \");\n      button&#091;b].drawButton(true);  \/\/ draw invert\n\n      if(turno_p1)                 \/\/ selecciona el movimiento del pokemon a hacer y activa la jugada\n        mov = p1.movimientos&#091;b];\n      else\n        mov = p2.movimientos&#091;b];\n      delay(100); \/\/ UI debouncing\n    }\n  \n  tft.setTextColor(BLACK);  \/\/imprimir la vida de cada Poke\n  tft.setTextSize(2);\n  tft.setCursor(40,30);\n  tft.print(p1.vida);\n  tft.setCursor(160,30);\n  tft.print(p2.vida);\n\n  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ C\u00d3DIGO DEL COMBATE \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n  if((p1.vida &lt; 0) || (p2.vida &lt; 0)){ \/\/si un poke muere mostrar pantalla final y salir\n  \n    tft.fillScreen(MAGENTA);    \n    tft.setTextColor(WHITE);  \n    tft.setTextSize(1);\n    tft.setCursor(40,60);\n    tft.print(\"Fin del combate\");\n\n    tft.setTextSize(3);\n    tft.setCursor(20,180);\n    tft.print(\"Ganador:\");\n    tft.setCursor(20,220);\n  \n    if(p1.vida &lt;= 0)    \n      tft.print(p2.nombre);\n    else                \n      tft.print(p1.nombre);\n  \n    delay(1500);\n    while (true) {}\n  }    \n\n  if(jugada){          \/\/si se pulsa un bot\u00f3n\n    Serial.println(\"------- Atencion, jugada\");\n    Serial.print(\"IMPRIMIENDO VIDA J1 \");\n    Serial.print(p1.nombre);\n    Serial.println(p1.vida);\n    Serial.print(\"IMPRIMIENDO VIDA J2 \");\n    Serial.print(p2.nombre);\n    Serial.println(p2.vida);\n\n    if(turno_p1){\n        Serial.println(\"Turno de jugador 1\");\n\n        \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n        \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ ataque(p1, mov, p2);\n        \/\/\/\/\/\/\/\/\/\/\/\/\/\/ ataque(atacante, mov, atacado)\n        int valorAtaque = calculoAtaque(p1, mov, p2.tipo);\n        int potenciador = devolverEfectividadTipo(p1.tipo, p2.tipo);\n        Serial.print(\"Da\u00f1o del ataque = \");\n        Serial.println(valorAtaque);\n        Serial.print(\" Efecto \");\n        Serial.println(mov.efecto);\n\n        if(mov.efecto == 0){\n          if (p2.defensaActiva){\n            if (p2.defensa &lt;= valorAtaque)\n              p2.vida -= ((valorAtaque * potenciador + p1.ataque) - p2.defensa + 35);    \/\/si la defensa es menor o igual que el da\u00f1o, se causa el da\u00f1o restando la defensa al valor del ataque\n            else                                          \/\/si la defensa es mayor no se causa da\u00f1o\n              p2.vida -= 25;\n            p2.defensaActiva = false;                \/\/se desactiva este campo ya que no hay mas defensa\n          }else{\n            p2.vida -= 10;\n          }\n        }\n        else if(mov.efecto == 1)  \/\/defensa\n          p1.defensaActiva = true;\n        else if (mov.efecto == 2)  \/\/ataque\n          p1.ataque += mov.valorEfecto;\n        else if (mov.efecto == 3)  \/\/salud\n          p1.vida += mov.valorEfecto;\n        else if (mov.efecto == 4)  \/\/resurreccion\n          p1.vida += mov.valorEfecto;\n\n        Serial.println(\"El jugador 1 ha hecho su movimiento\");\n        turno_p1 = !turno_p1;\n    }\n      else {\n        Serial.println(\"Turno de jugador 2\");\n\n        \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n        \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ ataque(p2, mov, p1);\n        \/\/\/\/\/\/\/\/\/\/\/\/\/\/ ataque(atacante, mov, atacado)\n        int valorAtaque = calculoAtaque(p2, mov, p1.tipo);\n        int potenciador = devolverEfectividadTipo(p2.tipo, p1.tipo);\n        Serial.print(\"Da\u00f1o del ataque = \");\n        Serial.println(valorAtaque);\n        Serial.print(\" Efecto \");\n        Serial.println(mov.efecto);\n\n        if(mov.efecto == 0){\n          if (p1.defensaActiva){\n            if (p1.defensa &lt;= valorAtaque){\n              Serial.print(\"-- Potenciador\");\n              p1.vida -= ((valorAtaque * potenciador + p2.ataque) - p1.defensa + 35);    \/\/si la defensa es menor o igual que el da\u00f1o, se causa el da\u00f1o restando la defensa al valor del ataque\n            }else{                                          \/\/si la defensa es mayor no se causa da\u00f1o\n              Serial.print(\"-- No potenciador\");\n              p1.vida -= 25;\n            }\n            p1.defensaActiva = false;                \/\/se desactiva este campo ya que no hay mas defensa\n          }else{\n            p1.vida -= 10;\n          }\n        }\n        else if(mov.efecto == 1)  \/\/defensa\n          p2.defensaActiva = true;\n        else if (mov.efecto == 2)  \/\/ataque\n          p2.ataque += mov.valorEfecto;\n        else if (mov.efecto == 3)  \/\/salud\n          p2.vida += mov.valorEfecto;\n        else if (mov.efecto == 4)  \/\/resurreccion\n          p2.vida += mov.valorEfecto;\n\n        Serial.println(\"El jugador 2 ha hecho su movimiento\");\n        turno_p1 = !turno_p1;\n    }\n    Serial.println(\" Ataque completado\");\n    Serial.print(\" Vida p1 \");\n    Serial.println(p1.vida);\n    Serial.print(\" Vida p2 \");\n    Serial.println(p2.vida);\n    tft.fillRect(40, 30, 75, 20, WHITE);\n    tft.fillRect(160, 30, 75, 20, WHITE);\n\n    jugada = 0;\n  }\n\n  delay(10);\n\n  }   \n}\n\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n El objetivo de este proyecto es crear una m\u00e1quina que permita jugar a un juego como Pok\u00e9mon. Las partidas son de un jugador contra otro jugador. La principal innovaci\u00f3n de este sistema es&#46;&#46;&#46;<\/p>\n","protected":false},"author":197,"featured_media":7807,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-7588","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>Pok\u00e9mon con NFCs - 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\/pokemon-con-nfcs\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pok\u00e9mon con NFCs - Proyectos con Arduino.\" \/>\n<meta property=\"og:description\" content=\"Introducci\u00f3n El objetivo de este proyecto es crear una m\u00e1quina que permita jugar a un juego como Pok\u00e9mon. Las partidas son de un jugador contra otro jugador. La principal innovaci\u00f3n de este sistema es&#046;&#046;&#046;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/pokemon-con-nfcs\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2023-12-20T22:33:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-25T12:27:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/proyecto2.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"405\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"DSE_2023_24_G16\" \/>\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_G16\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 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\\\/pokemon-con-nfcs\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pokemon-con-nfcs\\\/\"},\"author\":{\"name\":\"DSE_2023_24_G16\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/bb2730817b0c2a86bfa96bb11a4f6234\"},\"headline\":\"Pok\u00e9mon con NFCs\",\"datePublished\":\"2023-12-20T22:33:25+00:00\",\"dateModified\":\"2024-01-25T12:27:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pokemon-con-nfcs\\\/\"},\"wordCount\":803,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pokemon-con-nfcs\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2023\\\/12\\\/proyecto2.jpg\",\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pokemon-con-nfcs\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pokemon-con-nfcs\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pokemon-con-nfcs\\\/\",\"name\":\"Pok\u00e9mon con NFCs - Proyectos con Arduino.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pokemon-con-nfcs\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pokemon-con-nfcs\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2023\\\/12\\\/proyecto2.jpg\",\"datePublished\":\"2023-12-20T22:33:25+00:00\",\"dateModified\":\"2024-01-25T12:27:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pokemon-con-nfcs\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pokemon-con-nfcs\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pokemon-con-nfcs\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2023\\\/12\\\/proyecto2.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2023\\\/12\\\/proyecto2.jpg\",\"width\":720,\"height\":405},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pokemon-con-nfcs\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Pok\u00e9mon con NFCs\"}]},{\"@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\\\/bb2730817b0c2a86bfa96bb11a4f6234\",\"name\":\"DSE_2023_24_G16\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2531e2f45b4a3f8acbc9a062b64423b921f45db1e24facec5948c984f8d2ff9a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2531e2f45b4a3f8acbc9a062b64423b921f45db1e24facec5948c984f8d2ff9a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2531e2f45b4a3f8acbc9a062b64423b921f45db1e24facec5948c984f8d2ff9a?s=96&d=mm&r=g\",\"caption\":\"DSE_2023_24_G16\"},\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/author\\\/dse202324g16\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Pok\u00e9mon con NFCs - 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\/pokemon-con-nfcs\/","og_locale":"es_ES","og_type":"article","og_title":"Pok\u00e9mon con NFCs - Proyectos con Arduino.","og_description":"Introducci\u00f3n El objetivo de este proyecto es crear una m\u00e1quina que permita jugar a un juego como Pok\u00e9mon. Las partidas son de un jugador contra otro jugador. La principal innovaci\u00f3n de este sistema es&#46;&#46;&#46;","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pokemon-con-nfcs\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2023-12-20T22:33:25+00:00","article_modified_time":"2024-01-25T12:27:10+00:00","og_image":[{"width":720,"height":405,"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/proyecto2.jpg","type":"image\/jpeg"}],"author":"DSE_2023_24_G16","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"DSE_2023_24_G16","Tiempo de lectura":"22 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pokemon-con-nfcs\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pokemon-con-nfcs\/"},"author":{"name":"DSE_2023_24_G16","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/bb2730817b0c2a86bfa96bb11a4f6234"},"headline":"Pok\u00e9mon con NFCs","datePublished":"2023-12-20T22:33:25+00:00","dateModified":"2024-01-25T12:27:10+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pokemon-con-nfcs\/"},"wordCount":803,"commentCount":0,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pokemon-con-nfcs\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/proyecto2.jpg","articleSection":["Proyectos"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/pokemon-con-nfcs\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pokemon-con-nfcs\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pokemon-con-nfcs\/","name":"Pok\u00e9mon con NFCs - Proyectos con Arduino.","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pokemon-con-nfcs\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pokemon-con-nfcs\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/proyecto2.jpg","datePublished":"2023-12-20T22:33:25+00:00","dateModified":"2024-01-25T12:27:10+00:00","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pokemon-con-nfcs\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/pokemon-con-nfcs\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pokemon-con-nfcs\/#primaryimage","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/proyecto2.jpg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2023\/12\/proyecto2.jpg","width":720,"height":405},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pokemon-con-nfcs\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"Pok\u00e9mon con NFCs"}]},{"@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\/bb2730817b0c2a86bfa96bb11a4f6234","name":"DSE_2023_24_G16","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/2531e2f45b4a3f8acbc9a062b64423b921f45db1e24facec5948c984f8d2ff9a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2531e2f45b4a3f8acbc9a062b64423b921f45db1e24facec5948c984f8d2ff9a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2531e2f45b4a3f8acbc9a062b64423b921f45db1e24facec5948c984f8d2ff9a?s=96&d=mm&r=g","caption":"DSE_2023_24_G16"},"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/author\/dse202324g16\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/7588","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\/197"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/comments?post=7588"}],"version-history":[{"count":14,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/7588\/revisions"}],"predecessor-version":[{"id":7849,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/7588\/revisions\/7849"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media\/7807"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=7588"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=7588"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=7588"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}