[Orador 1]: Hola y bienvenidos de nuevo a este curso energético. En este tercer vídeo del segundo módulo hablaremos sobre el último de los elementos, aparte de los sensores que ya hemos visto, que conectaremos a nuestro microcontrolador Arduino, un lector de tarjetas SD. Con él podremos guardar de forma permanente los datos de nuestras medidas. Revisaremos en este vídeo cómo almacenar de forma permanente datos en Arduino. Hablaremos sobre el módulo lector para tarjetas microSD, veremos sus operaciones básicas de manejo y un ejemplo para guardar ficheros CSV en estas tarjetas usando Arduino. Todas las placas Arduino incluyen una pequeña memoria persistente de tipo ROM programable que se puede borrar de forma electrónica. permite almacenar de forma permanente datos, configuraciones e incluso variables de sketch que queremos utilizar en diferentes programas. El problema es que la capacidad de esta memoria es muy escasa, apenas de un kilobyte, en el más grande de los casos entre Arduino Mega y Arduino Uno. Por supuesto, esos valores pueden expandirse mediante memorias externas, pero es una operación muy compleja que rara vez merece la pena en los sistemas de bajo coste de tipo Arduino. Por otro lado, el manejo de estas memorias no es nada sencillo, requiere realizar programación a bajo nivel, con control de direcciones de memoria, con escritura de datos específica en forma binaria, todo ello mediante decisiones y estrategias del nivel de programador, por lo que en general escapa del nivel de programación de Arduino. Como solución, existe una librería, la librería EEPROM.h, en la que existen una serie de funciones que nos simplifican ese trabajo. Las funciones read y write permiten manejar direcciones, formatos binarios, de forma más sencilla. Aún así, y a pesar de ello, es una tarea relativamente compleja. Por ello, a lo largo de los años han aparecido otros mecanismos mucho más sencillos de manejo y de mucha mayor capacidad. Por su alta disponibilidad actual, su capacidad y su pequeño tamaño, las memorias microSD son quizá el formato preferido para almacenar datos de forma persistente en Arduino. Existe en este tipo de plataformas un lector para poder conectar una tarjeta microSD al microcontrolador. Tenemos en la pantalla este tipo de lectores de tamaño muy reducido que cuentan con una librería totalmente integrada en el software Arduino y en el entorno Arduino IDE, lo cual simplifica muchísimo su uso y su manejo. La mayoría de estos modelos además ya incluyen todas las resistencias de pull-up necesarias y todos los montajes electrónicos precisos, de tal manera que simplemente es necesario conectar punto a punto con cables las salidas y entradas del lector con las salidas y entradas del microcontrolador. En conclusión, es posible realizar una conexión directa de los siguientes terminales. Alimentación, se alimentará a 3,3 o 5 voltios dependiendo del modelo. Tierra, normalmente indicado con las siglas GND por su nombre en inglés. Y finalmente los cuatro terminales propios del puerto SPI con el que podemos comunicar datos de la tarjeta al microcontrolador y viceversa. SPI, por sus siglas en inglés Serial Peripheral Interface, permite comunicar un dispositivo maestro con varios dispositivos esclavos, pero siempre de forma síncrona. Al contrario que vimos los puertos serie, los puertos UART, en los cuales se podía hacer de manera asíncrona. Siempre que un dispositivo SPI se conecta con un Arduino, es necesario incluir la librería SPI.h. Por tanto, a pesar de incluir la librería SD.h, en programas que necesiten la tarjeta SD con este tipo de lectores, también debe incluir la librería SPI.h. En concreto los cuatro puertos, los cuatro terminales SPI son los siguientes. Chip Select, usualmente nombrado como CS, permite seleccionar libremente el dispositivo de entre todos los SPI que están conectados al microcontrolador que se desea activar y con el que se va a establecer la comunicación. Pin MOSI, es el pin de datos que comunica el maestro con el esclavo, en esa dirección. El pin MOSI es específico de cada placa Arduino, no vale cualquier pin, no se puede configurar, necesita un soporte hardware y por lo tanto es uno específico. Por ejemplo, en Arduino Nano, en Arduino Uno es el pin 11. Pin MISO es el pin de comunicación en sentido contrario, desde el dispositivo esclavo, en este caso el lector de tarjetas SD, al dispositivo maestro, en este caso el microcontrolador Arduino. El pin MISO también, al igual que MOSI, es concreto de cada placa y hay que buscarlo en los mapas de pines. En Arduino Nano y en Arduino Uno es el pin 12. Finalmente, puesto que la comunicación, como hemos dicho, es síncrona, existe una señal de reloj habitualmente nombrada como SCK. Este pin envía el reloj siempre desde el dispositivo maestro al dispositivo esclavo. Una vez más, el pin de reloj es también concreto de cada placa. En Arduino Nano I1, que son los dispositivos que vamos a utilizar en las medidas, es el pin 13. Para iniciar la operación de guardar datos en un módulo SD simplemente debemos en la rutina de configuración añadir la instrucción SD.begin indicando el pin digital que vamos a utilizar como chip select, sea el 4 por ejemplo en nuestro caso o sea cualquier otro que podáis seleccionar. Para comprobar si un nombre de archivo ya existe en la tarjeta SD y por tanto no sobreescribirlo y borrar su contenido, se puede utilizar la función Exits, indicando como argumento el nombre del archivo en formato string, cadena de caracteres en español. Para manejar ficheros desde Arduino podemos utilizar el formato de datos File, que es un objeto con funciones y métodos propios para escribir, leer y comprobar diferentes características. Por ejemplo, en este trozo de código que tenemos aquí, podemos ver cómo se utiliza la función open de la tarjeta SD para crear un archivo con el nombre indicado y en formato tanto lectura como escritura, lo cual lo tenemos por el file barra baja write del segundo argumento. Podemos utilizar la lectura con read, como se puede ver, podemos utilizar println igual que si fuese un puerto serie para escribir y finalmente siempre tenemos que cerrar el fichero con.close para evitar que este quede ilegible. Finalmente, con todo lo visto, el código quedaría como se puede ver a continuación. Incluimos las dos librerías que hemos hablado, SPI y SD, declaramos un objeto file sobre el que realizaremos las operaciones, ponemos el begin sobre el chip select, en este caso como he dicho el pin 4, comprobamos si existe un fichero, en este caso datos.csv, Si no existe realizamos la apertura y creación de este fichero en formato lectura-escritura y pasamos utilizando la función println a escribir las medidas, primero el tiempo y después la de los tres sensores. Finalmente cerramos el fichero, el programa termina y tendríamos guardadas las medidas en nuestra tarjeta SD. En el bucle principal lo que haríamos sería en cada ciclo de medida aumentar el número de filas para añadir en cada instante las medidas de los diferentes sensores. En este caso como podemos ver en los pines A0, A1 y A2 hemos conectado los sensores y en cada bucle iremos añadiendo una nueva línea. Tenemos un delay para evitar que el archivo crezca de forma descontrolada y simplemente cuando deseásemos parar la ejecución tendríamos que desconectar Arduino. Es posible por supuesto incluir algún otro tipo de mecanismo como ya veremos en el módulo 4 cuando realicemos las medidas. Muchas gracias.