Depurar con Serial.print en Arduino

En esta pequeña guía os voy a enseñar algo básico para poder depurar tu programa con Serial.print y demás comandos.

Si eres programador, sabrás lo importante que son los logs para detectar fallos en tu programa, y dado que en Arduino no disponemos de sistema de ficheros, hay que emplear otros métodos para depurar. Uno de estos métodos es añadiendo trazas en tu programa que te muestren el resultado de la ejecución en una consola.

En Arduino se suele usar para ello los comandos Serial, entre los cuales se encuentran Serial.print y Serial.println. La única diferencia entre ambos es simplemente que Serial.println inserta un salto de línea al final, mientras que Serial.print no.

Serial.begin

Para poder usar la comunicación Serial tendremos que inicializarla, y este es cometido de esta función. Para ello simplemente tendremos que ejecutarla en la función setup() indicando la velocidad de datos. Esta velocidad es por norma de 9600 baudios en el Arduino IDE:

void setup() {
  Serial.begin(9600);
}

Con esto ya podremos comenzar a depurar nuestro programa.

Serial.print

La primera función que veremos es Serial.print. Esta función enviará el texto que escribamos directamente al IDE de Arduino para que lo veamos.

void setup() {
  Serial.begin(9600);
}

void loop() {
  int x = 5;
  int y = 3;
  int res = x + y;

  // Imprimimos los datos
  Serial.print("x: " + (String)x + " - y: " + (String)y + " - res: " + (String)res);
  delay(1000);
}

Serial.println

Tal y como comentaba en la introducción, esta función es exactamente igual que Serial.print, con la única diferencia de que añade un salto de línea. Su uso es básicamente para evitar tener que estar añadiendo el salto de línea manualmente.

void setup() {
  Serial.begin(9600);
}

void loop() {
  int x = 5;
  int y = 3;
  int res = x + y;

  // Imprimimos los datos
  Serial.println("x: " + (String)x + " - y: " + (String)y + " - res: " + (String)res);
  delay(1000);
}

Como podéis observar, en cada ejecución añade un salto de línea, por lo que nos ahorramos el tener que ponerlo nosotros manualmente.

Desactivar depuración

Seguramente te habrás preguntado: ¿y cuando termine de depurar tengo que eliminar todos los Serial?. La respuesta es que no hace falta, ya que Arduino nos permite activarlo o desactivarlo con tan sólo dos líneas:

#define DEBUG true
#define Serial if(DEBUG)Serial

Cambiando DEBUG a false se desactivan los comando Serial ahorrando así memoria y CPU, como se pueden observar en las siguientes imágenes:

Como se puede observar, con el DEBUG activo el consumo de SRAM y Memoria de programa es del 10% en ambos casos. Simplemente cambiando la línea a false, este consumo baja drásticamente a un 0% de memoria RAM, y un 1% de memoria de programa.

Ver los datos en el IDE

Hasta ahora os he enseñado cómo enviar los datos al PC usando Serial.print y Serial.println, pero no os he dicho cómo verlos. Para verlos es tan simple como abrir el menú Herramientas y pulsar sobre «Monitor Serie». Esto abrirá una nueva ventana en la que podréis ver los datos tal y como se ve en imágenes anteriores

Además, también podremos abrir la ventana pulsando Ctrl+Mayúsculas+M.

Decimales en los float

Si en algún momento has intentado mostrar floats a través de Serial.print, seguramente te habrás percatado de que sólo se envían hasta dos decimales. No te preocupes, porque este es el funcionamiento por defecto de la librería y Arduino no está recortando los decimales, por lo que si deseas mostrar más decimales, lo único que tienes que hacer es indicárselo:

void setup()   {
  Serial.begin(9600);
  float number = 15.005;
  Serial.println(number);
  Serial.println(number, 3);
}

void loop() {
}

Como puedes observar, el comando normal sólo muestra hasta los dos primeros decimales, sin embargo mostrará los tres decimales si se lo indicamos.

Ahorro de memoria RAM

Si usas para depurar con Serial.print o Serial.println muchos textos, es probable que el aumento de consumo de RAM aumente. Para evitar que esto se convierta en un problema se remienda el uso de la función F tal y como comento en mi post Ahorrar memoria SRAM.

Como se puede observar, la diferencia es más que notable. Con este simple truquito nos ahorramos 446 bytes de nuestra preciada RAM, a cambio de tan sólo 12 bytes de memoria de programa.

Y hasta aquí mi guía de cómo depurar tu programa con Serial.print. Espero que os haya servidor.

Un saludo!

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.