Hola me pueden ayudar a identificar el error en el codigo Aparte de que me aparece "poca memoria disponible, se pueden producir problemas de estabili

hola me pueden ayudar a identificar el error en el codigo. Aparte de que me aparece "poca memoria disponible, se pueden producir problemas de estabilidad" se me sicla. se imprime 6 veses y solamente le he indicado una sola vez.

les comparto el codigo:

#include <Arduino.h>

const int redPin = 9;
const int greenPin = 10;
const int bluePin = 11;

float smoothness_pts = 500;
float gamma = 0.14;
float beta = 0.5;

int n = 30;

String STATIC = " debe devolver y mantener el color marcado ";
String STROBE = "el color seleccionado debe encender y apagar intermitentemente y en forma rápida";
String BREATH = " debe encender y apagar el color a un ritmo lento";

String subMenuOption1; // Input SubMenu 1 STATIC
String subMenuOption2; // Input SubMenu 2 STROBE
String subMenuOption3; // Input SubMenu 3 BREATH

bool subMenu1Flag = false;
bool subMenu2Flag = false;
bool subMenu3Flag = false;

bool runOnce = true;
bool menuState = true;

void setup() {

Serial.begin(9600);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);

}

String menu;
char letra;

void loop() {

mainMenu();
while (Serial.available() == 0)
{
}
if (menuState == true)
{ letra = Serial.read();
menu.concat(letra);

if (menu == "STATIC" || menu == "static")
{
  Serial.println("STATIC:");
  subMenu1();
}
else if (menu == "STROBE" || menu == "strobe")
{
  Serial.println("STROBE:");
  subMenu2();
}
else if (menu == "BREATH" || menu == "breath")
{
  Serial.println("BREATH:");
  subMenu3();
}
else
{
  Serial.println("Elegir una opcion\n STATIC\n STROBE\n BREATH\n");
}

}
if (menuState == false && subMenu1Flag)
{
letra = Serial.read();
subMenuOption1.concat(letra);

if (subMenuOption1 == "RED")
{
  Serial.println("Led Rojo");
  setColor(255, 0, 0);
}
else if (subMenuOption1 == "ORANGE")
{
  Serial.println("Led Naranja");
  setColor(255, 136, 0);
}
else if (subMenuOption1 == "YELLOW")
{
  Serial.println("Led Amarillo");
  setColor(255, 255, 0);
}
else if (subMenuOption1 == "GREEN")
{
  Serial.println("Led Verde");
  setColor(0, 255, 0);
}
else if (subMenuOption1 == "AQUA")
{
  Serial.println("Led Aqua");
  setColor(0, 255, 255);
}
else if (subMenuOption1 == "BLUE")
{
  Serial.println("Led azul");
  setColor(0, 0, 255);
}
else if (subMenuOption1 == "PINK")
{
  Serial.println("Led Rosado");
  setColor(255, 20, 147);
}
else if (subMenuOption1 == "WHITE")
{
  Serial.println("Led Blanco");
  setColor(255, 255, 255);
}
else if (subMenuOption1 == "OFF")
{
  Serial.println("Salir al Menu Prinicpal");
  menu = "OFF";
  runOnce = true;
  subMenu1Flag = false;
  ledOFF();
  mainMenu();
}
else
{
  Serial.println("Elegir un COLOR\n RED\n ORANGE\n YELLOW\n GREEN\n AQUA\n BLUE\n PINK\n WHITE\n OFF\n");
}

}
if (menuState == false && subMenu1Flag)
{
letra= Serial.read();
subMenuOption1.concat(letra);

if (subMenuOption1 == "RED")
{
  Serial.println("Led Rojo");
  setColor(255, 0, 0);
}
else if (subMenuOption1 == "ORANGE")
{
  Serial.println("Led Naranja");
  setColor(255, 136, 0);
}
else if (subMenuOption1 == "YELLOW")
{
  Serial.println("Led Amarillo");
  setColor(255, 255, 0);
}
else if (subMenuOption1 == "GREEN")
{
  Serial.println("Led Verde");
  setColor(0, 255, 0);
}
else if (subMenuOption1 == "AQUA")
{
  Serial.println("Led Aqua");
  setColor(0, 255, 255);
}
else if (subMenuOption1 == "BLUE")
{
  Serial.println("Led azul");
  setColor(0, 0, 255);
}
else if (subMenuOption1 == "PINK")
{
  Serial.println("Led Rosado");
  setColor(255, 20, 147);
}
else if (subMenuOption1 == "WHITE")
{
  Serial.println("Led Blanco");
  setColor(255, 255, 255);
}
else if (subMenuOption1 == "OFF")
{
  Serial.println("Salir al Menu Prinicpal");
  menu = "OFF";
  runOnce = true;
  subMenu1Flag = false;
  ledOFF();
  mainMenu();
}
else
{
  Serial.println("Elegir un COLOR\n RED\n ORANGE\n YELLOW\n GREEN\n AQUA\n BLUE\n PINK\n WHITE\n OFF\n");
}

}

if (menuState == false && subMenu2Flag)
{
letra = Serial.read();
subMenuOption2.concat(letra);
if (subMenuOption2 == "RED")
{
Serial.println("Led Rojo STROBE");
Serial.println("Presione RED, GREEN o BLUE para variar la frecuencia");
Serial.println("Presione OFF para detener el efecto y seleccionar otro color o salir");
while (true)
{
setColor(255, 0, 0); // turn color on
delay(n);
ledOFF();
delay(n);
letra = Serial.read();
subMenuOption2.concat(letra);
if (subMenuOption2 == "off" || subMenuOption2 == "OFF")
{
n = 30;
break;
}
else if (subMenuOption2 == "RED")
{
n = 70;
}
else if (subMenuOption2 == "GREEN")
{
n = 120;
}
else if (subMenuOption2 == "BLUE")
{
n = 200;
}
}
}
else if (subMenuOption2 == "GREEN")
{
Serial.println("Led Naranja STROBE");
Serial.println("Presione RED, GREEN o BLUE para variar la frecuencia");
Serial.println("Presione q para detener el efecto y seleccionar otro color o salir");
while (true)
{
setColor(255, 136, 0); // turn color on
delay(n);
ledOFF();
delay(n);
letra = Serial.read();
subMenuOption2.concat(letra);

    if (subMenuOption2 == "off" || subMenuOption2 == "OFF")
    {
      n = 30;
      break;
    }
    else if (subMenuOption2 == "RED")
    {
      n = 70;
    }
    else if (subMenuOption2 == "GREEN")
    {
      n = 120;
    }
    else if (subMenuOption2 == "BLUE")
    {
      n = 200;
    }
  }
}
else if (subMenuOption2 == "YELLOW")
{
  Serial.println("Led Amarillo STROBE");
  Serial.println("Presione RED, GREEN o BLUE para variar la frecuencia");
  Serial.println("Presione OFF para detener el efecto y seleccionar otro color o salir");
  while (true)
  {
    setColor(255, 255, 0); // turn color on
    delay(n);
    ledOFF();
    delay(n);
    letra = Serial.read();
    subMenuOption2.concat(letra);
    
    if (subMenuOption2 == "off" || subMenuOption2 == "OFF")
    {
      n = 30;
      break;
    }
    else if (subMenuOption2 == "RED")
    {
      n = 70;
    }
    else if (subMenuOption2 == "GREEN")
    {
      n = 120;
    }
    else if (subMenuOption2 == "BLUE")
    {
      n = 200;
    }
  }
}
else if (subMenuOption2 == "GREEN")
{
  Serial.println("Led Verde STROBE");
  Serial.println("Presione RED, GREEN o BLUE para variar la frecuencia");
  Serial.println("Presione OFF para detener el efecto y seleccionar otro color o salir");
  while (true)
  {
    setColor(0, 255, 0); // turn color on
    delay(n);
    ledOFF();
    delay(n);
    letra = Serial.read();
    subMenuOption2.concat(letra);
    
    if (subMenuOption2 == "off" || subMenuOption2 == "OFF")
    {
      n = 30;
      break;
    }
    else if (subMenuOption2 == "RED")
    {
      n = 70;
    }
    else if (subMenuOption2 == "GREEN")
    {
      n = 120;
    }
    else if (subMenuOption2 == "BLUE")
    {
      n = 200;
    }
  }
}
else if (subMenuOption2 == "AQUA")
{
  Serial.println("Led Aqua STROBE");
  Serial.println("Presione RED, GREEN o BLUE para variar la frecuencia");
  Serial.println("Presione OFF para detener el efecto y seleccionar otro color o salir");
  while (true)
  {
    setColor(0, 255, 255); // turn color on
    delay(n);
    ledOFF();
    delay(n);
    letra = Serial.read();
    subMenuOption2.concat(letra);
    
    if (subMenuOption2 == "off" || subMenuOption2 == "OFF")
    {
      n = 30;
      break;
    }
    else if (subMenuOption2 == "RED")
    {
      n = 70;
    }
    else if (subMenuOption2 == "GREEN")
    {
      n = 120;
    }
    else if (subMenuOption2 == "BLUE")
    {
      n = 200;
    }
  }
}
else if (subMenuOption2 == "BLUE")
{
  Serial.println("Led Azul STROBE");
  Serial.println("Presione RED, GREEN o BLUE para variar la frecuencia");
  Serial.println("Presione OFF para detener el efecto y seleccionar otro color o salir");
  while (true)
  {
    setColor(0, 0, 255); // turn color on
    delay(n);
    ledOFF();
    delay(n);
    letra = Serial.read();
    subMenuOption2.concat(letra);
    
    if (subMenuOption2 == "off" || subMenuOption2 == "OFF")
    {
      n = 30;
      break;
    }
    else if (subMenuOption2 == "RED")
    {
      n = 70;
    }
    else if (subMenuOption2 == "GREEN")
    {
      n = 120;
    }
    else if (subMenuOption2 == "BLUE")
    {
      n = 200;
    }
  }
}
else if (subMenuOption2 == "PINK")
{
  Serial.println("Led Rosado STROBE");
  Serial.println("Presione RED, GREEN o BLUE para variar la frecuencia");
  Serial.println("Presione OFF para detener el efecto y seleccionar otro color o salir");
  while (true)
  {
    setColor(255, 20, 147); // turn color on
    delay(n);
    ledOFF();
    delay(n);
   letra = Serial.read();
    subMenuOption2.concat(letra);
    
    if (subMenuOption2 == "off" || subMenuOption2 == "OFF")
    {
      n = 30;
      break;
    }
    else if (subMenuOption2 == "RED")
    {
      n = 70;
    }
    else if (subMenuOption2 == "GREEN")
    {
      n = 120;
    }
    else if (subMenuOption2 == "BLUE")
    {
      n = 200;
    }
  }
}
else if (subMenuOption2 == "WHITE")
{
  Serial.println("Led Blanco Estroboscópico");
  Serial.println("Presione RED, GREEN o BLUE para variar la frecuencia");
  Serial.println("Presione OFF para detener el efecto y seleccionar otro color o salir");
  while (true)
  {
    setColor(255, 255, 255); // turn color on
    delay(n);
    ledOFF();
    delay(n);
    letra = Serial.read();
    subMenuOption2.concat(letra);
    
    if (subMenuOption2 == "off" || subMenuOption2 == "OFF")
    {
      n = 30;
      break;
    }
    else if (subMenuOption2 == "RED")
    {
      n = 70;
    }
    else if (subMenuOption2 == "GREEN")
    {
      n = 120;
    }
    else if (subMenuOption2 == "BLUE")
    {
      n = 200;
    }
  }
}
else if (subMenuOption2 == "OFF")
{
  Serial.println("Salir al Menu Prinicpal");
  menu = "OFF";
  runOnce = true;
  subMenu2Flag = false;
  mainMenu();
}
else
{
  Serial.println("Elegir un COLOR\n RED\n ORANGE\n YELLOW\n GREEN\n AQUA\n BLUE\n PINK\n WHITE\n OFF\n ");
}

}

if (menuState == false && subMenu3Flag)
{
letra = Serial.read();
subMenuOption3.concat(letra);

if (subMenuOption3 == "RED")
{
  Serial.println("Led Rojo BREATH");
  Serial.println("Presione OFF para detener el efecto y seleccionar otro color o salir");
  while (true)
  {
    breathRED();
    delay(60);
    letra = Serial.read();
    subMenuOption2.concat(letra);
   
    if (subMenuOption2 == "off" || subMenuOption2 == "OFF")
    {
      ledOFF();
      break;
    }
  }
}
else if (subMenuOption3 == "GREEN")
{
  Serial.println("Led Verde breathing");
  Serial.println("Presione OFF para detener el efecto y seleccionar otro color o salir");
  while (true)
  {
    breathGREEN();
    delay(60);
    letra = Serial.read();
    subMenuOption3.concat(letra);
    
    if (subMenuOption2 == "off" || subMenuOption2 == "OFF")
    {
      ledOFF();
      break;
    }
  }
}
else if (subMenuOption3 == "BLUE")
{
  Serial.println("Led Azul BREATH");
  Serial.println("Presione OFF para detener el efecto y seleccionar otro color o salir");
  while (true)
  {
    breathBLUE();
    delay(60);
    letra = Serial.read();
    subMenuOption3.concat(letra);
    
    if (subMenuOption2 == "off" || subMenuOption2 == "OFF")
    {
      ledOFF();
      break;
    }
  }
}
else if (subMenuOption3 == "OFF")
{
  Serial.println("Salir al Menu Prinicpal");
  menu = "OFF";
  runOnce = true;
  subMenu3Flag = false;
  mainMenu();
}
else
{
  Serial.println("Elegir un COLOR\n RED\n GREEN\n BLUE\n OFF salir\n");
}

}

}

