Menu switch case

Hola a todos, la verdad es que soy muy nuevo por aquí y este es mi primer post.

Escribo porque la verdad es que no he encontrado la solución por ningún lado y los ejemplos que he visto del código son muy liosos.

El proyecto que tengo en mente es con un pulsador variar entre las distintas opciones de un "menu" para un led (encendido, parpadeo, fading, apagado,...)

Mi idea era iniciar un contador que contase las veces que se pulsaba el pulsador y lo guardase en una variable. Esa variable se compara en un switch y se saca a una función que realice la acción adecuada.

El último intento que probe fue este:

int ledPin = 12;
int pulsador = 13;
int posicion;
int estado;

void setup() {
pinMode (ledPin, OUTPUT);
pinMode (pulsador, INPUT);
}

void loop (){
if (pulsador == HIGH)
posicion ++;
if (posicion == 1)
estado ("permanente");
if (posicion == 2)
estado ("apagado");
if (posicion == 3);
estado ("difuminado");
if (posicion == 4)
estado ("parpadeo");
if (posicion == 5)
estado ("0");

switch (estado) {
case "permanente":
digitalWrite (ledPin = HIGH);
break;
case "apagado":
digitalWrite (ledPin, LOW);
break;
case "difuminado":
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}

// fade out from max to min in increments of 5 points:
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
break;
case "parpadeo":
digitalWrite (ledPin, HIGH);
delay (250);
digitalWrite (ledPin, LOW);
delay (250);
break;
case "0":
posicion = 0;
}

Pero me da este error compilando: 'estado' cannot be used as function.

A ver si alguien me podría ayudar a usar la función break.

Muchas gracias de antemano

Un saludo, Jorge

silth:
int estado;

Has definido estado como un número entero. ¿Qué número se supone que es "permanente" por ejemplo? ¿Y cómo estás asignando el número a la variable si efectivamente parece que la trates como una función? :roll_eyes:

En todo caso si lo quieres con palabras en vez de números, tendrías que hacerlo así:

enum estado {nulo=0, permanente=1, apagado=2, difuminado=3, parpadeo=4};

Y las asignaciones, por ejemplo:

estado=permanente;

mi intencion es que se vayan contando los pulsos en alta y se vayan pasando por los casos del switch, y por ejemplo cuando se llegue al ultimo caso se borre y se empiece de nuevo la cuenta. Por eso le puse la variable int
Pero no se...

amigo, creo que la variable estado, es eso una variable no una funcion,
si le quieres dar un valor a estado, debes de ponerlo asi:
estado = "loquesea"; // esto es si hemos declarado estado como string .
si es un entero int deveras hacerlo asi:
estado = 1;

espero que esto te ayude...

@Razorblade: la variable "estado" es una función que se encarga de encender el led de una determinada manera.

La idea es que se compare la variable posición con los casos del switch y se envíe al programa al que corresponde. Una vez se pulse de nuevo, se vaya al case siguiente.

@chambri: probé a modificar con comillas simples y dobles y no me funcionó tampoco

perdona que insista, pero donde esta declarada la función estado???? en el código no la veo..

para declarar una función se hace de la siguiente manera:

void estado(){

lo que hace la función;

}

el void, puede ser int, etc... o lo que tenga que devolver la función...

échale un vistazo al manual de arduino en la web arduino.cc

espero que te aclare algo..

En mi proyecto de contador eureka, tengo algo parecido, cree un menu para configurar los parametros del contador. haber si este codigo te ayuda.

  if ((BotonMenu/4) == 0){
    MenuAdmin ++;  
  }

  switch (MenuAdmin){ // casos de menu
    
    case 1:
      /// tu código
      delay(500);
      break;
    
    case 2:
     //tu segundo código
      delay(100);
      break;
    
    case 3:
   // tu tercer código
      delay(500);
      break;
    
    case 4:
     // tu cuarto codigo
      delay(500);
      break;
   
    case 5:
     // para salir
         MenuAdmin = 0;
         
      delay(500);
      break;
  }

he quitado todo el código para no liarte, falta que declares la variables y que lo metas en la estructura de arduino.
(por que sobre entiendo que tienes idea de como es el código de arduino y como funciona todo esto)
si no es así dilo y te lo pongo para que lo entiendas y comprendas paso por paso...

Un salu2.

silth, tus conocimientos de lenguaje C están cogidos con pinzas, pero crees que no y que no te entendemos. xD

Coge un manual de C, y mirate bien lo que es una función, un procedimiento, una variable y sus tipos, una estructura switch case, etc.. porque estás mezclando conceptos.

Creo que de la manera que tienes estructurado el programa, mi anterior recomendación de usar una variable enum es más simple, pero bueno, haz un procedimiento si te empeñas (que no función, porque no devuelve nada). Tienes que declararlo e implementarlo, teniendo bien claros los parámetros de entrada del procedimiento estado.

