Enviar números de más de un dígito a Arduino

8
6213
Esta es una de las preguntas que más nos ha llegado en la sección de comentarios o a través del Facebook. Cómo enviar números de más de un dígito a Arduino o palabras enteras sin que la recepción se de caracter por caracter.

A continuación voy a explicar dos métodos para leer números o cadenas de caracteres desde el puerto Serie de Arduino. El primer método será por programación pura y dura al mejor estilo de la vieja escuela. El segundo método será preciso y conciso, una abreviación del primer método. Lo hago de esta forma debido a que hay personas que consultan este espacio para aprender sobre programación y resolver sus dudas sobre ciertas funciones del Arduino. El primer método, el cual llamaré Método Buffer está dirigido a los entusiastas que les gusta ejercitar su lógica y hacer las cosas a su manera. El segundo método, llamado Método Directo será simplemente una función que el Arduino posee que hará lo mismo que el Método Buffer pero mucho más sencillo y simple.

Método Buffer
Resulta que si subimos en nuestro Arduino el siguiente código:

Cuando abrimos el Monitor Serie y escribimos la secuencia numérica 1, 2, 3, 4, 5 obtenemos el siguiente resultado:

Lo que se hizo fue:

  • 1 (ENTER)
  • 2 (ENTER)
  • 3 (ENTER)
  • 4 (ENTER)
  • 5 (ENTER)

En la pantalla se muestra 49, 50, 51, 52 y 53. Estos son los equivalentes de los números del 1 al 5 en la tabla ASCII, como podemos ver en la siguiente imagen: Tabla ASCII   Debo confesar que el lenguaje Arduino me gusta cada día más y es porque siento que a medida que pasa el tiempo y se mejora el propio lenguaje de programación, este se parece más y más a Java, con el cual estoy muy familiarizado. Arduino se derivó de Processing, el cual nació de Java. De hecho el propio software Arduino IDE, donde se programa Arduino, está escrito en Java. Hago este comentario debido a que para corregir el problema de los caracteres en ASCII podemos utilizar un pequeño truco que inicialmente aprendí en Java y que luego me encontré con que en Arduino es posible hacer lo mismo. Una conversión de un entero a caracter utilizando (char). Modifiquemos el código y veamos el resultado de la conversión de número a caracter:

El resultado de la misma operación anterior ahora será: Enviar números de más de 2 dígitos a Arduino   Perfecto. Ahora si nos aparecen los mismos caracteres que escribimos. Pero, ¿que tal si escribimos una palabra o un número de más de un dígito? Escribamos Panama Hitek y veamos que pasa.

Para evitar que esto suceda lo que haremos será crear un buffer que almacene los caracteres que se van recibiendo y luego nos imprima el resultado cuando el buffer acabe de recibir la información.

Cuando intentamos escribir Panama Hitek obtendremos:

… lo mismo. Esto se debe a que transcurre muy poco tiempo entre el instante en que el Arduino detecta que hay un caracter disponible para ser leído en el Puerto Serie y la entrada en el while. Esto provoca que el Serial.available() del while solo devuelva un valor de 1, lo cual hace que los caracteres se impriman de forma individual. Esto se puede corregir de diferentes formas:

  • Aumentando la velocidad de transmisión de datos (los baudios por segundo, el 9600 del Serial.begin())
  • Colocando un pequeño delay luego del if(Serial.avaliable()>0)
  • Colocando un pequeño delay dentro del while.

Esto último será lo que haremos.

Y ahora el resultado será:

 Nota: El delay utilizado es el suficiente para este aplicación en específico pero puede variar según la cantidad de caracteres que se desee leer. Ahora si queremos enviar números de más de un dígito a Arduino necesitaremos utilizar una conversión de String a int. Para ello utilizamos el comando toInt():

El código presentado recibe un número cualquiera, lo transforma a número y calcula la raíz cuadrada del mismo y la muestra en pantalla.

Método Directo

Arduino posee un método llamado readString() dentro de la clase Serial que permite leer cadenas de caracteres. De igual forma posee un método llamado setTimeOut() para definir el tiempo que debe esperar el código antes de imprimir la cadena de caracteres y dar por terminada la recepción de paquetes de datos.

El código sería:

El resultado (el escribir Panama Hitek en el Monitor Serie):

Como podemos observar se da un pequeño retraso en la impresión del mensaje en el Monitor Serie. Esto se debe a que por default se espera 1 segundo para terminar de recibir los datos entrantes. Este tiempo se puede modificar con Serial.setTimeout(). El siguiente código incluirá una reducción del timeOut a 100 milisegundos y se repetirá lo mostrado en el Método Buffer donde se calcula la raíz cuadrada de un número introducido por teclado.

El resultado:

Esperamos que el concepto haya quedado claro y que la información suministrada sea de su comprensión y utilidad.

Saludos.

  • Duverney Hernandez Mora

    Gracias, era lo que necesitaba

  • Manuelin Castil Zung

    como anexo a arduino los caracteres de las tablas anteriores

    • Antony García González

      Explícate un poco más

  • Raúl

    Buen aporte!! En mi caso quiero guardar el dato que entra por el serial en na variable
    estoy usando una tipo int (int limit) escribiendo lo siguiente

    limit = Serial.read()// solo el primero de los caracteres
    limit = Serial.readstring()//da error de compilacion

    Sin embargo si copio su código si que me funciona, es decir se imprime lo que acabo de enviar. Con la excepcion de que el primer caracter o número no se imprime, es decir, si pongo “Zaragoza”, imprime “aragoza”

    Gracias y un saludo

    • Jaime Rodrigo

      Para empezar, tienes el segundo método mal escrito (Serial.readstring() => Serial.readString()).

      Si deseas hacerlo con Serial.readString() (el cual es un método más sencillo), debes tener en cuenta que esta es un objeto que se basa en cadenas de carácteres y por lo tanto no puedes declararla como entero (int).

      String prueba = Serial.readString();
      int limit = prueba.toInt();

    • Antony García González

      A la orden

  • Luizz Barrera

    Excelente información, me resulto muy útil muchas gracias

    • Antony García González

      Gracias a ti por comentar