void mainMenu()
{
if (runOnce == true)
{
Serial.println(" Seleccione un efecto ");
Serial.println(" STATIC: " + STATIC);
Serial.println(" STROBE: " + STROBE);
Serial.println(" BREATH: " + BREATH);
runOnce = false;
menuState = true;
}
}

void subMenu1()
{
menuState = false;
subMenu1Flag = true;
Serial.println(" Efecto STATIC ");
Serial.println("Elige un color\n RED\n ORANGE\n YELLOW\n GREEN\n AQUA\n BLUE\n PINK\n WHITE\n OFF\n");
}

void subMenu2()
{
menuState = false;
subMenu2Flag = true;
Serial.println(" Efecto STROBE ");
Serial.println("Elige un COLOR\n RED\n ORANGE\n YELLOW\n GREEN\n AQUA\n BLUE\n PINK\n WHITE\n OFF\n");
}

void subMenu3()
{
menuState = false;
subMenu3Flag = true;
Serial.println(" Efecto BREATH ");
Serial.println("Elige un color\n RED\n GREEN\n BLUE\n OFF salir\n");
}

void setColor(int R, int G, int B)
{
analogWrite(redPin, R);
analogWrite(greenPin, G);
analogWrite(bluePin, B);
}

void ledOFF()
{
setColor(0, 0, 0);
}

