27/01/2022
Si eres un entusiasta de Arduino, es probable que ya hayas experimentado la frustración de repetir bloques de código o de manejar la complejidad de múltiples componentes en un solo sketch. Las librerías son la solución elegante a estos desafíos, ofreciéndote una forma estructurada y eficiente de organizar tu código. No solo simplifican la programación, sino que también abren un mundo de posibilidades al permitirte reutilizar funciones complejas con solo unas pocas líneas. En este artículo, exploraremos a fondo qué son las librerías de Arduino, cuáles son las estándar que ya tienes a tu disposición y, lo más emocionante, te guiaremos paso a paso para que puedas crear tus propias librerías y llevar tus proyectos a un nuevo nivel de profesionalismo y eficiencia.

- ¿Qué son las Librerías de Arduino y Por Qué Son Esenciales?
- Librerías Estándar del Arduino IDE
- Anatomía de una Librería Arduino: Componentes Clave
- Paso a Paso: Creando Tu Primera Librería Arduino
- Ejemplos Prácticos Adicionales de Creación de Librerías
- Mejores Prácticas y Guía de Estilo para Librerías Arduino
- Consideraciones de Compatibilidad y Modificación de Librerías
- Preguntas Frecuentes (FAQ)
- ¿Dónde se encuentra la biblioteca de Arduino en mi ordenador?
- ¿Por qué debería crear mis propias librerías en lugar de escribir todo en el sketch?
- ¿Qué es un "include guard" y por qué es importante en los archivos .h?
- ¿Cuál es la diferencia entre #include "MiLibreria.h" y #include <MiLibreria.h>?
- ¿Puedo tener múltiples instancias de una librería en un mismo sketch?
¿Qué son las Librerías de Arduino y Por Qué Son Esenciales?
Una librería en el contexto de Arduino es un conjunto de código preescrito y organizado, diseñado para simplificar la interacción con hardware específico (como sensores, pantallas o módulos de comunicación) o para encapsular funcionalidades complejas y repetitivas. Imagina que cada vez que quisieras encender un LED, tuvieras que escribir la misma secuencia de comandos para configurar el pin y alternar su estado. Las librerías eliminan esta redundancia, permitiéndote llamar a funciones específicas con nombres intuitivos, como miLED.encender() o sensorDHT.leerTemperatura().
Su propósito principal es la abstracción y la reutilización. Al encapsular la lógica compleja, las librerías hacen que tu código principal (el sketch) sea mucho más limpio, legible y fácil de mantener. Esto es crucial no solo para proyectos grandes, sino también para tu propio aprendizaje, ya que te permite enfocarte en la lógica de alto nivel de tu aplicación sin ahogarte en los detalles de bajo nivel de cada componente.
Librerías Estándar del Arduino IDE
El IDE de Arduino viene preinstalado con una serie de librerías esenciales que cubren funcionalidades básicas y comunes. Estas son algunas de las más utilizadas y su propósito:
- EEPROM: Permite leer y escribir datos en la memoria EEPROM no volátil del microcontrolador, útil para almacenar configuraciones que persisten incluso después de un reinicio.
- Ethernet: Facilita la conexión de tu Arduino a una red local o a Internet utilizando un módulo Ethernet Shield.
- LiquidCrystal: Controla pantallas de cristal líquido (LCD) basadas en el controlador Hitachi HD44780, permitiendo mostrar texto y caracteres personalizados.
- SD: Permite la lectura y escritura de datos en tarjetas SD, ideal para almacenar grandes volúmenes de información (logs, imágenes, etc.).
- Servo: Simplifica el control de servomotores, permitiendo establecer su posición angular con facilidad.
- SPI: Proporciona funciones para la comunicación mediante el protocolo Serial Peripheral Interface (SPI), comúnmente usado con módulos como tarjetas SD, pantallas OLED o sensores.
- SoftwareSerial: Permite crear puertos serie adicionales utilizando pines digitales, útil cuando el puerto serie hardware ya está en uso o necesitas más de uno.
- Stepper: Facilita el control de motores paso a paso, permitiendo movimientos precisos y controlados.
- Wire: Implementa la comunicación I2C (Inter-Integrated Circuit), también conocida como Two-Wire Interface (TWI), fundamental para interactuar con una amplia variedad de sensores y dispositivos.
Además de estas, existen miles de librerías creadas por la comunidad y fabricantes de hardware, disponibles para descargar e integrar en tu IDE, cubriendo prácticamente cualquier sensor, módulo o funcionalidad que puedas imaginar.
Anatomía de una Librería Arduino: Componentes Clave
Para que una librería funcione correctamente en el entorno de Arduino, debe estar compuesta por una serie de archivos específicos, organizados dentro de una carpeta con el nombre de la librería. La estructura típica incluye:
MiLibreria/ ├── MiLibreria.h ├── MiLibreria.cpp ├── keywords.txt ├── README.txt (opcional) └── examples/ (opcional) ├── Ejemplo1.ino └── Ejemplo2.ino
Veamos en detalle cada uno de estos componentes:
- Archivo de Cabecera (.h): Es el "plano" o la interfaz pública de tu librería. Contiene las declaraciones de las clases, funciones, variables y constantes que estarán disponibles para el usuario. Es donde se define lo que la librería “ofrece”.
- Archivo de Código Fuente (.cpp): Este es el "corazón" de la librería. Contiene la implementación real de las funciones y métodos declarados en el archivo .h. Aquí es donde se escribe la lógica que hace que la librería funcione.
- Archivo keywords.txt: Este archivo es opcional pero altamente recomendado. Permite al IDE de Arduino resaltar con colores específicos las palabras clave (nombres de clases, funciones, etc.) de tu librería en el editor de código. Esto mejora la legibilidad y facilita la depuración.
- Archivo README.txt (Opcional): Un archivo de texto que proporciona información adicional sobre la librería, como su propósito, número de revisión, instrucciones de uso, notas importantes, etc.
- Carpeta examples/ (Opcional pero muy útil): Contiene uno o más sketches de ejemplo (.ino) que demuestran cómo usar la librería. Estos ejemplos son accesibles directamente desde el menú "Archivo > Ejemplos" del IDE, facilitando enormemente su aprendizaje y uso.
Todos estos archivos deben colocarse dentro de una única carpeta con el nombre de tu librería (ej. BlinkLed o Morse), la cual a su vez debe residir en el directorio de librerías de Arduino en tu ordenador. Por defecto, esta ubicación suele ser C:\Program Files\Arduino\libraries en Windows o similar en otros sistemas operativos.
Paso a Paso: Creando Tu Primera Librería Arduino
Ahora, pongamos manos a la obra y creemos una librería sencilla para encender y apagar un LED, similar al ejemplo "BlinkLed" mencionado. Necesitarás un editor de texto plano (como Notepad++ o incluso el Bloc de Notas) y, por supuesto, el IDE de Arduino.
1. Preparando el Entorno
Lo primero es crear la estructura de carpetas. Navega hasta el directorio de librerías de Arduino en tu sistema. Si no lo has cambiado, estará en C:\Program Files\Arduino\libraries (o la ruta correspondiente en tu SO). Dentro de esta carpeta, crea una nueva carpeta para tu librería. Para este ejemplo, la llamaremos BlinkLed.

