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);
}
}
