Go Down

Topic: Some keypad's columns doesn't work (Read 105 times) previous topic - next topic

jcontreras

Aug 18, 2017, 10:44 am Last Edit: Aug 21, 2017, 09:09 am by jcontreras
Hi everyone!

I'm working in a project on an Arduino Mega. Basicly, it takes a number from the keypad, shows it in a LCD and sends it to a 14 bits word via digital pins.

The thing is that everything work well at first, but the first time it runs the 'conversion_to_14_bit' function, cols 2 and, sometimes, 1 stop working.

The values I've measured are C1&C2->5v; C3&C4->0.5v; F1-F4->5v. The code is:

Code: [Select]

// include the libraries code:
#include <LiquidCrystal.h>
#include <Keypad.h>

//constants defining:
const float LSB = 0.0219726562;  //Este es el valor decimal equivalente a un grado binario para un una
                                                  //palabra de 14 bits: LSB = (2^-(n-1)) * 180deg ;en nuestro caso n=14bit.

int BAM_bit[] = {49, 47,  45, 43, 41, 39, 37, 35, 33, 31, 29, 27, 25, 23};

//Inicialización del keypad
const byte ROWS = 4;          //four rows
const byte COLS = 4;          //four columns
char keys[ROWS][COLS] = {    //valores tomados por cada una de las teclas
  {'1', '2', '3', 'F'},
  {'4', '5', '6', 'E'},
  {'7', '8', '9', 'D'},
  {'A', '0', 'B', 'C'}
};
byte rowPins[ROWS] = {17, 16, 15, 14}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {21, 20, 19, 18}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

//Inicialización del display
LiquidCrystal lcd(13, 12, 11, 10, 9, 8); //Inicializa pins para LCD(rs, enable, D4, D5, D6, D7)


void setup()
{
  for (int count = 14; count > 0; count--)
  {
    pinMode(BAM_bit[count], OUTPUT);
  }
  Serial.begin(9600);
  lcd.begin(20, 4);            // set up the LCD's number of columns and rows (cols, rows)
  menu();
}

int i = 0;

void loop()
{
  char key = keypad.getKey();     //Espera entrada de teclado para entrar en un modo de trabajo
  if (key != NO_KEY)
  {
    switch (key)
    {
      case 'F':  
        while (keypad.getKey() != 'C')
        {
          lcd.clear();
          lcd.setCursor(4, 0); lcd.write("MODO MANUAL");
          lcd.setCursor(1, 1); lcd.write("Introduzca angulo:");
          int manualDegree = takeNum(8, 2);
          if (manualDegree == 9854)break;
          conversion(manualDegree);
        }
        menu();
        break;

      case 'E':    
        {
          lcd.clear();
          lcd.setCursor(2, 0);
          lcd.write("MODO AUTOMATICO");
          lcd.setCursor(5, 1);
          lcd.write("Introduzca");
          lcd.setCursor(0, 2);
          lcd.write("velocidad(grad/seg):");
          int vel = takeNum(8, 3);              //Velocidad angular en grados/segundo
          if (vel == 9854)break;                //Sale del caso si se ha presionado Menu('C')
          float delayDeg = 1.0 / vel;          //Calcula segundos por cada grado:
          float deg = 0;                            // 1 / (x grad/seg) = x seg/grado
          lcd.clear();
          while (true)
          {
            if (keypad.getKey() == 'C')     //Si se pulsa Menu ('C') se sale a menu
            {
              menu();
              break;
            }
            conversion(deg);
            lcd.setCursor(2, 0);
            lcd.write("MODO AUTOMATICO");
            lcd.setCursor(0, 2);
            lcd.write("Velocidad(deg/s):"); lcd.print(vel);
            lcd.setCursor(0, 3); lcd.write("Posicion: "); lcd.print(int(deg)); lcd.write(" deg.");
            if (deg > 359)
            {
              deg = 0;
              lcd.clear();
            }
            deg ++;
            delay(1000 * delayDeg);       //Espera el tiempo (en ms) dado por la velocidad
          }
          break;
        }

      case 'C':
        menu();
        break;
      default:
        lcd.clear();
        lcd.setCursor(2, 0);
        lcd.write("Introduzca modo");
        lcd.setCursor(2, 2);
        lcd.write("valido:D, E o F");
        delay(1500);
        menu();
    }
  }
}


/**********************************FUNCIONES**********************************/



/*Esta función presenta el menú de inicio en el LCD*/

void menu(void)
{
  lcd.clear();
  lcd.setCursor(8, 0);
  lcd.write("MENU");
  lcd.setCursor(0, 1);
  lcd.write("F: MODO MANUAL");
  lcd.setCursor(0, 2);
  lcd.write("E: MODO AUTOMATICO");
  lcd.setCursor(0, 3);
  lcd.write("D: MODO PROGRAMADO");
}


/*Esta función queda en espera de recibir entrada de teclado para almacenarla, devolviendo el valor
  introducido como un entero. Mostrará en pantalla los dígitos introducidos a partir de la posición
  dadda en PosX y PosY.*/

int takeNum(int PosX, int PosY)
{
  lcd.setCursor(PosX, PosY);
  lcd.cursor(); lcd.blink();
  int i = 0;
  while (true)
  {
    char kpress = keypad.waitForKey();    //Espera que se introduzca el dato y lo almacena en kpress
    if (kpress != 'A' && kpress != 'D' && kpress != 'E' && kpress != 'F')
    {
      if (kpress == 'B')break;
      else if (kpress == 'C')
      {
        i = 9854;
        menu();
        break;
      }
      else
      {
        lcd.write(kpress);
        kpress -= '0';                        //convierte el caracter ASCII 'kpress' en entero ('1'=1)
        int x = (int)kpress;                  //asigna a 'x' el valor de kpress como entero
        i = (10 * i) + x;
      }
    }
  }
  lcd.noCursor(); lcd.noBlink();
  return i;
}


/*  Esta función recoge un número decimal, lo comvierte a BAM y envía el dato a las salidas
     digitales bitBAM01 a bitBAM14 */

void conversion(int degree)
{
  int BAM_degree = degree / LSB;
  int mask = 0x2000;
  for (int count = 14; count > 0; count--)
  {
    BAM_bit[count] = (BAM_degree & mask) >> count - 1;/*
    Serial.print("BAM: "); Serial.print(BAM_degree);
    Serial.print(" - Grados: "); Serial.print(degree);
    Serial.print(" - Bit "); Serial.print(count); Serial.print(": "); Serial.println(BAM_bit[count]);
    Serial.print(BAM_degree, BIN); Serial.print("&"); Serial.print(mask, BIN); Serial.print("="); Serial.println(BAM_bit[count], BIN);*/
    mask = mask >> 1;
  }
  return ;
}


Could someone help me? Thanks a million in advance.

Go Up