Dentro de la carpeta BlinkLed, crea tres nuevos documentos de texto vacíos y renómbralos con las siguientes extensiones:
BlinkLed.h(Archivo de cabecera)BlinkLed.cpp(Archivo de código fuente)keywords.txt(Archivo de palabras clave)
2. Creando el Archivo de Cabecera (BlinkLed.h)
El archivo de cabecera define la clase de tu librería y sus miembros (funciones y variables). Abre BlinkLed.h con tu editor de texto y pega el siguiente código:
/* * BlinkLed.h - Librería para controlar el parpadeo de un LED. * Creada para demostrar la creación de librerías en Arduino. */ // El 'include guard' previene múltiples inclusiones del archivo de cabecera. #ifndef BlinkLed_h #define BlinkLed_h // Incluye la cabecera estándar de Arduino para acceso a tipos y constantes. #include "Arduino.h" // Definición de la clase BlinkLed class BlinkLed { public: // Constructor de la clase. Se llama al crear una instancia. BlinkLed(int pin); // Métodos públicos disponibles para el usuario de la librería. void parpadear(int tiempoPausa, int repeticiones); void encender(); void apagar(); private: // Variable privada para almacenar el pin del LED. int _pinLed; }; // Cierre del 'include guard' #endif Explicación de BlinkLed.h:
#ifndef BlinkLed_hy#define BlinkLed_h: Son directivas de preprocesador que forman un "include guard". Aseguran que el contenido de este archivo solo se incluya una vez durante la compilación, evitando errores de redefinición.#include "Arduino.h": Necesario para que la librería tenga acceso a las funciones y tipos de datos estándar de Arduino (comodigitalWrite,pinMode,int,HIGH,LOW, etc.).class BlinkLed { ... };: Define la clase de tu librería. Una clase es un molde para crear objetos.public:: Las funciones y variables declaradas aquí son accesibles desde tu sketch principal.BlinkLed(int pin);: Este es el constructor. Siempre tiene el mismo nombre que la clase y se llama automáticamente cuando creas un objeto de esta clase (ej.BlinkLed miLED(13);). Se usa para inicializar la instancia.void parpadear(int tiempoPausa, int repeticiones);,void encender();,void apagar();: Son los métodos (funciones) que la librería ofrecerá al usuario.private:: Las variables y funciones declaradas aquí solo son accesibles desde dentro de la propia clase. Se usa para ocultar detalles de implementación.int _pinLed;: Una variable privada que almacenará el número del pin al que está conectado el LED. El prefijo_es una convención para indicar que es una variable privada.
3. Creando el Archivo de Código Fuente (BlinkLed.cpp)
Aquí es donde se implementa la lógica de los métodos declarados en el archivo .h. Abre BlinkLed.cpp y pega el siguiente código:
/* * BlinkLed.cpp - Implementación de la librería para controlar el parpadeo de un LED. */ #include "Arduino.h" // Necesario para funciones de Arduino #include "BlinkLed.h" // Incluye la cabecera de nuestra propia librería // Implementación del constructor BlinkLed::BlinkLed(int pin) { _pinLed = pin; // Guarda el pin proporcionado por el usuario pinMode(_pinLed, OUTPUT); // Configura el pin como salida } // Implementación del método parpadear void BlinkLed::parpadear(int tiempoPausa, int repeticiones) { for (int i = 0; i < repeticiones; i++) { digitalWrite(_pinLed, HIGH); delay(tiempoPausa); digitalWrite(_pinLed, LOW); delay(tiempoPausa); } } // Implementación del método encender void BlinkLed::encender() { digitalWrite(_pinLed, HIGH); } // Implementación del método apagar void BlinkLed::apagar() { digitalWrite(_pinLed, LOW); } Explicación de BlinkLed.cpp:
#include "Arduino.h"y#include "BlinkLed.h": Incluyen las cabeceras necesarias para acceder a las funciones de Arduino y a las definiciones de nuestra propia clase.BlinkLed::BlinkLed(int pin) { ... }: Implementación del constructor. ElBlinkLed::antes del nombre de la función indica que esta función pertenece a la claseBlinkLed. Aquí se inicializa la variable privada_pinLedy se configura el pin como salida.void BlinkLed::parpadear(...) { ... },void BlinkLed::encender() { ... },void BlinkLed::apagar() { ... }: Implementaciones de los métodos. Aquí se escribe el código que realiza la acción deseada utilizando la variable_pinLedpara interactuar con el hardware.
4. Creando el Archivo de Palabras Clave (keywords.txt)
Este archivo mejora la experiencia de usuario al resaltar tu librería en el IDE. Abre keywords.txt y añade:
BlinkLed KEYWORD1 parpadear KEYWORD2 encender KEYWORD2 apagar KEYWORD2 Tipos de KEYWORD:
| Tipo | Propósito | Color en IDE (aprox.) |
|---|---|---|
| KEYWORD1 | Clases y Tipos de Datos | Naranja/Marrón |
| KEYWORD2 | Métodos y Funciones | Naranja/Marrón |
| KEYWORD3 | Funciones del Core (setup, loop, Serial) | Naranja fuerte, Negrita |
5. Integrando la Librería en el IDE de Arduino
Una vez que hayas guardado los tres archivos en la carpeta BlinkLed dentro de tu directorio libraries, cierra y vuelve a abrir el IDE de Arduino. Esto es crucial para que el IDE detecte la nueva librería. Si todo está correcto, podrás verla listada en "Sketch > Incluir Librería".
6. Escribiendo un Sketch de Ejemplo para Tu Nueva Librería
Para probar tu librería, crea un nuevo sketch en el IDE y pega el siguiente código:
#include "BlinkLed.h" // Incluye tu nueva librería BlinkLed miLED(13); // Crea una instancia de la clase BlinkLed para el pin 13 void setup() { // El pinMode ya está configurado en el constructor de la librería, // así que setup() puede estar vacío en este caso. } void loop() { miLED.parpadear(500, 10); // Parpadea el LED del pin 13, con 500ms de pausa, 10 veces. delay(3000); // Espera 3 segundos miLED.encender(); // Enciende el LED delay(2000); // Espera 2 segundos miLED.apagar(); // Apaga el LED delay(2000); // Espera 2 segundos } ¡Felicidades! Has creado y utilizado tu primera librería de Arduino. Puedes expandir este ejemplo creando una carpeta examples dentro de BlinkLed y guardando este sketch allí, para que sea fácilmente accesible desde el IDE.
Ejemplos Prácticos Adicionales de Creación de Librerías
El concepto de crear una librería se aplica a cualquier funcionalidad que desees encapsular. Aquí hay otros ejemplos mencionados que ilustran la versatilidad:
- Librería Morse: Similar a
BlinkLed, pero encapsula las funcionesdot()ydash()para enviar señales en código Morse a un LED. Permite crear un objetoMorse morse(pinLed);y luego usarmorse.dot();omorse.dash();. - Librería Semáforo: Una excelente muestra de cómo una librería puede controlar un sistema más complejo. Define una clase
Semaforoque maneja múltiples LEDs (rojo, amarillo, verde) y quizás hasta un zumbador. Puedes crear múltiples instancias, comoSemaforo miSemaforo1(2,3,4,12);ySemaforo miSemaforo2(8,9,10,12);, permitiendo controlar varios semáforos de forma independiente y coordinada.
Estos ejemplos demuestran cómo las librerías promueven la programación orientada a objetos, permitiendo crear "objetos" que representan elementos del mundo real (un LED, un semáforo, un coche) y manipularlos con métodos intuitivos.
Mejores Prácticas y Guía de Estilo para Librerías Arduino
Para que tus librerías sean útiles, fáciles de usar y mantengan la coherencia con el ecosistema Arduino, es recomendable seguir algunas pautas de estilo:
- Claridad y Abstracción: Diseña tus funciones para que sean fáciles de entender y usar. Abstrae la complejidad subyacente. Por ejemplo, una función
readPressure()que realiza todos los pasos necesarios para obtener la presión, en lugar de requerir que el usuario maneje los comandos I2C directamente. - Nomenclatura Consistente: Utiliza nombres de clases, funciones y variables claros y descriptivos. Prefiere la convención camelCase (ej.
analogRead,digitalWrite) en lugar de guiones bajos (ej.analog_read). - Documentación: Incluye comentarios claros en tus archivos
.hy.cpp, explicando el propósito de la librería, sus funciones, parámetros y cualquier detalle importante. Un archivoREADME.txty ejemplos bien documentados son invaluables. - Evitar Punteros en la Interfaz Pública: Los punteros pueden ser confusos para principiantes. En la medida de lo posible, evita exponerlos directamente en la interfaz pública de tu librería.
- Compatibilidad con Stream: Si tu librería maneja comunicación de flujo de bytes (como Serial, Ethernet, WiFi), es una buena práctica heredar de la clase
Streamde Arduino. Esto permite que tu librería sea compatible con diferentes interfaces de comunicación (ej.Serial,SoftwareSerial, puertos deEthernetClient). - Inicialización y Finalización: Proporciona métodos
begin()para inicializar la librería con parámetros de configuración yend()para liberar recursos si es necesario. - No Asumir Hardware Específico: Siempre que sea posible, escribe código agnóstico al hardware. Si tu librería requiere código de bajo nivel específico para una arquitectura (ej. ESP32 vs. AVR), considera usar directivas de preprocesador para incluir el código correcto o proporcionar adaptaciones.
Consideraciones de Compatibilidad y Modificación de Librerías
Al desarrollar o utilizar librerías, es fundamental tener en cuenta la compatibilidad con el hardware. Aunque el código de alto nivel de Arduino es muy portable, las librerías a menudo interactúan directamente con el microcontrolador a un nivel más bajo. Esto significa que una librería escrita para un Arduino Uno (basado en AVR) podría no funcionar directamente en una placa ESP32 o ESP8266 sin adaptaciones.
Sitios como arduinolibraries.info (aunque los enlaces están fuera de mi alcance, es una referencia conocida) pueden ayudarte a verificar la compatibilidad de una librería con diferentes arquitecturas.
Modificar Librerías Existentes:
Es común encontrarse con librerías que no tienen exactamente la funcionalidad que necesitas o que presentan algún error. En estos casos, puedes:
- Modificación Local: Simplemente edita los archivos
.hy.cppde la librería instalada en tu directorio local de Arduino. Ten en cuenta que estas modificaciones se perderán si actualizas la librería a través del gestor de librerías del IDE. - Fork y Pull Request (para colaboradores): Si la librería está alojada en plataformas como GitHub, la mejor práctica es "forkear" el repositorio (crear tu propia copia), realizar tus modificaciones y luego enviar un "pull request" al autor original. Esto permite que tus mejoras puedan ser integradas en la versión oficial de la librería.
Preguntas Frecuentes (FAQ)
¿Dónde se encuentra la biblioteca de Arduino en mi ordenador?
Las librerías de usuario se instalan por defecto en el directorio C:\Program Files\Arduino\libraries en Windows. En macOS, suele ser ~/Documents/Arduino/libraries y en Linux, ~/Arduino/libraries. Las librerías que vienen preinstaladas con el IDE se encuentran en el directorio de instalación del propio IDE.

