Cuando comenzamos a programar en Arduino, es fácil caer en malos hábitos que complican nuestros proyectos a largo plazo. La instalación de librerías, la organización del código y el uso de nombres adecuados son factores clave para que nuestros proyectos sean fáciles de mantener y escalar. En este artículo, te mostraré las mejores prácticas para estructurar tu código en Arduino, organizar tus librerías y escribir funciones que realmente faciliten tu trabajo. Al final, encontrarás un video donde explico en detalle cada uno de estos puntos con ejemplos prácticos.
1. Instalación y gestión de librerías en Arduino
Uno de los errores más comunes al trabajar con Arduino es confiar en las librerías preinstaladas en el IDE. Si bien estas librerías facilitan el desarrollo inicial, cuando decides compartir o trasladar tu proyecto a otro equipo, puede surgir un problema: la versión de la librería en el nuevo entorno podría ser diferente, generando errores inesperados.
Problema: Si tu proyecto depende de una versión específica de una librería y esta se actualiza o no está disponible en el equipo donde lo ejecutes, es muy probable que el código deje de funcionar correctamente.
Solución: La mejor práctica es incluir las librerías directamente en el proyecto, utilizando rutas relativas. De esta forma, te aseguras de que el proyecto siempre funcione de la misma manera, independientemente del equipo o versión de Arduino.
Si tienes una librería (para ejemplos prácticos llamémosla MiLibreria.h
), puedes incluirla directamente en tu proyecto de Arduino de la siguiente manera:
#include "MiLibreria.h"
¿Por qué usar comillas en lugar de los signos < >
?
Cuando usas las comillas (""
), el compilador buscará la librería dentro de la carpeta de tu proyecto, lo que significa que la librería estará vinculada directamente al código. Esto es útil cuando compartes el proyecto o lo ejecutas en diferentes equipos, ya que no dependerá de que la librería esté instalada globalmente en el entorno de Arduino.
Por otro lado, si usas los signos < >
así:
#include <MiLibreria.h>
El compilador buscará la librería en las carpetas globales del entorno de Arduino. Esto puede causar problemas si el proyecto se ejecuta en un entorno donde la librería no está instalada o si hay conflictos entre versiones.
Ejemplo práctico (usando cualquier librería):
Si tienes una librería personalizada para controlar un sensor o un módulo específico, puedes agregarla directamente en tu proyecto colocando los archivos .h
y .cpp
en una carpeta llamada libraries
dentro de tu proyecto:
CopiarEditar/TuProyecto
├── TuProyecto.ino
├── libraries
│ └── MiLibreria.h
│ └── MiLibreria.cpp
Luego, simplemente inclúyela en el código con:
#include "MiLibreria.h"
De esta forma, te aseguras de que el código siempre encuentre la librería, incluso si la instalas en otro equipo o compartes el proyecto con otra persona.
2. Organización del código mediante clases y funciones en Arduino
Aunque muchos proyectos de Arduino son simples — como leer datos de sensores o enviar señales por WiFi — cuando el proyecto empieza a crecer, el código puede volverse difícil de manejar. Variables por todos lados, funciones dispersas y un código difícil de entender son problemas comunes cuando el proyecto escala.
¿Cuál es la solución?
El uso de clases en programación orientada a objetos (POO) es una forma efectiva de mantener el código limpio y organizado. Una clase permite agrupar funciones y atributos relacionados en una estructura ordenada y reutilizable. Esto facilita mucho el mantenimiento y la escalabilidad del proyecto.
Ejemplo práctico:
Supongamos que necesitas formatear datos en texto para mostrarlos en el puerto serial. En lugar de crear una función independiente (que luego podría perderse entre otras líneas de código), puedes agrupar todas las funciones de formateo dentro de una clase.
Finalidad:
- Mantener el código ordenado.
- Evitar duplicación de funciones.
- Facilitar el mantenimiento y la depuración.
- Reutilizar fácilmente el código en otros proyectos.
¿Cómo funciona el uso de clases en la práctica?
- Definir una clase que contenga los atributos y funciones necesarias para la tarea.
- Implementar la lógica de las funciones en la clase.
- Instanciar un objeto de la clase en el código principal y llamar a las funciones desde ese objeto.
Por ejemplo, podrías crear una clase CFormatString
que se encargue de formatear cadenas de texto de manera específica.
📌 En el video explico paso a paso cómo crear una clase en Arduino, cómo definir atributos privados y funciones públicas, y cómo llamarlas desde el código principal. Si quieres ver el proceso completo y entender mejor el flujo, mira el video aquí:
➡️ Usar clases no solo organiza mejor tu código, sino que también facilita futuras modificaciones y escalabilidad del proyecto.
3.Nombres de funciones y variables: La clave para un código limpio
Cuando estás programando en Arduino (o en cualquier lenguaje), el nombre que le das a tus funciones y variables puede marcar la diferencia entre un código fácil de entender o una maraña de líneas incomprensibles. El problema es que muchos programadores — incluso con experiencia — caen en la trampa de usar nombres genéricos o poco claros. Si has escrito alguna vez algo como funcion1
, x
o var2
, sabes lo frustrante que puede ser volver a ese código semanas después y no entender qué hacía cada cosa.
¿Cuál es el propósito?
El objetivo de usar nombres claros y descriptivos es que el código sea fácil de leer y entender, tanto para ti como para cualquier otra persona que lo revise en el futuro. Un nombre bien pensado explica por sí solo qué hace la función o la variable, sin necesidad de comentarios adicionales.
¿Cómo lograrlo?
- Usa nombres que describan claramente la acción que realiza la función (por ejemplo,
getTemperature
en lugar defuncion1
). - Para las variables, elige nombres que expliquen qué valor almacenan (
currentSpeed
en lugar dex
). - Usa el formato camelCase para facilitar la lectura (
miVariable
,getValue
). - Mantén los nombres cortos pero descriptivos; no necesitas una frase entera para definir una función.
Ejemplo práctico:
Supongamos que tienes una función para obtener la hora en formato de texto. Un nombre confuso sería algo como:
String funcion1ParaObtenerHoraEnFormatoFecha() {
// Código...
}
Este nombre es largo, difícil de recordar y poco claro. En cambio, un nombre como getFormattedDate()
es más directo y explica claramente qué hace la función:
String getFormattedDate() {
// Código...
}
Este simple cambio hace que el código sea más fácil de leer y depurar. Si en el futuro necesitas modificar la función o buscar un error, entenderás rápidamente qué está haciendo solo con leer el nombre.
4. Evita errores comunes al programar en Arduino
Si estás comenzando a programar en Arduino, es normal cometer errores básicos que pueden afectar el rendimiento de tu código. Aquí tienes algunos errores comunes y cómo solucionarlos:
✅ Evita usar delay()
para controlar el tiempo de ejecución → Usa millis()
para no bloquear el código.
✅ No dupliques código → Si una función se repite en varias partes del código, conviértela en una función independiente o colócala en una clase.
✅ Usa constantes y define valores en la parte superior del código para facilitar su modificación futura.
📌 Hay muchos cursos online de C++ pero no te enseñan esto. Utiliza estos tips que te ayudaran