void breathRED()
{
for (int ii = 0; ii < smoothness_pts; ii++)
{
float pwm_val = 255.0 * (exp(-(pow(((ii / smoothness_pts) - beta) / gamma, 2.0)) / 2.0));
analogWrite(redPin, int(pwm_val));
delay(5);
}
}

void breathGREEN()
{
for (int ii = 0; ii < smoothness_pts; ii++)
{
float pwm_val = 255.0 * (exp(-(pow(((ii / smoothness_pts) - beta) / gamma, 2.0)) / 2.0));
analogWrite(greenPin, int(pwm_val));
delay(5);
}
}

void breathBLUE()
{
for (int ii = 0; ii < smoothness_pts; ii++)
{
float pwm_val = 255.0 * (exp(-(pow(((ii / smoothness_pts) - beta) / gamma, 2.0)) / 2.0));
analogWrite(bluePin, int(pwm_val));
delay(5);
}
}

Por favor edita el código para que se vea correctamente utilizando la etiqueta code, tal y como te especifican las normas.

En tu programa abusas constantemente de las cadenas. Cada vez que creas una cadena usando comillas al estilo:

"Esto es una cadena"

Se reserva memoria RAM para dicha cadena, con lo cual en tu programa gastas mucha memoria.

¿Cómo puedes reducir el consumo? He aquí unos tips.

