Pages: [1]   Go Down
Author Topic: Menu switch case  (Read 1498 times)
0 Members and 1 Guest are viewing this topic.
spain
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

arduino duemilanove

Spain
Offline Offline
Full Member
***
Karma: 0
Posts: 149
LED
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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? smiley-roll

En todo caso si lo quieres con palabras en vez de números, tendrías que hacerlo así:
Code:
enum estado {nulo=0, permanente=1, apagado=2, difuminado=3, parpadeo=4};
Y las asignaciones, por ejemplo:
Code:
estado=permanente;
Logged

Arduino Uno (R2fix) / Duemilanove (328p)
Ethernet Shield SD (v5)

spain
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

arduino duemilanove

Sevilla
Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

 Mis proyectos con arduino.
1 Proyecto - Contador - EUREKA v5

spain
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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
Logged

arduino duemilanove

Sevilla
Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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..
Logged

 Mis proyectos con arduino.
1 Proyecto - Contador - EUREKA v5

Sevilla
Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

En mi proyecto de contador eureka, tengo algo parecido, cree un menu para configurar los parametros del contador. haber si este codigo te ayuda.
Code:
  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.
Logged

 Mis proyectos con arduino.
1 Proyecto - Contador - EUREKA v5

Spain
Offline Offline
Full Member
***
Karma: 0
Posts: 149
LED
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: November 29, 2011, 11:38:20 am by Razorblade » Logged

Arduino Uno (R2fix) / Duemilanove (328p)
Ethernet Shield SD (v5)

spain
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

arduino duemilanove

Sevilla
Offline Offline
Newbie
*
Karma: 0
Posts: 43
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

 Mis proyectos con arduino.
1 Proyecto - Contador - EUREKA v5

Offline Offline
Jr. Member
**
Karma: 0
Posts: 64
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Code:
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;
    
    
  }
 
 
 
      
    }
« Last Edit: November 29, 2011, 02:24:58 pm by AlexRodriguez » Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 64
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

spain
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

arduino duemilanove

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 52
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: [1]   Go Up
Jump to: