Curso C para Arduino

🔹 Tipos de memoria en Arduino

Arduino (por ejemplo, la placa UNO) tiene tres tipos principales de memoria:

TipoFunciónTamaño en UNO
FlashAlmacena el programa (código)32 KB
SRAMMemoria RAM (datos durante la ejecución)2 KB
EEPROMMemoria 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:

  • byte en lugar de int si solo necesitas valores entre 0 y 255.
  • bool para 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.