Gracias de nuevo a los dos.
Mi conocimientos de C no es que estén cogidos por pinzas, es que no hay yo creo...cursé hace 4 años un cuatrimestre de programación en C en la universidad y nada más. Pero ahora me veo con el proyecto fin de carrera y sin una base de programación...y eso que estas cosas son para yo aprender nada más, no para el proyecto.

Bueno, pues subiré esta tarde a la biblioteca a por un libro y me miraré la declaración de funciones y la estructura switch case sobre todo. La variable enum nunca la había visto, indagaré un poco más en ella.

Cambri muchas gracias por despejarme un poco tu código, justamente antes lo había estado mirando. voy a ver si puedo mirarme los conceptos de programación y lo puedo implementar con ayuda de tu código en C.

Gracias d enuevo

De nada, estamos para aprender juntos.. yo tampoco he programado nunca en c, y lo unico que he programado es php.

buenas, lo que entiendo es que quieres hacer,es prender apagar, control de lumiciad,etc, con un solo boton.
me puse a hacerlo, y me salio lo siguiente.

vas a poner hacer lo propuesto en funcion del tiempo y el numero de pulsaciones q hagas.es decir,
en un segundo deberas,apretar el boton, y se debera enceder.entre dos segundos deberas apretar dos veces el boton
y debera apagarce. creo que el concepto de como hacerlo esta.talvez debas agregar algo mas o no.

realmente no lo he probado pero s compilado, es que no encuentro un boton, para probarlo,jeje.
podria probarlo por otros mecanimos, pero la verdad yame dio flojera.Xd

int buttonPushCounter = 0;
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
int ledPin = 6;
int time=0,timeA=0;
int estado=0;

void setup() {
 pinMode (ledPin, OUTPUT);
  pinMode (2, INPUT);
}

void loop (){
  buttonState = digitalRead(2);
  
  
  
  
   if (buttonState == HIGH) {
       time=millis(); //
	   time=time-timeA;
	   buttonPushCounter++;
		  if(time==5000){
		  
		     buttonPushCounter=0;
			time=0;
			timeA=0;
		  }
		  
		  
		  
		
	      if(  (time>0 && time<=1000) && buttonPushCounter==1){   
		    estado=1;  //enceder led
		    buttonPushCounter=0;
			time=0;
			timeA=0;
		  
		  }
		  else if(  (time>0 && time<2000) && buttonPushCounter==2){   
		    estado=2;  //off led
		    buttonPushCounter=0;
			time=0;
			timeA=0;
			
		  
		  
		  }
    }
		  
		   switch (estado) {
    case 1:
         digitalWrite (ledPin, HIGH);
      break;
    case 2:
      digitalWrite (ledPin, LOW);
      break;
    
     
  }
		  
		  
	  
      
    }

si quieres hacer una donacioon a mi cuenta paypal, para comp`rme un boton.ja

Hola a todos de nuevo y gracias por las respuestas otra vez.
Esta tarde estuve leyéndome un libro de C, preguntando por la univerdad y con la ayuda de ustedes he conseguido empezar a hacer que el código funcione un poco.

Lo pongo a continuación:

int led = 13;
int boton = 2;
int numeropulsaciones;
int contador;

void setup () {
pinMode (led, OUTPUT);
pinMode (boton, INPUT);
Serial.begin (9600);
}

void loop () {
//contador = digitalRead (boton);
if (digitalRead (boton) == HIGH){
numeropulsaciones ++;
Serial.print (numeropulsaciones);
}
if (numeropulsaciones == 3)
numeropulsaciones = 0;

switch (numeropulsaciones) {
case 0:
apagado ();
break;

case 1:
encendido ();
break;

case 2:
parpadeo ();
break;

case 3:
fading ();
break;
}

delay (100);
}

void apagado () {
digitalWrite (led, LOW);
}

void encendido () {
digitalWrite (led, HIGH);
}

void parpadeo () {
/* Iniciar desbordamiento del timer 0 con el
tiempo del parpadeo deseado.
Luego se envía una función que hace toggle del LED. */
}

void fading () {
/* Iniciamos el desbodamienton con el ancho del pulso PWM
en cada desbordamiento llamamos a la funcion para modificar
el ciclo del PWM */
}

El problema que tengo ahora es que para que el programa no se me quede colgado parpadeando y no responda necesito tener el tmr0 con el tiempo que desee y hacer que al producirse un desbordamiento me realice lo que quiera. Lo mismo con el fading.

Voy a mirar el post de eureka de chambri que creo que le vi un problema similar.

Un saludo

El problema que le veo es que no estas detectando el evento push, o click.
Si presionas el pulsador y lo mantienes por mas de los 100 milis. que tiene tu delay a la misma pulsación la contara dos veces, y si sigues manteniendo mas aún.

La forma que encontré de hacer algo asi es controlando en cada loop del programa el valor actual de la entrada con el valor que tenia en el loop anterior, y asi contar una vez sola cada pulsación.

Mira este post en el que comente al respecto y sobre como encapsular esta logica para reusarla facilmente en otros proyectos.
http://arduino.cc/forum/index.php/topic,79318.0.html

Saludos.