Go Down

Topic: switch case anidados (Solucionado) (Read 4922 times) previous topic - next topic

IgnoranteAbsoluto

#15
Jan 14, 2018, 07:07 pm Last Edit: Jan 14, 2018, 07:09 pm by IgnoranteAbsoluto
Adrian_E lo del enum no es más que una forma "refinada" de tratar con constantes. En este caso en lugar de usar los valores 0 y 1 se tienen "las constantes" ESTADO_ESPERANDO_LETRA y ESTADO_ESPERANDO_DIGITO. Y digamos que esas constantes son del tipo estado_t. Pero si has leído la entrada que dices verás que ahí lo explico un poco.

Por otro lado, el ejemplo que has puesto del control de los LEDs con el teclado, en teoría, no debería de funcionar bien. Tal vez el delay(300) hace posible que en ocasiones funcione ya que puede que la librería Keypad.h almacene las teclas pulsadas durante el delay(300) (no conozco a fondo esa librería) y de la casualidad que pulses las dos teclas durante esa pausa y luego las provea una detrás de otra. Si fuera así, te funcionaría aveces sí, aveces no. Prueba a quitar el delay(300) o a pulsar las teclas con un segundo de separación entre una pulsación y otra y dime si funciona bien o no funciona en absoluto. Es más ¿te funciona bien el 100% de las veces el código de los LEDs que has puesto, tal cual está? (En lo que escribía esto has cambiado el código que habías puesto, esto ya no procede)

El enum y las variables que puse que han de ser globales lo has de poner al principio, fuera del setup() y del loop().

Adrian_E

ok saque el delay(), pero me sigue ganando  >:(  >:(

Adrian_E

Como no consegui hacerlo funcionar, solo de esta manaera, lo malo es que el waitForKey() pe detiene el codigo hasta que precione la opcion elegida
Code: [Select]
#include <Keypad.h>


int led_1 =8;
int led_2 =9;
int led_3=11;
int led_4 =12;

const byte Filas = 4; //KeyPad de 4 filas
const byte Cols = 4; //y 4 columnas
byte Pins_Filas[] = {33,35,37,39}; //Pines Arduino para las filas.
byte Pins_Cols[] = {41,43,45,47}; // Pines Arduino para las columnas.

int tiempo = 250;
unsigned long inicia=0;


char cadena[17];
char Teclas [Filas][Cols] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
Keypad Teclado = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols);

char leds;
char pulsacion;


void setup() {
 Serial.begin(9600);
pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);
pinMode(led_3, OUTPUT);
pinMode(led_4, OUTPUT);
pinMode(6, OUTPUT);
}
void loop() {
 
  pulsacion = Teclado.getKey();
 
  if(millis() - inicia>=tiempo){
      inicia = millis();
      digitalWrite(6, !digitalRead(6));
  }
 
  switch (pulsacion) {
   
      case 'A' :
            leds = Teclado.waitForKey();
            switch (leds)
               {
         
         case '1':
              digitalWrite(led_1, !digitalRead(led_1));
              break;
         case '2':
              digitalWrite(led_2, !digitalRead(led_2));
              break;
              }
              break;
           
      case 'B' :
          leds = Teclado.waitForKey();
        switch (leds){
               
        case '3':
              digitalWrite(led_3, !digitalRead(led_3));
              break;
          case '4':
              digitalWrite(led_4, !digitalRead(led_4));
              break;
               }
              break;

       }   
 
  }
       
       

IgnoranteAbsoluto

¿Qué es exactamente lo que quieres hacer que no te funciona?

Adrian_E

Es anidar switch como el ejemplo que postee pero si tener que usar waitforkey que detiene la ejecución

IgnoranteAbsoluto

¿Anidar por anidar? No lo entiendo. Se anida si con ello resuelves el problema que tratas de solucionar. No se trata de "estoy aburrido, voy a anidar".

Plantearé la pregunta de otra manera. ¿Qué es lo que quieres que se tenga que teclear para que se apague o encienda un LED determinado?  Porque en lo que dices que no te funciona parece que estás teniendo en cuenta que hay que apretar '#' para que encienda o apague el LED y en que usas el waitForKey() no esperas a que se pulse el '#', sino que basta con pulsar letra y número.

Adrian_E

Soy novato, pero se que se puede hacer de mil maneras, pero si lees el post desde el principio te vas dar cuenta, uso led para aprender a usar switch anidados con entradas de teclado, ignoranteabsoluto me explico cómo hacerlo con servos.

IgnoranteAbsoluto

¿Te funcionó lo de los servos?

No me has explicado aún cómo se ha de comportar el programa ni porqué en uno parece que hay que pulsar 'A1#' mientras que en el otro sólo hay que teclear 'A1' para que actúe sobre el LED.

Adrian_E

El de los led imagínate que tenés 4 líneas de nueve lámparas cada una, querés prender la lámpara número seis de la línea A y la Tres de la línea C

IgnoranteAbsoluto

El de los led imagínate que tenés 4 líneas de nueve lámparas cada una, querés prender la lámpara número seis de la línea A y la Tresˊ de la línea C
¿Qué habría que teclear para ello? ¿'A6C3' o 'A6#C3#'?

Adrian_E

Si presionas A y luego 3

IgnoranteAbsoluto

#26
Jan 14, 2018, 11:16 pm Last Edit: Jan 14, 2018, 11:17 pm by IgnoranteAbsoluto
Pues no. Porque si fuera así, ¿para qué estás poniendo el case '#' :? Con los servos el '#' servía para saber cuando terminabas de teclear los grados y una forma de "confirmar" pero ahora dices que no, que basta con letra y número.