¿Por qué debería crear mis propias librerías en lugar de escribir todo en el sketch?
Crear librerías promueve la modularidad, la reutilización del código y la legibilidad. Mantiene tu sketch principal más limpio y fácil de entender, especialmente en proyectos grandes. Además, si necesitas usar la misma funcionalidad en múltiples proyectos, simplemente incluyes la librería en lugar de copiar y pegar código.
¿Qué es un "include guard" y por qué es importante en los archivos .h?
Un "include guard" (como #ifndef MY_LIBRARY_H, #define MY_LIBRARY_H, #endif) es una directiva de preprocesador que asegura que el contenido de un archivo de cabecera solo se incluya una vez durante el proceso de compilación. Esto evita errores de "redefinición" si el mismo archivo de cabecera es incluido accidentalmente varias veces en diferentes partes de tu proyecto.
¿Cuál es la diferencia entre #include "MiLibreria.h" y #include <MiLibreria.h>?
Cuando usas comillas dobles ("MiLibreria.h"), el compilador busca el archivo de cabecera primero en el mismo directorio que el archivo que lo incluye, y luego en los directorios de librerías estándar. Cuando usas paréntesis angulares (<MiLibreria.h>), el compilador busca directamente en los directorios de librerías estándar y los directorios especificados en la configuración del compilador. Para tus propias librerías, es común usar comillas dobles, mientras que para las librerías estándar se usan los paréntesis angulares.
¿Puedo tener múltiples instancias de una librería en un mismo sketch?
¡Sí! Si tu librería está diseñada como una clase (que es la forma recomendada), puedes crear múltiples objetos o "instancias" de esa clase, cada una con sus propias variables y estado. Por ejemplo, podrías tener BlinkLed ledRojo(13); y BlinkLed ledAzul(12);, controlando cada LED de forma independiente con los mismos métodos.
La creación de librerías es una habilidad fundamental que te permitirá organizar, reutilizar y compartir tu código de Arduino de manera mucho más efectiva. Al dominar este concepto, no solo simplificarás tus propios proyectos, sino que también contribuirás a la vasta y colaborativa comunidad de Arduino, creando herramientas que otros podrán utilizar para innovar. ¡Empieza a construir tus propias librerías hoy y descubre el verdadero potencial de tus proyectos con Arduino!
Recuerda que la práctica es clave. Experimenta con los ejemplos dados, intenta encapsular otras funcionalidades que ya uses en tus sketches y no dudes en explorar las librerías existentes para inspirarte.
Si quieres conocer otros artículos parecidos a Domina las Librerías Arduino: Crea y Potencia Tu Código puedes visitar la categoría Librerías.
