domingo, 15 de febrero de 2015

Creando librerías en Arduino #1: Introducción y cabeceras

¿Qué es una librería? No, no es ese lugar en donde se venden libros, nos referimos a otra cosa. Una librería o biblioteca, en cuanto a informática se refiere, es un conjunto de implementaciones (según wikipedia; a decir verdad, no termino de encontrar las palabras para explicarlo por mi mismo), que están hechas para ser usadas por otros. Las librerías están hechas para ser usadas por otros programas, no son autónomas.

Por ejemplo, yo puedo crear una librería para controlar determinado sensor (Si hablamos específicamente del Arduino), o una para, por ejemplo, consultar el clima, etc...
Eso sí, debe haber un programa, que interaccione con la librería y muestre los datos.

En este pequeño tutorial, aprenderemos a crearlas y utilizarlas...

Ahora bien, las bases de una librería orientada a objetos en Arduino (y en C++ inclusive), son tres.
  • Cabecera (header)
  • Código (la clase en sí)
  • Keywords (palabras clave)
(Si no tienes ni idea sobre qué es el paradigma de orientación a objetos, se podría resumir en ésto: Uno tiene objetos, que simulan el mundo real, por ejemplo. Los objetos tienen métodos y propiedades. Imagina un objeto Coche, un método (función), sería por ejemplo conducir, y una propiedad (variable), podría ser la patente. Además, un objeto puede heredar todo eso de otro. Puedo crear una variante específica del objeto Coche, para adaptarlo a lo necesario. Una Clase, es el modelo de un objeto, su definición. Una instancia, es el modelo ya funcional, con el que puedo interactuar. Si no te quedó claro, puedes googlearlo :P)

La cabecera, es el archivo que se encarga de definir la estructura de la clase. Le dice al compilador qué métodos y propiedades tiene, etc...
El código, la clase en sí misma, es eso, métodos, propiedades, etc...
Recuerda: la definición en la cabecera debe ser exactamente igual a la estructura de la clase, sino el compilador lanzará error. 

Keywords, las palabras clave que le dicen a la IDE, qué resaltar con color (So cute, eh? ^^)

En esta entrada nos vamos a centrar en la cabecera.

Creamos una carpeta para nuestra librería, y añadimos un archivo con el mismo nombre, con extensión .h. Si nuestra librería se llama chat, tenemos que crear chat.h.

Comencemos entonces, ésta, es la estructura básica de una cabecera:

#ifndef LED_H
    #define LED_H
    #include <Arduino.h>

    class Led
    {
        private:
            int Pin;
        public:
            Led(int P);

            void Encender();
            void Apagar();
    };

#endif

Las dos primeras líneas son llamadas cláusula de inclusión, evitan que incluyamos la misma cabecera dos veces. En PHP sería require_once en lugar de simplemente require.
Dicen, si no está definida la cabecera LED_H, ejecutar todo el código hasta #endif.
La segunda línea, se encarga de definir la constante LED_H, la cual indica que la cabecera ya se ha incluido. 
La tercera, incluye todo eso que nosotros usamos normalmente, las funciones, digitalWrite, analogRead. Sí, por si no lo notaste, todo eso también está contenido en una librería :P

En la quinta línea se define la clase Led.
En la séptima, definimos propiedades y métodos privados.
¿Qué significa esto? Si algo se define como privado, solo será accesible desde la misma clase, si es público, el programa podrá también acceder a ésta.
La propiedad Pin, es decir, el pin en donde está conectado el led, será privado, puesto que, ¿es necesario que el programa lo sepa, siendo el mismo programa quien lo define?...

:O ¿Cómo lo hace? Acá entran en juego los constructores...

Dentro de public, tenemos el método Led, con un parámetro llamado P, de tipo int (entero).
¿Notaron que aquel método tiene el mismo nombre que la clase? Ahap, eso es un constructor. Cuando nosotros instanciamos la clase, si hay un constructor presente, debemos pasarle los parámetros correspondientes, en este caso, el número de pin (el parámetro P). En el constructor, nosotros podemos tomar aquel número, y ponerlo en una propiedad de la clase, para usar esos datos luego, por ejemplo, en Pin.

Luego, tenemos el método Encender, que como pueden ver, no lleva parámetros. ¿Por qué? Si podríamos pasarle el número de pin... No, ese método actúa sobre el objeto Led, es decir, vamos a utilizar la propiedad Pin, para saber qué encender. Pero... ¿Qué es ese void ahí? Es el tipo de dato. Una función puede retornar (o no), algún dato. Una función que sume dos números, debe devolver un dato entero (int), por ejemplo. Si no queremos retornar ningún dato, será void.
El método Encender, no debería devolvernos nada, ¿no?.

Lo mismo para el método Apagar.

En las líneas siguientes se cierra la clase, y en la última, se cierra la cláusula de inclusión. ¿Recuerdan eso de "ejecutar todo el código hasta #endif."? Bueno, a eso se refiere.

Si LED_H no está definido, definirlo y crear la clase. 

Eso es todo! Esa es la estructura básica de la header de una clase. En la próxima entrada veremos la clase como tal...

Saludos!
-fermino-

No hay comentarios.:

Publicar un comentario