Para programar en Arduino, como en cualquier otro lenguaje es muy útil disponer de una consola (Monitor Serial) que informe de lo que ocurre dentro de nuestros desarrollos.

Si tuviéramos un sistema de riego en la que la vida de nuestra planta favorita; llamémosle María; estuviera en juego, deberíamos controlar todos los estados para informar si hay algún fallo en nuestro sistema. Realmente esta información debería guardarse en un fichero para poder consultarlo posteriormente, pero de todas maneras hacemos uso del Monitor Serial para depurar y conocer cómo funciona nuestro programa en Arduino. De esta manera podemos asegurarnos que valores tienen algunas variables o que entradas y salidas recibimos de otros componentes conectados a nuestra placa. Por ejemplo podemos aplicarlo para conocer el valor de los sensores que estamos utilizando o de los paquetes que estamos recibiendo a través de sus pines.

Por ello voy a explicar antes cómo utilizar el Monitor Serial de forma rápida y sencilla que posteriormente utilizaremos en otros tutoriales.

El código básico para comunicar con este monitor es muy sencillo:


void setup() {
 Serial.begin(9600);
 Serial.println("Monitor Serial"); /* This message initialize with
 a message. Typpicaly is used "Hello World".*/
}

void loop(){
}

Es exactamente el mismo ejercicio que el típico “Hello World” que se enseña habitualmente; solo hay que especificar la velocidad de la comunicación con el puerto serie que suele ser de 9600 baudios y el String o valor que se quiere comunicar. Para ejecutar este programa una y otra vez solo hay que darle al botón de reset de Arduino y se iniciara cada vez la función Setup.

Cuidado con el tipo de valor que se intercambia de un lado a otro, no es lo mismo pasar un String, que un Integer, que un float y dependiendo de nuestra aplicación habremos de ser cautos, porque si no tendremos errores en nuestro programa y puede que algún disgusto. Para saber qué tipo de dato estamos pasando deberemos hacer una conversión de un tipo a otro o utilizar bien las funciones de escritura.

Print y println imprime datos ASCII; por lo que si introducimos un número y lo igualamos a una variable de tipo numero (int, float, double), éste no lo aceptará, porque es de tipo texto.

Write por otra parte escribe en binario como un byte o serie de bytes en el monitor. Es útil cuando hay que trabajar con protocolos de transmisión de datos, solo hay que sustituir la función “print” por “write” y aunque parezca que escriben lo mismo que no os engañen. Probad a escribir un número.

Ahora vamos a dar un paso más. Ahora queremos introducir un valor por teclado para mandar un valor al Arduino y que ésta imprima su valor numérico. Este programa lo utilizaremos para dar ordenes a otros elementos a través de alguno de sus pines de salida y así poder controlar un servomotor, encender Leds por teclado y lo que se nos ocurra.

String readString;

void setup() {
   Serial.begin(9600);
   Serial.println("Write a number");
}

void loop() {

   while (Serial.available()) {
      delay(3); /*delay to allow buffer to fill*/
      if (Serial.available() ) {
         char c = Serial.read(); /*gets one byte from serial buffer*/
         readString += c; /*makes the string readString*/
      }
   }

   if (readString.length() > 0) {
      Serial.println("The String is \""+readString+"\""); /*see what was received*/

      int number = readString.toInt();

      Serial.print("The Number is :");
      Serial.println(number); /*print to serial monitor to see number results*/

      readString="";
   }
}

Ahora lo que hacemos es leer la serie de números que introducimos. Lo que hacemos es leer uno a uno cada carácter dejando un pequeño espacio de tiempo para ir llenando el buffer. Con la función Serial.read leemos los datos de teclado y los añadimos a un string para visualizarlos como un conjunto. Después pasamos este número a un valor entero que es el valor con el que operaremos con otros dispositivos. Por ahora utilizamos enteros y más adelante nos complicaremos la vida para introducir números reales (float).

Por último comentaré que dependiendo de cómo se declare la variable que se iguala a la función Serial.read(), si es un char obtendremos la representación de teclado, pero si la variable es entera, nos aparecerá el valor decimal asociado a esa tecla.

NOTA: Probando este código he comprobado que no se puede asociar la variable Serial.read() a un tipo distinto de variable en un mismo programa. Serial.read() se asignará al primer tipo que se ha asociado, en este caso a un char y el num será todo el rato igual a -1. Si cambiamos el orden y la asignamos primero al tipo entero, nos dará el valor numérico de teclado, mientras que el carácter será todo el rato igual a ÿ.


char charByte = 0; /* Si usas un char,
aparece el caracter que escribes por teclado*/
int numByte = 0; /* Si usas un entero,
aparece el número que corresponde con el valor ASCII en Decimal*/
void setup() {
   Serial.begin(9600); /* abre el puerto serie a 9600 bps */
}

void loop() {

   /* envia datos solamente cuando recibe datos */
   if (Serial.available()) {
      /* lee el byte entrante*/
      charByte = Serial.read();
      numByte = Serial.read();
      /* dice lo que ha recibido */
      Serial.print("He recibido un caracter: ");
      Serial.println(charByte);
      Serial.print("He recibido un numero: ");
      Serial.println(numByte);
   }
}