Go Down

Topic: Problemas con botones del teclado matricial! (Read 2121 times) previous topic - next topic

IRRA

Jun 11, 2015, 10:57 pm Last Edit: Jun 12, 2015, 05:07 pm by IRRA
Hola, estoy usando un LCD y un teclado matricial 4x4 y la cuarta columna de letras (A, B, C Y D) la uso asi:
A = mostrar pantalla para ingresar un valor max en decena y unidad
B = mostrar pantalla para ingresar un valor min en decena y unidad
C = borrar valores equivocados
D = ingresar los valores marcados en pantallas de A y B.

Mi problema es asi, estando en pantalla de tecla A, presiono la tecla B para pasar a su pantalla y no me deja sino presiono a ese boton 3 veces, y antes de la 3° vez me aparece en el LCD un numero de 3 cifras que creo que es el equivalente del valor ascii de la letra B en valor numerico multiplicado por 2 veces, cosa que esta mal porque si estoy en pantalla de tecla B y presiono tecla A del teclado se pasa a pantalla de letra A sin problema alguno y al primer intento.

Les dejo el codigo desde el VOID LOOP, el resto en comentarios. Gracias:
Code: [Select]

void loop() {

  float temperatura = centigrados();      //se iguala variable temperatura a variable centigrados
  lcd.setCursor(0, 2);                    //posicionar texto en columna 0 y fila 2
  lcd.print("TEMP.ACTUAL       ^C");       //escribir texto en LCD
  lcd.setCursor(13, 2);
  lcd.print(temperatura);                  //mostrar resultado de temperatura mas arriba
  delay(200);

  char teclas = keypad.getKey();  //Guarda en la variable "teclas" el valor pulsado del teclado

  if (teclas != NO_KEY) {             //Si se ha pulsado una tecla
    numero = teclas - 48;            //conversión de caracteres ASCII a valores numericos
    digitalWrite(buzzer, HIGH);
    delay(50);
    digitalWrite(buzzer, LOW);

    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    //PROCESO AL PULSAR BOTON A (INSERTAR VALOR MAX) (TECLA F6)
    if (numero == 17) {                      //Si se pulsa la tecla A entonces (valor ascii A es en valor numerico 17)
      digitalWrite(ledAzul, LOW);      //apagar led azul
      digitalWrite(ledVerde, LOW);    //apagar LED verde
      digitalWrite(ledRojo, LOW);      //apagar led rojo
      lcd.clear();                        //Se limpia la pantalla del LCD
      delay(100);                          //pausa para pasar a otra pantalla
      lcd.setCursor(3, 0);                   //se ajusta el cursor del LCD
      lcd.print("INGRESE NUEVO!");           //se muestra texto en LCD
      lcd.setCursor(4, 1);
      lcd.print("VALOR MAXIMO");
      lcd.setCursor(5, 2);
      lcd.print("(0.....99)");
      lcd.setCursor(8, 3);
      lcd.print("  ^C");
      cicloA = 1;                         //El "cicloA" será igual a 1
      numero = -1;                    //la variable "numero" comienza en -1
      contador = 0;                       //Se iguala la variable "contador" a 0
    }

    if (cicloA == 1) {                       //Si el "cicloA = 1", indica que se presiono la tecla A o F6

      if (numero >= 0 && contador == 0) {       //Si se presiona un boton del teclado y si el "contador = 0" entonces
        decenaA = numero;                   //Se iguala el valor tecleado a la variable "decenaA"
        contador++;                       //Se incrementa el valor del "contador" a 1
        numero = -1;                    //la variable "numero" comienza en -1
        delay(50);
      }
      if (numero >= 0 && contador == 1) {          //Si se presiona una digito y contador=1 entonces
        unidadA = numero;                       //Se iguala el valor tecleado a la variable "unidadA"
        contador++;                           //Se incrementa al valor del contador a 2
        numero = -1;                          //la variable numero comienza en -1
        delay(50);

        valorA = (decenaA * 10) + unidadA;
        tmax = valorA;
        lcd.setCursor(8, 3);                  //posicionar cursor del LCD
        lcd.print(valorA);                    //mostrar en LCD valores de temperatura
      }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //PROCESO AL PULSAR BOTON B (INSERTAR VALOR MIN) (TECLA F5)
    if (numero == 18) {             //Si se pulsa la tecla B entonces
      digitalWrite(ledAzul, LOW);      //apagar led azul
      digitalWrite(ledVerde, LOW);    //apagar LED verde
      digitalWrite(ledRojo, LOW);      //apagar led rojo
      lcd.clear();                  //Se limpia la pantalla
      delay(100);                    //pausa para pasar a otra pantalla
      lcd.setCursor(3, 0);               //se ajusta el cursor
      lcd.print("INGRESE NUEVO!");
      lcd.setCursor(4, 1);            //Se ajusta el cursor a una determinada posición
      lcd.print("VALOR MINIMO");        //mostrar texto en LCD
      lcd.setCursor(5, 2);
      lcd.print("(0.....99)");
      lcd.setCursor(8, 3);                //posicionar cursor del LCD
      lcd.print("  ^C");                   //escribir textos
      cicloB = 1;                       //El cicloB será igual a 1
      numero = -1;                      //variable char numero se iguala a -1
      contador = 0;                   //Se iguala la variable "contador" a cero
    }

    if (cicloB == 1) { //Si cicloB = 1, indica que se presiono la tecla B

      if (numero >= 0 && contador == 0) {            //Si se presiona una digito y contador=0 entonces
        decenaB = numero;                           //Se iguala el valor tecleado a la variable "decenaB"
        contador++;                                  //Se incrementa al valor del contador a 1
        numero = -1;                                //variable char numero se iguala a -1
        delay(50);
      }

      if (numero >= 0 && contador == 1) {        //Si se presiona una digito y contador=1 entonces
        unidadB = numero;                       //Se iguala el valor tecleado a la variable "unidadB"
        contador++;                            //Se incrementa al valor del contador a 2
        numero = -1;                            //variable char numero se iguala a -1
        delay(50);

        valorB = (decenaB * 10) + unidadB;
        tmin = valorB;
        lcd.setCursor(8, 3);                          //Se ajusta el cursor a una determinada posición
        lcd.print(valorB);                         //Se imprime en el LCD el numero obtenido en la variable "valorB"
      }
    }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //PROCESO AL PULSAR BOTON C (BORRAR NUMEROS EQUIVOCADOS) (TECLA F4)
    if (numero == 19) {                       //Si se pulsa la tecla C entonces
      delay(100);                          //pausa antes del borrado de numeros
      lcd.setCursor(8, 3);                      //Se ajusta el cursor del LCD
      lcd.print("  ");                           //mostrar texto vacio en LCD
    }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //PROCESO AL PULSAR EL BOTON D (ENTER) (F3)
    if (numero == 20) {                           //si se pulsa la tecla D entonces
      digitalWrite(ledVerde, HIGH);                  //encender led verde
      lcd.clear();                                //limpiar pantalla
      delay(100);
      lcd.setCursor(0, 0);                      //posicionar cursor en columna 0 y fila 0
      lcd.print("EN FUNCIONAMIENTO...");        //escribir texto en LCD
      lcd.setCursor(0, 1);                      //posicionar cursor en columna 0 y fila 1
      lcd.print("TEMP.MAX          ^C");       //escribir texto en LCD
      lcd.setCursor(16, 1);
      lcd.print(valorA);                        //mostrar valorA maximo en LCD
      lcd.setCursor(0, 3);                    //posicionar texto en columna 0 y fila 3
      lcd.print("TEMP.MIN          ^C");       //escribir texto en LCD
      lcd.setCursor(16, 3);
      lcd.print(valorB);
    }
  }

  if (temperatura >= tmax) {                //si el valor de temperatura es mayor o igual al valorA
    digitalWrite(ledAzul, LOW);                //apagar led azul
    digitalWrite(ledRojo, HIGH);                //encender led rojo
    digitalWrite(transistor2, HIGH);              //encender transistor 2
  }
  else {
    digitalWrite(ledRojo, LOW);              //apagar led rojo
    digitalWrite(transistor2, LOW);          //apagar transistor 2
  }

  if (temperatura <= tmin) {            //si el valor de temperatura es mayor o igual al valorB
    digitalWrite(ledRojo, LOW);              //apagar led rojo
    digitalWrite(ledAzul, HIGH);            //encender led azul
    digitalWrite(transistor1, HIGH);        //encender transistor 1
  }
  else {
    digitalWrite(ledAzul, LOW);              //apagar led azul
    digitalWrite(transistor1, LOW);           //apagar transistor 1
  }
}

IRRA

#1
Jun 12, 2015, 05:08 pm Last Edit: Jun 12, 2015, 05:09 pm by IRRA
Code: [Select]
#include <Keypad.h>          //libreria para controlar el teclado matricial
#include <LiquidCrystal.h>   //libreria para controlar el LCD

//Configuración del teclado matricial

const byte filas = 4;                            // numero de filas a usar
const byte columnas = 4;                          // numero de columnas a usar
byte pinsFilas[filas] = {22, 23, 24, 25};          // orden de conexion de filas: Fila 1, Fila 2, Fila 3 y Fila 4
byte pinsColumnas[columnas] = {26, 27, 28, 29};    // orden de conexion de columnas: Columna 1, Columna 2, Columna 3 y Columna 4

char teclas[filas][columnas] = {  //matriz teclas para definir orden de caracteres tal cual en el teclado
  {'7', '8', '9', 'A'},
  {'4', '5', '6', 'B'},
  {'1', '2', '3', 'C'},
  {'0', 'F', 'E', 'D'},
};
Keypad keypad = Keypad(makeKeymap(teclas), pinsFilas, pinsColumnas, filas, columnas);  //se mapean teclas


// Configuración para el LCD

// Puertos LCD -> RS  E   D4  D5  D6  D7
LiquidCrystal lcd(32, 33, 34, 35, 36, 37);

const int sensor = 0; // entrada del sensor LM35
const int backlight = 38;   // pin digital LED del LCD
const int ledAzul = 42;     // pin digital LED azul
const int ledVerde = 43;    // pin digital LED verde
const int ledRojo = 44;     // pin digital LED rojo
const int buzzer = 45;      // pin digital buzzer
const int transistor1 = 52; // pin digital transistor 1
const int transistor2 = 53; // pin digital transistor 2


char numero;             //variable "char numero" de tipo caracteres
int  valorA;             //variables para mostrar numeros en LCD
int  valorB;

int contador;            //variables "contador" para separar procesos
int contador2 = 0;
int contador3;

int decenaA;     //variables "decena" para definir decenas
int decenaB;
int unidadA;     //variables "unidad" para definir unidades
int unidadB;

int cicloA;      //variables "ciclo" que comienzan procesos
int cicloB;

int tmax;
int tmin;


float centigrados()                    //se calcula como variable decimal "coma flotante"
{
  int sensor;                          //de acuerdo a la variable del sensor
  float celsius;                        //se crea una variable resultado decimal
  sensor = analogRead(A0);              //se lee el estado de la entrada analogica A0 donde esta el sensor
  celsius = (500.0 * sensor) / 1023;    //se realiza el calculo
  return (celsius);                    //se devuelve el resultado a la variable decimal "celsius"
}


void setup() {                  //se definen como salidas las conexiones a pines digitales
  pinMode(backlight, OUTPUT);
  pinMode(ledAzul, OUTPUT);
  pinMode(ledVerde, OUTPUT);
  pinMode(ledRojo, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(transistor1, OUTPUT);
  pinMode(transistor2, OUTPUT);

  delay(500);                        //pausa antes del encendido
  digitalWrite(backlight, HIGH);    //encender backlight
  delay(500);                       //pausa antes de primera pantalla para que se muestre prolijamente
  digitalWrite(ledVerde, HIGH);
  lcd.begin(20, 4);                 //inicio de uso de LCD de 20x4
  lcd.setCursor(3, 1);              //posicionar cursor en columna 3 y fila 1
  lcd.print("BIENVENIDO/A A");      //escribir texto en LCD
  lcd.setCursor(1, 2);
  lcd.print("TECMATEMP LCDMR 35");
  digitalWrite(buzzer, HIGH);       //encender buzzer
  delay(1000);                      //pausa de 1 seg encendido
  digitalWrite(buzzer, LOW);        //apagar buzzer
  delay(9000);                      //esperar 9 seg antes del void loop
  lcd.clear();                      //limpiar pantalla
  delay(100);                        //pausa para pasar a otra pantalla prolijamente
}
[code]

Go Up