Keypad LCD y Punteros

Buenas noches a todos. Hace poco comencé a utilizar la IDE de Arduino, y he querido hacer un programa específico utilizando punteros para añadir números indefinidamente a un puntero especifico.

Los componentes que utilizo son un Keypad 4x4, una LCD 20x4 y una tarjeta Arduino Virtual, (todo esto corrido en una simulación en el programa PROTEUS), cuando intento usar "enum variable { };" para ordenar las variables de los botones del Keypad, aparece el error: ADG does not name a type (ADG es el nombre de una de las variable que funge como pulsación y este error me aparece con las otras 2 variables). Llevo horas intentado arreglar esto y ya me he vuelto loco, necesito de su ayuda :frowning: :sob:

#include <Keypad.h>
#include <LiquidCrystal.h>

const int rs = 10, en = 11, d4 = 12, d5 = 13, d6 = 14, d7 = 15;
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);

const byte Filas = 4;
const byte Columnas = 4;
byte pines_filas[] = {9,8,7,6};
byte pines_columnas[] = {5,4,3,2};
char teclas [Filas][Columnas] =
{
  {'7','8','9','/'},
  {'4','5','6','x'},
  {'1','2','3','-'},
  {'C','0','=','+'}
};

Keypad teclado1 = Keypad(makeKeymap(teclas),pines_filas,pines_columnas,4,4);

enum etapas {ingreso, agregacion, liberar};
enum etapas etapa;

enum pulso {ADG, BEH, CFI};
ADG = teclado1.getKey();
BEH = teclado1.getKey();
CFI = teclado2.getKey();
enum pulso acto;

void *a = NULL;
void *b = NULL;
char *c = NULL;
int s = 0;
int i = 1;

void guarda(int i, char ADG, char *c){
  lcd.setCursor(0,2);
  lcd.print("Dato ");
  lcd.print(i);
  lcd.print(" = ");
  for(int m = 0; m < i; m++){
    c[m] = ADG;
    lcd.print(c[m]);
  }
  lcd.setCursor(0,3);
  lcd.print("Guardado");
  delay(1000);
  lcd.clear();
}

void agrega(int i, char *c){
  i = i+1;
  b = realloc(c, i*sizeof(char));
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Ingresa un numero:");
  acto = CFI;
  if(CFI != 0){
    lcd.setCursor(0,2);
    lcd.print("Dato ");
    lcd.print(i);
    lcd.print(" = ");
    for(int n = i-1; n < i; n++){
      c[n] = CFI;
      lcd.print(c[n]);
    }
    lcd.setCursor(0,3);
    lcd.print("Guardado");
    delay(1000);
    lcd.clear();
  }
}

void libera(char *c, void *a, void *b, int i){
  lcd.setCursor(0,0);
  lcd.print("Sus datos son estos:");
  lcd.setCursor(0,1);
  for(int j = 0; j < i; j++){
    lcd.print(j+1);
    lcd.print(". ");
    lcd.print(c[j]);
    lcd.print(" ");
  }
  free(a);
  free(b);
  free(c);
}
void setup(){
  lcd.begin(20,4); 
  lcd.setCursor(2,0);
  lcd.print("Porfavor ingresa");
  lcd.setCursor(5,1);
  lcd.print("un numero:");
  lcd.setCursor(3,3);
  etapa = ingreso;
  acto = ADG;
}

void loop() {
  switch(etapa) {
    case ingreso:
      if(ADG != 0){
        guarda(i, ADG, c);
      }
      etapa = agregacion;
      break;
    case agregacion:
      lcd.setCursor(0,0);
      lcd.print("Ingresar mas datos?");
      lcd.setCursor(3,2);
      lcd.print("Si = 9  No = 0");
      acto = BEH;
      if(BEH == '9'){
        agrega(i, c);
      }
      if(BEH == '0'){
        etapa = liberar;
      }
      break;
    case liberar:
      libera(c, a, b, i);
      exit(0);
      break;
  }
}

Estas asignaciones estan de mas, fuera de lugar y contexto.

ADG = teclado1.getKey();
BEH = teclado1.getKey();
CFI = teclado2.getKey();

coméntalas.
Probé tu código y compila comentando las 3 lineas citadas.

Wooow, si compila, está genial, muchas muchas gracias!! :relaxed:

Lo que tienes que hacer con esto por ejemplo es

if (teclado1.getKey() == ADG ) {
   // acción
}

Como te dijo @Surbyte, está mal.
Aunque lo común es no asignarle valores (los asigna por defecto el compilador) porque en general el valor no nos interesa, en caso de hacerlo los valores a asignar deben ser constantes.
Por ejemplo

enum midi_orders {
  NOTE_OFF = 0x80,
  NOTE_ON = 0x90
};

Tu lo has intentado definir y utilizar como si fuesen macros (o algo parecido).

El uso que te propone @Surbyte ,

if (teclado1.getKey() == ADG ) {
   // acción
}

creo que no sería útil en este caso porque, por defecto, ADG, BEH y CFI representarían los valores 0; 1 y 2, respectivamente (una vez corregido el error antes citado).

Saludos

1 Like