0% encontró este documento útil (0 votos)
42 vistas

Estructuras en Arduino C++ - Tienda y Tutoriales Arduino

El documento describe el uso de estructuras en C++ para Arduino. Las estructuras permiten agrupar variables relacionadas para representar objetos o conceptos complejos. Se explican los conceptos básicos de declaración de estructuras, acceso a sus miembros y el uso de estructuras anidadas.

Cargado por

Telmo Miguel
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
42 vistas

Estructuras en Arduino C++ - Tienda y Tutoriales Arduino

El documento describe el uso de estructuras en C++ para Arduino. Las estructuras permiten agrupar variables relacionadas para representar objetos o conceptos complejos. Se explican los conceptos básicos de declaración de estructuras, acceso a sus miembros y el uso de estructuras anidadas.

Cargado por

Telmo Miguel
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 8

(https://www.prometec.

net)

TIENDAS (HTTPS://STORE.PROMETEC.NET) ARDUINO (HTTPS://WWW.PROMETEC.NET/INDICE-TUTORIALES) RASPBERRY PI (HTTPS://WWW.PROMETEC.NET/INDICE-RASPBERRY-PI/)

CONTACTO (HTTPS://WWW.PROMETEC.NET/CONTACT/) SUSCRIPCIONES (HTTPS://WWW.PROMETEC.NET/CUENTA-DE-MEMBRESIA/TIPOS-DE-SUSCRIPCION/)

ESTRUCTURAS EN ARDUINO C++


Conociendo las struct

OBJETIVOS

   

 Presentar el concepto de las estructuras C++.

 Mostrar  la instrucción struct.

 Ver unos ejemplos sencillos.

MATERIAL REQUERIDO.

 Arduino UNO o equivalente.

(https://www.prometec.net/wp-content/uploads/2014/09/ArduinoUNO.jpg)

ESTRUCTURAS

Uno de los objetivos declarados de esta humilde pagina es ayudar, a quienes lo deseen, a aprender a programar . En esa linea hemos ido viendo pequeños ejemplos de como utilizar
las instrucciones y variables de C para ir creando esos pequeños (O mayores) programa que dan vida a nuestros proyectos en Arduino.

Siguiendo con las posibilidades del lenguaje C, se nos había quedado por el camino una instrucción importante como son las estructuras, y que resultan de la mayor importancia a
medida que nuestros programas van ganando complejidad.

El objetivo de esta sesión es corregir tan agrante omisión, primero por su importancia intrínseca y segundo porque con esta sesión vamos a cerrar el ciclo de instrucciones que
vienen de C para poder pasar en próximas sesiones ya, a la parte de C++ y la programación orientada a objetos (OOP).

Como iremos viendo, C++ es un superset de C que se desarrolló con esta idea en mente de de incorporar la OOP , a uno de los lenguajes de mas éxito de la historia, y con la
intención expresa de conservar en la medida de lo posible la sintaxis original de C.
En este sentido, las sintaxis de las clases y métodos de C++ para OOP, descienden y aumentan muchas de las propiedades de las struct de C, por lo que su descripción es de la
mayor importancia para poder en lar la programación orientada a objetos en C++.

A estas alturas de la película los habituales de estas paginas, estáis acostumbrados a la idea de usar variables para resolver algoritmos. Los tipos normales como int,long, char o
string están incluidos en el propio C y dan buen juego, pero antes o después nos encontraremos con problemas en los que necesitamos algo un poco mas so sticado.

Por ejemplo, supón que necesitamos escribir un programa general que sepa qué modelo de Arduino estamos usando en un proyecto concreto, y de ese modo utilizar unos pines u
otros.

Seria interesante de nir una variable que identi cara tal modelo, pero si usamos una simple cadena de texto para el nombre, no incluye que pines hay disponibles o a que voltaje
funciona. Es un caso en el que seria interesante disponer de mas información que el nombre del modelo. Nos gustaría tener también otras características interesantes como:

Modelo Nombre

npd Numero de pines digitales

npa Numero de pines analogicos

volt Tension de funcionamiento

Es decir, necesitamos de nir un conjunto de variables que representen una estructura conceptual mas compleja que una simple variable, y con la que podamos aumentar el nivel de
abstracción en el que de nimos nuestro programa. Y mira por donde, para eso es exactamente, para lo que C de ne la instrucción struct.

struct Arduino
{ string modelo ; // Nombre del modelo
int npd ; // Numero de pines digitales
int npa ; // Numero de pines analogicos
float volt ; // Tension de funcionamiento
} ;

La instrucción anterior declara una variable de tipo struct llamada Arduino, que esta compuesta por 4 variables de diferentes tipos que podemos usar como un conjunto único, del
mismo modo que usamos cualquier otro tipo de variable, solo que este tipo es compuesto. Elegante ¿No?

 
 Fijaros que la declaración acaba con un “;” al final de las llaves. Es una declaración y por tanto es imprescindible. Olvidar el ; es un error
fulminate del compilador. 

Las instrucciones anteriores han declarado una tipo llamado Arduino, pero no hemos de nido ninguna variable de este tipo aun. Para hacerlo:

Arduino UNO_R3;

Es decir, creamos una variable de tipo Arduino llamada UNO_R3.

 
 Esto es importante y ocurre lo mismo con las variables. Una cosa es declarar una variable ( Como int i ) y otra cosa distinta definirla ( i = 0) y lo
mismo ocurre con las struct. 

La primera parte declara como será el tipo Arduino pero aun no existe ninguna variable de ese tipo ( O sea, el compilador no asigna memoria) y la segunda instrucción crea una
variable tipo Arduino llamada UNO_R3 (Ahora si que el compilador se pone las pilas y asigna el espacio necesario para representar UNO_R3).

A cada una de las variables internas se les llama variables miembros de la estructura, o miembros para los amigos y al igual que con variables podemos de nir y asignar directamente
los valores internos de una struct, casi como cualquier otra variable

ACCEDIENDO A LOS MIEMBROS DE UNA ESTRUCTURAS

Podemos asignar valores a la estructura como si fueran variables normales, mediante el operador ‘.’

Arduino UNO_R3 ;
UNO_R3.modelo = "uno" ;
UNO_R3.npd = 13 ;
UNO_R3.npa = 5 ;
UNO_R3.volt = 5.0F ;

Y podemos leer sus valores de la misma manera

int numpd = UNO_R3.npd ;


float voltage = UNO_R3.volt ;

Veamos un pequeño programa completo con todo esto:


struct Arduino
{ String modelo ; // Nombre del modelo
int npd ; // Numero de pines digitales
int npa ; // Numero de pines analogicos
float volt ; //Tension de funcionamiento
} ;

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

void loop()
{ Arduino UNO_R3 ;
UNO_R3.modelo = "uno" ;
UNO_R3.npd = 13 ;
UNO_R3.npa = 5 ;
UNO_R3.volt = 5.0F ;

Serial.println(UNO_R3.npd) ;
Serial.println(UNO_R3.modelo ) ;
Serial.flush() ; exit(0) ;
}

Deberíais ver algo así:

(https://www.prometec.net/wp-content/uploads/2015/08/Imagen1.png)
Y si, se parece mucho a la forma en como accedemos a las clases de C++ (Que casualidad). A riesgo de ponerme pesado, recordad que no podéis hacer esto:

Arduino.npd = 13 ;

Porque Arduino es un tipo como int y no una instancia que contiene los valores. Esta es UNO_R3. También podemos hacer algo asi:

DUERMILANOVA = UNO_R3 ; // Asignamos los valores de una a la otra

Veamos un ejemplo:
struct Arduino
{ String modelo ; // Nombre del modelo
int npd ; // Numero de pines digitales
int npa ; // Numero de pines analogicos
float volt ; //Tension de funcionamiento
} ;

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

void loop()
{ Arduino UNO_R3 ;
Arduino DUERMILANOVA ;
UNO_R3.modelo = "uno" ;
UNO_R3.npd = 13 ;
UNO_R3.npa = 5 ;
UNO_R3.volt = 5.0F ;

Serial.println(UNO_R3.npd) ;
Serial.println(UNO_R3.modelo ) ;
DUERMILANOVA = UNO_R3 ;

DUERMILANOVA.modelo = "duermilanova" ;
Serial.println(DUERMILANOVA.npd) ;
Serial.println(DUERMILANOVA.modelo ) ;
Serial.flush() ; exit(0) ;
}

El resultado sería algo así:

(https://www.prometec.net/wp-content/uploads/2015/08/Imagen2.png)Podemos asignar una struct a otra mediante el operador asignación, pero mucho cuidado porque no podemos
hacer esto:

if ( UNO_R3 == DUERMILANOVA )

Porque nos levantará un ladrido fulminante del compilador. El operador = esta de nido para el tipo struct, pero no el operador == . Y tampoco nos permite usar el operador + , por
el mismo motivo :

DUE = UNO_R3 + DUERMILANOVA ; // Esto es un error instantaneo

Mas adelante veremos que esto puede cambiarse rede niendo el operador mediante la propiedad de operator overloading.

ESTRUCTURAS DENTRO DE ESTRUCTURAS

Como las cosas no son nunca sencillas ( y además, nos gusta enmarañar),  los problemas tienden a complicarse con rapidez,  y a veces nos puede interesar de nir una struct cuyos
miembros sean parcial o totalmente otras estructuras.

Imaginate que queremos hacer el proyecto del blinking LED y que queremos por cualquier razón estúpida, de nirlo mediante estructuras. Podríamos hacer algo como esto:
struct Arduino
{ String modelo ; // Nombre del modelo
int npd ; // Numero de pines digitales
int npa ; // Numero de pines analogicos
float volt ; //Tension de funcionamiento
} ;

struct Resistencia
{ long R ; // Valor en ohmios de la resitencia
int W ; // Valor de la potencia aceptable en watios
} ;

struct LED
{ String color ; // Color de la luz
int caida ; // Caida tipica de tension en milivoltios
} ;

Y una vez de nidas las struct que corresponden a los componentes, podemos de nir el proyecto asi:

struct Proyecto
{ Arduino Ard ;
Resistencia Res ;
LED led ;
};

La idea es que los miembros de una struct pueden a su vez ser también otras struct , y para acceder a los miembros:

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

void loop()
{ Proyecto Pro1 ;
Pro1.Ard.modelo = "UNO_R3" ;
Pro1.Res.R = 330 ;
Pro1.led.color="Rojo" ;
Serial.println( Pro1.Ard.modelo) ;
Serial.println( Pro1.Res.R ) ;
Serial.println(Pro1.led.color) ;
Serial.flush() ; exit (0) ;
}

El resultado seria, naturalmente, este :

(https://www.prometec.net/wp-content/uploads/2015/08/Imagen3.png)
C++ acepta tranquilamente esta especie de recursión de declaraciones y en principio no tiene un limite claro, de hasta cuantos niveles se puede hacer esto, porque seguro de que
nos vamos a perder nosotros mucho antes antes de eso.

ALGUNOS COMENTARIOS FINALES

Las estructuras de C son un elemento muy utilizado en la época de antes de la OOP y las clases, porque de algún modo nos permitía programar con mayor nivel de abstracción y las
encontrareis muy a menudo en programas y librerías.
Cuando se impone C++ , de algun modo las struct han sido sustituidas por las clases (Aunque siguen siendo muy útiles en mas de una ocasión) y su uso se ha reducido en bene cio
de la OOP que nos ofrece herramientas mas potentes para realizar la misma función, pero sigue siendo necesario que las conozcáis, porque os irán apareciendo en muchos
programas que veáis en Internet.

Conviene decir que la sintaxis que he usado aquí ha sido la de C++, que simpli ca un poco la de nición de las struct y que no son necesariamente iguales en C.

También tengo que reconocer que no me he extendido demasiado en las struct, porque no quiero desviaros de la OOP que comenzaremos en las sesiones próximas. Pero de algun
modo, la sintaxis y los conceptos de la OOP se apoyan en la de nición de las struct y por eso no he querido pasarlas por alto, porque iremos viendo que comparten conceptos,
aunque el método de programar sea muy distinto.

Así que animo, que pronto nos meteremos con la programación orientada a objetos o OOP.

RESUMEN DE LA SESIÓN

   Hemos presentado las struct de C++.

 Hemos visto como operar con ellas, su sintaxis y como acceder a sus mienmbros.

 Presentamos algún pequeño ejemplo de uso.

 
 

 
Anterior Siguiente
(https://www.prometec.net/tcpip/)
 
(https://www.facebook.com/prometecnet-
1541207239447373/timeline/)  

(12) COMMENTS

Diego 16 Oct 2017


Hola Ivá, Máquina.
Una duda con esto de las estructuras. Con el n de guardar una estructura como la que has puesto en el ejemplo en la EPROM, ¿Hay alguna manera de saber la
Reply de dicha estructura?. Es para asignar una longitud ja a la hora de leer los datos grabados.
longitud
(Https://Www.Prometec.Net/Struct/?
Muchas gracias.
Replytocom=24290#Respond)

Admin 19 Oct 2017


Hola Diego, deberia servirte la funcion sizeof()

Reply
(Https://Www.Prometec.Net/Struct/?
Replytocom=24346#Respond)

Diego 23 Oct 2017


Perfecto, Iván. Muchas gracias

Reply
(Https://Www.Prometec.Net/Struct/?
Replytocom=24418#Respond)

Diego 23 Oct 2017


Por cierto, me ocurre una cosa curiosa con esa funcion y es que, le ponga lo que le ponga dentro, siempre da una longitud de
6 bytes, lo cual no es muy logico ¿no?. ¿Como es posible?
Reply
Saludos.
(Https://Www.Prometec.Net/Struct/?
Replytocom=24419#Respond)
Ivan Uriarte 24 Oct 2017
Pues no, no debería. O no pensaba yo que sería así… A ver si saco tiempo y lo pruebo.

oscar (https://www.prometec.net/struct/) 23 Jun 2017


Como pasar una estructura como paramentro de entrada a una funcion?

Reply
(Https://Www.Prometec.Net/Struct/?
Replytocom=22454#Respond)

Ivan Uriarte 27 Jun 2017


Creo que tienes que pasarlos por referencia en vez de por valor.

Reply
(Https://Www.Prometec.Net/Struct/?
Replytocom=22550#Respond)

Javier (https://www.prometec.net/struct) 26 Abr 2017


Tratando de utilizar las struct he visto, si no me equivoco que tanto la declaración de la variable (UNO_R3 en el ejemplo) como la asignación de valores hay que
hacerlas en la misma función (void loop(), e este caso), porque si no al compilar no reconoce la variable. Supongo que es porque es privada. ¿Se puede hacer que sea
Reply
pública?
(Https://Www.Prometec.Net/Struct/?
Replytocom=21061#Respond)

Ivan 26 Abr 2017


Hola Javier, lo de declarar variables tiene su complejidad (aunque en principio no lo parezca). Échale un ojo a esta sesión a ver si te sirve para aclararte
un poco las dudas https://www.prometec.net/ambito-variables/ (https://www.prometec.net/ambito-variables/)
Reply
Un saludo.
(Https://Www.Prometec.Net/Struct/?
Replytocom=21077#Respond)

Santi 22 Dic 2016


¿Se puede crear una variable repetida en dos structs diferentes? Algo como lo siguiente:

Struct humedad {
Reply
byte valor = 0;
(Https://Www.Prometec.Net/Struct/?
byte valor2 = 0;
Replytocom=16695#Respond)
}
Struct temperatura {
byte valor = 0;
byte celsius = 0;
byte farenheit = 0;
}

Admin 23 Dic 2016


Desde luego que si Santi. Ten en cuenta que el nombre completo de la variable es temperatura.valor o humedar.valor, por lo que no hay error posible

Reply
(Https://Www.Prometec.Net/Struct/?
Replytocom=16749#Respond)

Alejandro A. C. (https://www.prometec.net/struct/) 30 Ago 2016


Muy buen post, excelentemente explicado!, un lujo aprender así.

muchas gracias
Reply
(Https://Www.Prometec.Net/Struct/?
Replytocom=12906#Respond)

GIVE A REPLY
Message

Name (required) Email (required)

URL

Post comment
WordPress Anti-Spam by WP-SpamShield (https://wordpress.org/extend/plugins/wp-spamshield/)

Copyright Prometec (https://www.prometec.net) (https (https (https

También podría gustarte