4. DESCRIPCIÓN DEL SOFTWARE
4.3. Interfaz gráfica
4.3.2. Recepción de datos provenientes de Arduino
La recepción de los datos enviados desde el Arduino por el puerto serie se reciben a través de la función void serialEvent (Serial puerto), en la cual entra el programa cada vez que llega un dato desde este puerto Serial (hay un evento en el puerto). Dentro de esta función
62 Escuela Técnica Superior de Ingenieros Industriales (UPM) se decodifica la cadena que llega desde Arduino, introduciendo estos datos en los atributos de la clase Experiment. Se explicará esta clase con más detalle, especialmente el objeto creado de esta, sus atributos y métodos.
Los atributos de Experiment son:
int data[]: vector que almacena la cuenta que llega desde Arduino en la posición que le corresponde. Equivale al vector valueBin[] del firmware Arduino, por lo que tendrá una capacidad máxima de 512. Esta capacidad máxima se guarda mediante la constante MAX_BIN.
int number: variable entera que guarda el número de experimento realizado. Este valor aumenta al final de cada ensayo.
boolean filled: bandera que permite saber si el vector data[] está totalmente lleno. Esto sucederá cuando se llegue al carácter „B‟, el cual anuncia el fin de la secuencia.
String mode: cadena en la que se introduce el modo de ensayo que se realiza (manual, ordenador o autónomo).
int intTime: variable que recoge el tiempo de experimento.
int aux: variable que guarda parámetros auxiliares, como el número de experimentos o el tiempo de espera entre ensayos.
Estos tres últimos atributos se completan en los botones “Play” cuando se envían estos al código Arduino, tal y como se enunció en el anterior apartado. Su único valor es descriptivo, solo permiten conocer información del objeto de la clase Experiment.
El objeto creado de la clase Experiment se trata de expDb[], un array circular de Experiments de longitud MAX_EXPERIMENTS, que es una constante que indica el número máximo de experimentos que se guardan. En este caso son 512. A partir del siguiente, la información se rescribirá en un uno ya ocupado anteriormente. La declaración del objeto es la siguiente:
Figura 44: Declaración del objeto expDb[] de la clase Experiment.
Este objeto expDb[] se rellena dentro de la función void serialEvent(Serial puerto). Para facilitar la comprensión de lo que se realiza en esta función que salta en cada evento del Serial se muestra a continuación el código de la función:
Francisco Pérez Maquieira 63
Figura 45: Código de la función void serialEvent (Serial puerto), en la que se rellena el objeto expDb[].
Los datos que llegan de Arduino, como se explicó a la hora de explicar su código, comienzan con un carácter „A‟, tras el cual llegan los datos de las medidas, separadas por saltos de línea (llega un carácter de salto de línea, 10 en codificación ASCII, y seguidamente un carácter de retorno de carro, 13 en ASCII). Finalmente, llega un carácter „B‟, que indica el fin de la secuencia de datos.
Por tanto, se deberán encontrar estos caracteres „A‟ y „B‟, y guardar cada dato que se encuentre entre saltos de línea. Para ello, se guarda en la variable String str la cadena que llega del puerto serie, hasta que lee una nueva línea (puerto.readStringUntil(10)). Además, se guarda en la variable int pos la posición del retorno de carro (indexOf(13)).
Para que el dato guardado sea el correcto, se debe guardar desde el carácter 13 al carácter 10, sin incluirlos. Por esto, la sentencia str.substring(0, pos), guarda los caracteres dentro de este intervalo. Si la variable pos es nula, se dividirá la cadena hasta la longitud de la variable str.
64 Escuela Técnica Superior de Ingenieros Industriales (UPM) Tras dividir la cadena eliminando los saltos de línea, se deben encontrar los caracteres „A‟ y „B‟, e introducir lo que haya entre estos dos caracteres. Una vez encontrados, se procederá a realizar lo que se indica en el siguiente flujograma.
Figura 46: Flujograma de la función serialEvent (Serial puerto).
Como se puede observar en el flujograma, cuando encuentra el carácter „A‟, el objeto expDb[] actualiza los campos correspondientes al índice exp. La variable global int exp
contiene el número de experimentos contabilizados desde el inicio del programa. De esta forma, rellena los parámetros del objeto expDb[exp].number y expDb[exp].filled. Como la letra „A‟ es la primera que aparece en la secuencia, filled será falso, ya que el objeto todavía no está lleno. Además, se inicializa la variable global int index, índice del array data[], el cual se llena de los valores obtenidos de Arduino, y se verifica la bandera global boolean
in_frame, la cual permite conocer si el array está lleno una vez llega al carácter „B‟.
Si por otro lado se encuentra el carácter „B‟, y además la bandera in_frame es verdadera, el atributo de Experiment filled será verdadero, ya que significará que se ha terminado la secuencia obtenida de Arduino. Se incrementa aquí el valor de exp, teniendo en cuenta que si se llega al valor máximo de experimentos, volverá a 0, y sobrescribiendo los valores de antiguos experimentos. Es por esto que se utiliza el operador módulo (%). Por último, con el objetivo de depurar el programa sencillamente y observar si está funcionando correctamente, se crea la variable local int accum, la cual acumula todos los valores de un experimento. De esta forma se conocen cuántas medidas se han realizado en el tiempo de experimentación, de modo que si este número es muy distinto al teórico, se sabrá que hay algún error.
Si el carácter encontrado no es ni „A‟ ni „B‟, este será un carácter que indica una medida del sensor. Por esto, se crea la variable local int value, que contendrá el valor de la cadena, traducido a entero, y se guardará en el valor index del atributo expDb[].data[] del objeto. Tras
Francisco Pérez Maquieira 65 esto, index se incrementará para no sobrescribir el siguiente dato en el mismo valor del array.
Mediante esta función se definen perfectamente las medidas del sensor en el objeto expDb[]
de la clase Experiment, pudiendo trabajar en su representación sin ningún problema.