Curso C para Arduino
🔹 Tipos de memoria en Arduino
Arduino (por ejemplo, la placa UNO) tiene tres tipos principales de memoria:
| Tipo | Función | Tamaño en UNO |
|---|---|---|
| Flash | Almacena el programa (código) | 32 KB |
| SRAM | Memoria RAM (datos durante la ejecución) | 2 KB |
| EEPROM | Memoria no volátil (almacenamiento permanente de datos) | 1 KB |
🔹 Variables y memoria
Variables globales y locales
- Globales: ocupan espacio en la SRAM durante toda la ejecución.
- Locales: ocupan memoria solo mientras se ejecuta la función.
Ejemplo:
1int global = 100; // ocupa SRAM todo el tiempo 2 3void loop() { 4 int local = 10; // solo vive mientras se ejecuta loop() 5}
💡 Recomendación: usa variables locales siempre que sea posible para ahorrar SRAM.
🔹 Cadenas de texto (String vs char[])
Usar la clase String puede generar fragmentación de memoria en Arduino, lo cual reduce la estabilidad del sistema.
Alternativa eficiente: usar arreglos de char
1char mensaje[] = "Hola, mundo!"; 2 3void setup() { 4 Serial.begin(9600); 5 Serial.println(mensaje); 6}
⚠️ Consejo: Evita String si tu proyecto es grande o maneja muchas cadenas dinámicas.
🔹 Uso de F() para ahorrar SRAM
Puedes almacenar cadenas directamente en la memoria Flash usando la macro F():
1Serial.println(F("Este texto está en memoria Flash"));
Esto evita que la cadena se copie a SRAM, lo cual es ideal para textos largos o mensajes de depuración.
🔹 Leer y escribir en EEPROM
La EEPROM permite guardar datos que se conservan después de apagar la placa.
1#include <EEPROM.h> 2 3void setup() { 4 EEPROM.write(0, 42); // Guardar valor 42 en dirección 0 5 int valor = EEPROM.read(0); // Leer desde dirección 0 6 Serial.begin(9600); 7 Serial.print("Valor EEPROM: "); 8 Serial.println(valor); 9}
⚠️ Importante: La EEPROM tiene un número limitado de escrituras (~100.000), así que no la uses para datos que cambian constantemente.
🔹 Técnicas de optimización
1. Usa el tipo de dato más pequeño posible:
byteen lugar deintsi solo necesitas valores entre 0 y 255.boolpara variables lógicas.
1byte contador = 0; 2bool activo = true;
2. Reutiliza variables
- Evita declarar múltiples variables para lo mismo dentro de
loop().
3. Reduce uso de delay()
- Prefiere
millis()para evitar bloqueos innecesarios y aprovechar mejor el tiempo de ejecución.
4. Elimina Serial.print() en producción
- El envío constante de mensajes ocupa memoria y ralentiza el programa.