Usa la macro F. Cuando vayas a imprimir un texto simple utiliza dicha macro que lo que hará será guardar la cadena en memoria flash y la leerá de allí reduciendo el uso de memoria RAM. Por ejemplo:


Serial.println(F("Elegir una opcion\n STATIC\n STROBE\n BREATH\n"));

Como ves dicha macro se usa de esta forma:


F("texto")

Utiliza constantes para las comparaciones. Por ejemplo en tu programa hay muchas cadenas tipo "GREEN", "RED", "WHITE", etc. que luego vas a usar en tu programa muchas veces. Por eso conviente que crees una constante con el valor de dicha cadena y luego la comparas con ella. Ejemplo:


const String green = "GREEN";
const String red   = "RED";
const String white = "WHITE";

...

if ( subMenuOption == white ) {
  // algo.
}

...

Con estos trucos recudiras mucho el uso de memoria RAM.

Referencia de la Macro F.

Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>


Edita tmb el título retirando la palabra ayuda. y haciendolo mas corto por favor.
Mira el punto 5 de las normas sobre cómo poner los títulos en este foro.
IMPORTANTE
Tienes dos hilos abiertos con faltas reiteredas por favor, presta atención a los pedidos de los moderadores.
Edita de acuerdo a las normas.


EDITO: Cerré el otro hilo por doble posteo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.