Muchas aplicaciones con microcontroladores hacen uso de cadenas de texto o strings. Debido al gran desarrollo de la internet y Ethernet en los microcontroladores y los sistemas de mensaje movil o gsm, los mensajes de texto se utilizan ampliamente para satisfacer estas necesidades. También proyectos que se comunican con computadores o muestran información en pantallas LCD, usan mucho los strings. Muchas cámaras de vigilancia, sistemas de comunicación de radio y antenas, equipos industriales y médicos, etc, usan paginas web para dar información a los usuarios y poder ser configurados por medio de un computador portátil. En este articulo aprenderemos como controlar strings para usar en proyectos electrónicos con Arduino.
Es posible adicionar al sistema Arduino, una tarjeta que contenga una interface a red Ethernet. Esto hace posible crear servidores web dentro de un microcontrolador y dar información a usuarios. También es común usar páginas web para configurar y monitorear la mayoría de equipos electrónicos modernos.
Así, se está desarrollando lo que se llama Internet de la cosas (IoT). Un sistema donde los equipos eléctricos y electrónicos se pueden controlar a través de internet. Páginas web son cadenas de texto o strings que usa un lenguaje llamado HTML o Lenguaje de Marcación de Texto y para transportar las strings, usa un protocolo llamado HTTP o Protocolo de Transporte de Texto. También los sistemas de posicionamiento geográfico global o GPS usan string para dar información. Los sistemas móviles de mensajes o GSM, también utilizan strings. Todo esto usa ampliamente las strings y por eso es importante conocer cómo crearlas y manipularlas.
En la Figura 1 podemos ver la tarjeta Arduino Uno y en la Figura 2 su IDE o ambiente de desarrollo y programación.
Los programas usados en este artículo pueden ser encontrados en el menú: Archivo->Ejemplos->Strings de la IDE de Arduino. Vea la Figura 3.
Cadenas de texto o strings son un tipo de dato usado en la mayoría de los compiladores para microcontroladores. La IDE de Arduino posee una biblioteca dedicada a String. Esta biblioteca posee las siguientes funciones:
String()
charAt()
compareTo()
concat()
endsWith()
equals()
equalsIgnoreCase()
getBytes()
indexOf()
lastIndexOf()
length()
remove()
replace()
reserve()
setCharAt()
startsWith()
substring()
toCharArray()
toInt()
toFloat()
toLowerCase()
toUpperCase()
trim()
En el presente artículo estudiaremos la mayoría de ellas con programas prácticos.
Cadenas de texto son como arrays de caracteres ASCII. Eso significa que ocupan un lugar en la memoria y que un carácter sigue al otro o esta después del otro. La Figura 4 muestra ejemplos de cadenas de texto almacenados en memoria.
Hay 2 maneras de crear cadenas de texto. Una es creando un objeto o estructura a partir de la Clase String. El siguiente es un ejemplo:
String reportString = "SensorReading: 456";
En la anterior línea de código, se ha creado un String llamado: reportString y se inicializo con el texto: SensorReading: 456. Podemos notar que objetos o datos string en C++ deben ser escritos con 'S' mayúscula (upper case). Objetos en C++, son muy similares a estructuras en lenguaje C. Así podemos decir que Objetos son como variables o datos de un determinado tipo o clase. Para el caso de este artículo, trabajaremos con objetos de la clase String.
La otra manera es crear un array de caracteres y el siguiente es un ejemplo:
char nameString[] = "Jhon";
La anterior línea de código crea un array de caracteres y almacena en ella el nombre: Jhon. Esta forma de crear string es el utilizado en la programación en C. Algunas de las funciones más usadas en este estilo C de programación para manejar string son:
strset(str1, str2) // Coloca un valor de texto en el string.
strcap(str1, str2) // Junta 2 string.
strlen(str1) // Retorna cuantos caracteres tiene la string.
Una desventaja al usar cadenas de texto o string en lengua C, es que, el programador debe definir previamente un array o espacio de memoria para almacenar los caracteres del string. Caso el string en algún momento sea más grande que lo proyectado, pueden haber algunos inconvenientes. Ya en el lenguaje C++, esto es gerenciado por el propio sistema de memoria, y por ese motivo, es mejor usar string en C++.
Para el desarrollo de este artículo usaremos principalmente objetos String o el estilo de programación C++. Los resultados de los programas ejemplo pueden ser vistos en el monitor serie de la IDE. Vea la Figura 5. Son muchas las ventajas de usar objetos String. Entre ellas, una mejor legibilidad en el código escrito y funciones más poderosas para manejar string.
OPERADOR DE ADICION PARA STRING.
Para adicionar un valor a una cadena de texto o string, usamos el operador de adición, representado por el símbolo '+'. Como comentado anteriormente, el lenguaje de programación para Arduino es basado en la C/C++. Por este motivo, muchos tipos de datos son basados en objetos o estructuras, haciendo más fácil la programación. Tal es el caso de las cadenas de texto o string, que permiten su fácil manipulación y concatenación. En el siguiente programa crearemos 3 strings, las cuales vamos a adicionar con otras string y valores de tipo numérico. El programa puede ser encontrado en el menú: Archivo->Ejemplos->Strings->StringAdditionOperator. El diagrama de flujo puede ser observado en la Figura 6.
// declare three Strings: String stringOne, stringTwo, stringThree; void setup() { // initialize serial and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } stringOne = String("You added "); stringTwo = String("this string"); stringThree = String(); // send an intro: Serial.println("\n\nAdding Strings together (concatenation):"); Serial.println(); } void loop() { // adding a constant integer to a String: stringThree = stringOne + 123; Serial.println(stringThree); // prints "You added 123" // adding a constant long integer to a String: stringThree = stringOne + 123456789; Serial.println(stringThree); // prints "You added 123456789" // adding a constant character to a String: stringThree = stringOne + 'A'; Serial.println(stringThree); // prints "You added A" // adding a constant string to a String: stringThree = stringOne + "abc"; Serial.println(stringThree); // prints "You added abc" stringThree = stringOne + stringTwo; Serial.println(stringThree); // prints "You added this string" // adding a variable integer to a String: int sensorValue = analogRead(A0); stringOne = "Sensor value: "; stringThree = stringOne + sensorValue; Serial.println(stringThree); // prints "Sensor Value: 401" or whatever value analogRead(A0) has // adding a variable long integer to a String: stringOne = "millis() value: "; stringThree = stringOne + millis(); Serial.println(stringThree); // prints "The millis: 345345" or whatever value millis() has // do nothing while true: while (true); }
OPERADOR APENDICE Y DE CONCATENACIÓN.
Una de las operaciones más usadas es adicionar un texto al final de una string. Para esto podemos usar el operador '+='. Cuando usamos este operador, el compilador adiciona al final de la string. En el siguiente programa podemos ver varios usos de este operador. También es posible utilizar la función concat(), para hacer concatenaciones de datos. El programa ejemplo puede ser encontrado en el menú: Archivo->Ejemplos->Strings->StringAppendOperator. El diagrama de flujo puede ser observado en la Figura 7.
String stringOne, stringTwo; void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } stringOne = String("Sensor "); stringTwo = String("value"); // send an intro: Serial.println("\n\nAppending to a String:"); Serial.println(); } void loop() { Serial.println(stringOne); // prints "Sensor " // adding a string to a String: stringOne += stringTwo; Serial.println(stringOne); // prints "Sensor value" // adding a constant string to a String: stringOne += " for input "; Serial.println(stringOne); // prints "Sensor value for input" // adding a constant character to a String: stringOne += 'A'; Serial.println(stringOne); // prints "Sensor value for input A" // adding a constant integer to a String: stringOne += 0; Serial.println(stringOne); // prints "Sensor value for input A0" // adding a constant string to a String: stringOne += ": "; Serial.println(stringOne); // prints "Sensor value for input" // adding a variable integer to a String: stringOne += analogRead(A0); Serial.println(stringOne); // prints "Sensor value for input A0: 456" or whatever analogRead(A0) is Serial.println("\n\nchanging the Strings' values"); stringOne = "A long integer: "; stringTwo = "The millis(): "; // adding a constant long integer to a String: stringOne += 123456789; Serial.println(stringOne); // prints "A long integer: 123456789" // using concat() to add a long variable to a String: stringTwo.concat(millis()); Serial.println(stringTwo); // prints "The millis(): 43534" or whatever the value of the millis() is // do nothing while true: while (true); }
CANBIO DE MINUSCULAS (LOWER CASE) A MAYUSCULAS (UPPER CASE) .
La biblioteca para manejo de texto o string, posee instrucciones o funciones para pasar de minúsculas para mayúsculas. En el siguiente ejemplo, construimos un texto minúsculo: "" y con la función toUpperCase(); lo convertimos para mayúsculas, es decir para: "". Después el programa crea un string mayúsculo y lo pasamos para minúscula. El programa ejemplo puede ser encontrado en el menú: Archivo->Ejemplos->Strings->StringCaseChanges. El diagrama de flujo puede ser observado en la Figura 8.
void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // send an intro: Serial.println("\n\nString case changes:"); Serial.println(); } void loop() { // toUpperCase() changes all letters to upper case: String stringOne = ""; Serial.println(stringOne); stringOne.toUpperCase(); Serial.println(stringOne); // toLowerCase() changes all letters to lower case: String stringTwo = ""; Serial.println(stringTwo); stringTwo.toLowerCase(); Serial.println(stringTwo); // do nothing while true: while (true); }
CONSIGUIENDO (GET) Y COLOCANDO (SET) CARACTERES EN UN STRING.
Para conocer o conseguir un carácter de una determinada posición en una string, se puede usar la función string.charAt(n). Es parámetro 'n' que recibe la función, es la posición del carácter en la string. La función retorna el valor del carácter. Para colocar (set) el valor de un carácter en una string, usamos la función string.setCharAt(index, c). El parámetro index es la posición del carácter. El parámetro 'c' es el valor del carácter que se desea modificar. El siguiente programa usa estas funciones para conseguir y colocar el valor de caracteres en una string y puede ser encontrado en el menú: Archivo->Ejemplos->Strings->StringCharacters. El diagrama de flujo puede ser observado en la Figura 9.
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("\n\nString charAt() and setCharAt():");
}
void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.println("\n\nString charAt() and setCharAt():"); } void loop() { // make a String to report a sensor reading: String reportString = "SensorReading: 456"; Serial.println(reportString); // the reading's most significant digit is at position 15 in the reportString: char mostSignificantDigit = reportString.charAt(15); String message = "Most significant digit of the sensor reading is: "; Serial.println(message + mostSignificantDigit); // add blank space: Serial.println(); // you can also set the character of a String. Change the : to a = character reportString.setCharAt(13, '='); Serial.println(reportString); // do nothing while true: while (true); }
En la segunda parte de este artículo veremos cómo utilizar operadores para la comparación de cadenas, comprobar cuántos caracteres tiene una cadena y cómo quitar los espacios en blanco. Parte 2 en MIC032S.