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

23
29915
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.

0 0 votes
Article Rating
Suscríbete
Notify of
guest

23 Comments
newest
oldest most voted
Inline Feedbacks
View all comments
paulo rivitti
paulo rivitti
3 years ago

muy buena explicacion

dario
dario
3 years ago

Hola quisiera enviar una letra o un numero de a 3 dígitos por separado como podría hacer?

Franco
Franco
4 years ago

Muy buena la explicación, pero, si lo que quiero enviar no son números enteros sino decimales, por ejemplo 3.46 o 100.52. ¿Que hago en esa situación?

Adrian
Adrian
4 years ago

Muy bueno pero es mas para RECIBIR que para enviar. Yo ando buscando como enviar a un telefono, datos numericos via bluetooth y leerlos desde appinventor

Alonso
Alonso
5 years ago

Hola, como seria separar un numero de 6 digitos a dos numeros de tres digitos cada uno, para guardarlos en variables al mismo tiempo. Gracias

Alonso
Alonso
5 years ago

Hola, quisiera separar un numero de 6 digitos en dos numeros de 3 digitos, para guardarlos en variables y ocuparlas al mismo tiempo. Gracias

Alonso
Alonso
5 years ago

Hola, como sería para pasar el numero desde vb.net a arduino

Eduardo
Eduardo
5 years ago

Disculpen como puedo hacer lo mismo pero en vez de usar el PC ingresar los números mediante un teclado 4×4, hago lo que se muestra acá pero como no hay enter ni nada de eso los números se me siguen mostrando uno debajo del otro y necesito sacar uno sólo de por lo menos unidades decenas y centenas, gracias de antemano.

Luis Miguel Portugues Castillo
Luis Miguel Portugues Castillo
5 years ago

como valido los valores ingresados

Duverney Hernandez Mora
Duverney Hernandez Mora
6 years ago

Gracias, era lo que necesitaba

Manuelin Castil Zung
Manuelin Castil Zung
7 years ago

como anexo a arduino los caracteres de las tablas anteriores

Raúl
Raúl
7 years ago

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
Admin
7 years ago
Reply to  Raúl

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
Antony García González
7 years ago
Reply to  Raúl

A la orden

Luizz Barrera
Luizz Barrera
8 years ago

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