En varias ocasiones a través de los diferentes posts que he escrito para Panama Hitek me he atrevido a afirmar que el mejor modelo de Arduino hasta ahora es el Arduino Yún. Si me estoy equivocando o no, pues no lo sé pero de lo que estoy muy seguro es que el Yún es mi modelo favorito de Arduino. He utilizado el UNO, Leonardo, Micro, Nano, Mega, Lilypad e Intel Galileo pero el Yún es mi favorito.
Hoy voy a compartir con ustedes una de las herramientas más útiles que he tenido la oportunidad de utilizar con el Arduino Yún: las bases de datos SQLite. Este tipo de bases de datos son muy utilizadas en la actualidad por diferentes aplicaciones, entre las cuales destaca el Whatsapp. Esta aplicación móvil guarda dentro de un fichero *.db (propio de SQLite) la información de las conversaciones que tenemos con nuestros contactos. Esto es uno de los aspectos que genera mayores críticas sobre esta aplicación ya que se considera muy vulnerable ante cualquier ataque informático por lo fácil que resulta atacar esta base de datos. Para nosotros crear bases de datos SQLite en el Arduino Yún resulta muy provechoso ya que podemos almacenar información útil en ella de forma ordenada y bajo una estructura muy similar a MySQL u otras bases de datos basadas en SQL. En Panama Hitek mucho se ha escrito sobre MySQL:
- Lo que no se debe hacer: palabras reservadas en MySQL
- Creación de bases de datos MySQL con Xampp
- Crear formulario de registro con PHP y MySQL
- Los 7 pasos a seguir para el manejo de MySQL con Java
- Comunicar Java con base de datos MySQL
Estas bases de datos funcionan con servidores MySQL, ya sea a nivel local en una computadora o a nivel remoto en un servidor. SQLite no requiere de un servidor, lo cual hace esta tarea mucho más sencilla. Veamos cuales son los procedimientos para establecer una base de datos SQLite en el Arduino Yún.
-
- Tener nuestro Arduino Yún conectado a Internet
Conectamos nuestro Arduino Yún a Internet, ya sea a través de Ethernet o a través de WIFI. Podemos comprobar esto tecleando la IP del Yún en un navegador web (yo utilizo Chrome). Nos debe aparecer la siguiente ventana:
- Esto nos indica que nuestro Arduino está conectado a nuestra red y que está respondiendo a nuestras solicitudes.
-
Haber insertado y configurado una memoria MicroSD
Hace poco escribí un post sobre como expandir el espacio en disco del Arduino Yún. Se recomienda seguir dicho tutorial ya que la base de datos la montaremos sobre la memoria MicrsoSD.
-
Conectarnos al Arduino Yún por SSH
Ya hemos escrito sobre SSH en Panama Hitek. Debemos tener el software Putty en nuestra computadora (en el caso de Windows). Nos conectamos a la IP del Yún utilizando como nombre de usuario «root» (sin comillas) y como contraseña aquella que establecimos en el proceso de configuración del Arduino. Veremos la siguiente ventana:
- Instalar SQLite
En el terminal de SSH tecleamos los siguientes comandos (pueden copiar y pegar todo a la vez):
1 2 3 4 5 |
opkg update opkg install libsqlite3 opkg install php5-mod-sqlite3 opkg install python-sqlite3 opkg install sqlite3-cli |
-
Crear un directorio para bases de datos en la memoria MicroSD
Desde la consola accedemos a la memoria MicroSD:
1 |
cd /mnt/sda1 |
Ahora tecleamos «ls» para ver los dicheros en dicha ruta. Solamente veremos una carpeta llamada arduino. En la ruta /mnt/sda1 crearemos un directorio llamado databases. Esto lo logramos tecleando:
1 |
mkdir databases |
Accedemos al nuevo directorio que creamos:
1 |
cd databases |
Estamos listos para crear una base de datos.
- Creamos una base de datos de nombre «test»
Para ello, en la consola tecleamos:
1 |
sqlite3 test.db |
Se creará una base de datos llamada test.db Ahora que tenemos nuestra base de datos vamos a crear una tabla que llamaré registros. En ella colocaré dos columnas, una tipo TEXT llamada tiempo y otra tipo REAL llamada valor.
1 |
CREATE TABLE registros (tiempo TEXT, valor REAL); |
Ahora voy a insertar algunos valores en la tabla que acabo de crear:
1 2 3 4 5 |
INSERT INTO registros(tiempo, valor) VALUES ('07/11/2015 13:01:05', 505.0); INSERT INTO registros(tiempo, valor) VALUES ('07/11/2015 13:01:10', 515.0); INSERT INTO registros(tiempo, valor) VALUES ('07/11/2015 13:01:15', 535.0); INSERT INTO registros(tiempo, valor) VALUES ('07/11/2015 13:01:20', 523.0); INSERT INTO registros(tiempo, valor) VALUES ('07/11/2015 13:01:25', 512.0); |
Con estos valores en nuestra tabla podemos hacer una consulta tecleando el comando:
1 |
SELECT * FROM registros |
Como vemos, la información ha quedado guardada en la base de datos y puede ser obtenida a través de comandos en la consola.
Todas estas operaciones las hemos estado realizando sobre el procesador Atheros del Arduino Yún. Sin embargo también es posible insertar, modificar y obtener registros desde el microcontrolador ATmega32U4, el Arduino al que estamos acostumbrados.
-
Guardando y leyendo datos desde el Microcontrolador
El siguiente código permitirá guardar datos en la base de datos SQLite desde el propio lenguaje Arduino.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
#include <Bridge.h> #include <Process.h> Process date; void setup() { //Se inicia la comunicación serial Serial.begin(9600); delay(4000); while (!Serial); Serial.print("Initializing the bridge... "); //Se inicia la comunicación entre el microprocesador y el microcontrolador Bridge.begin(); Serial.println("OK"); } void loop() { //Si hay datos disponibles en el monitor serie... if (Serial.available() > 0) { String command = Serial.readString(); //Si el comando recibido es saveData... if (command == "saveData") { //Se obtiene el tiempo getTime(); String tiempo = ""; while (date.available() > 0) { int n = date.read(); if (n != 10) { tiempo += (char)n; } } //Se guarda la información en la base de datos. El tiempo y la lectura analógica en A0 saveData(tiempo, analogRead(A0)); } //Si el comando es getData... else if (command == "getData") { //Se obtiene la data desde la base de datos getData(); } } } //Se obtiene el tiempo actual en el microprocesador void getTime() { if (!date.running()) { date.begin("date"); date.addParameter("+%x %X"); date.run(); } } //Método para guardar los datos en la base de datos void saveData(String tiempo, double valor) { Process p; String cmd = "sqlite3 "; cmd += "-line "; cmd += "/mnt/sda1/databases/test.db "; //Query para almacenar la información en la tabla registros cmd += "'INSERT INTO registros (\"tiempo\", \"valor\") VALUES (\"" + tiempo + "\"," + valor + ");'"; //El echo permitirá conocer si se ha dado algún error cmd += " ; echo $?"; //Se ejecuta el Query p.runShellCommand(cmd); Serial.print("Guardando datos... "); while (p.available() > 0) { char c = p.read(); if (c == '1') { Serial.println("Error"); break; } else { Serial.println("OK"); break; } } Serial.flush(); } //Método para obtener los datos de la base de datos void getData() { Process p; String cmd = "sqlite3 "; cmd += "-line "; cmd += "/mnt/sda1/databases/test.db "; cmd += "'SELECT * FROM registros;';"; //Query para llamar la data desde SQLite p.runShellCommand(cmd); Serial.println("Leyendo base de datos... "); while (p.available() > 0) { char c = p.read(); Serial.print(c); } Serial.flush(); } |
Si subimos este código, al entrar al Monitor Serie tecleamos saveData. El resultado es el siguiente: Ahora si tecleamos getData… Estos son los registros que se encuentran guardados en la base de datos SQLite dentro de la MicroSD en el Arduino Yún. Bastante útil para proyectos donde se requiere almacenar grandes volúmenes de información. Espero que esta información sea útil para usted. Saludos.