No es cuestión de hacer COPY+PASTE y ya está. Es más bien COPY+COMPRENDER para encontrar una posible solución a tu problema en particular.

Aquí te dejo unas modificaciones para que funcionen las combinaciones A1, A2, B1 y B2 (ya que sólo has definido 4 LEDs).

Code: [Select]
#include <Keypad.h>


int led_1 =8;
int led_2 =9;
int led_3=11;
int led_4 =12;

const byte Filas = 4; //KeyPad de 4 filas
const byte Cols = 4; //y 4 columnas
byte Pins_Filas[] = {33,35,37,39}; //Pines Arduino para las filas.
byte Pins_Cols[] = {41,43,45,47}; // Pines Arduino para las columnas.

char cadena[17];
char Teclas [Filas][Cols] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
Keypad Teclado = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols);

enum estado_t{
  ESPARANDO_LETRA,
  ESPERANDO_LED
};
estado_t estado = ESPARANDO_LETRA;
char letra;
char led;


void setup() {
 Serial.begin(9600);
pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);
pinMode(led_3, OUTPUT);
pinMode(led_4, OUTPUT);

}
void loop() {
 
  char pulsacion = Teclado.getKey();
   
  switch (pulsacion) {
      case 'A'...'B':
        letra = pulsacion;
        estado = ESPERANDO_LED;
        break;
      case '1':
        if (estado == ESPERANDO_LED) { // Sólo si ya tenemos la letra (estamos esperando el número del LED)
          switch (letra) {
            case 'A':
              digitalWrite(led_1,!digitalRead(led_1));
              break;
            case 'B':
              digitalWrite(led_2,!digitalRead(led_2));
              break;
          }
        }
        estado = ESPERANDO_LETRA;
        break;
      case '2':
        if (estado == ESPERANDO_LED) { // Sólo si ya tenemos la letra (estamos esperando el número del LED)
          switch (letra) {
            case 'A':
              digitalWrite(led_3,!digitalRead(led_3));
              break;
            case 'B':
              digitalWrite(led_4,!digitalRead(led_4));
              break;
          }
        }
        estado = ESPERANDO_LETRA;
        break;
      default:
        estado = ESPARANDO_LETRA;
        break;
  }
}


Aunque yo, personalmente, no lo haría con tanto switch, sino más bien con un array bidimensional donde guardar los pines a los que tengo conectados los LEDs a controlar. Y utilizar la letra y el número para saber la "fila" y "columna" de la posición del array que tiene el valor del pin deseado.

Nota: el código no lo he probado, ni tan siquiera sé si compila.

Adrian_E

#27
Jan 14, 2018, 11:35 pm Last Edit: Jan 14, 2018, 11:38 pm by Adrian_E
compila, pero me pasa lo mismo que el mio, lee las pulsaciones, pero no hace nada, el que yo hice por haber usado waitforkey() lo malo es que hasta que no eligo el led a enceder se frena el codigo.
Code: [Select]
#include <Keypad.h>


int led_1 =8;
int led_2 =9;
int led_3=11;
int led_4 =12;

const byte Filas = 4; //KeyPad de 4 filas
const byte Cols = 4; //y 4 columnas
byte Pins_Filas[] = {33,35,37,39}; //Pines Arduino para las filas.
byte Pins_Cols[] = {41,43,45,47}; // Pines Arduino para las columnas.

int tiempo = 250;
unsigned long inicia=0;

char cadena[17];
char Teclas [Filas][Cols] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
Keypad Teclado = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols);

char leds;
char pulsacion;


void setup() {
 Serial.begin(9600);
pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);
pinMode(led_3, OUTPUT);
pinMode(led_4, OUTPUT);
pinMode(6, OUTPUT);
}
void loop() {
 
  pulsacion = Teclado.getKey();
 
  if(millis() - inicia>=tiempo){
      inicia = millis();
      digitalWrite(6, !digitalRead(6));
  }
 
  switch (pulsacion) {
     leds = Teclado.waitForKey();
      case 'A' :
                       switch (leds)
               {
         
         case '1':
              digitalWrite(led_1, !digitalRead(led_1));
              break;
         case '2':
              digitalWrite(led_2, !digitalRead(led_2));
              break;
              }
              break;
           
      case 'B' :
              leds = Teclado.getKey();}   
       
        switch (leds){
               
        case '3':
              digitalWrite(led_3, !digitalRead(led_3));
              break;
          case '4':
              digitalWrite(led_4, !digitalRead(led_4));
              break;
               }
              break;

       }   
 
  }
       
       


IgnoranteAbsoluto

No entiendo lo que tratas de decir. Dices que compila y te pasa lo mismo que con el tuyo. Pero pones un código que no es el que yo te he puesto. ¿Estás diciendo que lo que yo te he puesto, tal cual, no funciona? ¿Y a la vez estás poniendo un nuevo código hecho por ti que tampoco funciona? ¿O lo que has probado es el código que acabas de poner y no el mío?

Me estoy volviendo loco. No sé que es lo que has probado y qué no. ¿Has probado lo último que he puesto (sin modificaciones por tu parte) y no te ha funcionado?

Adrian_E

por eso te muestro el que me funciona a medias, que lo malo que tiene es que selecciono Opcion 'A' pero por usar el waitforkey() hasta que no selecciono el led a encender se detiene todos, el tuyo compila pero no hace nada.

Go Up