Buenas, estoy haciendo un programa que consta de una pantalla LCD, un teclado matricial y un lector de SD, el funciona se basa en introducir un codigo desde el teclado y que se visualize en la pantalla LCD, y al pulsar la tecla "D" se lea el archivo de la SD que tenga el mismo nombre(aún estoy en proceso de averiguar como hacerlo). El problema esta en que el programa me funciona correctamente siempre y cuando el caso "D" no tenga nada, cuando introduzco el codigo para la SD y lo paso al arduino el teclado me deja de funcionar y no me escribe nada en el LCD...
Os enseño el codigo:
#include <SD.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Este programa consta de un LCD, un teclado matricial y un lector de SD, su funcionamiento se basa en leer un archivo en formato txt dentro de una tarjeta SD y reproducirlo por el puerto serial y como una secuencia de pines.
// El objetivo es conseguir que el programa sea capaz de leer el codigo que introduzcamos con el teclado matricial y al pulsar la letra "D" se busque el archivo con ese nombre. De esta manera conseguiriamos leer diferentes
// variables y interpretar varias secuencias.
LiquidCrystal_I2C lcd(0x27, 16, 4);
File myFile;
int UltimaPosicion=0;
int pausa=1000;
int Pins[8]={26,27,28,29,30,31,32,33};//Pines para la secuencia, para añadir más editar el valor y poner los pines correspondientes.
const byte filas = 4; //Numero de filas del teclado
const byte columnas = 4; //Numero de columnas del teclado
char matriz[filas][columnas] =
{
{ '1', '2', '3', 'A'},
{ '4', '5', '6', 'B'},
{ '7', '8', '9', 'C'},
{ '*', '0', '#', 'D'},
};
byte pinesFilas[filas] = {7,6,5,4}; //Pines donde van conectadas las filas del teclado
byte pinesColumnas[columnas] = {11,10,9,8};
Keypad teclado = Keypad( makeKeymap(matriz), pinesFilas, pinesColumnas, filas, columnas);//Inicializo el teclado con el numero de filas, columnas, los pines del Arduino utilizados y la matriz
//Variables para el control de la posicion del cursor
int posX = 0;
int posY = 1;
//Variables para el control del contador, ya que no se usa ningun delay() en este codigo
unsigned long tiempo_anterior = 0;
int periodo = 500; //500 milisegundos
int pin_lector = 49; //Pin CS
//Variales para el control de las teclas
char presionando;
int veces_presionada = 0;
int mayuscula_activada = 0;
int mostrar_cursorPantalla = 1;
int contador = 0;
void setup()
{
Serial.begin(9600);
lcd.begin();
Serial.print("Iniciando SD ...");
pinMode(pin_lector, OUTPUT);
lcd.begin(); //Inicializamos la pantalla
lcd.setCursor(5, 0);
lcd.print("SLC");
lcd.setCursor(3,1 );
lcd.print("Verificador");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("CODI:");
if (!SD.begin(4)) {
Serial.println("No se pudo inicializar la tarjeta SD");
return;
}
Serial.println("inicializacion exitosa");
for(int i=0;i<8;i++)
{
pinMode(Pins[i],OUTPUT);
}
}
void loop()
{
char tecla_presionada = teclado.getKey(); //Almacena la tecla presionada
if (millis() > tiempo_anterior + periodo) //Condicional para evaluar si transcurrieron 500 milisegundos
{
tiempo_anterior = millis();
//Si transcurrieron 500 milisegundos y hubo una tecla presionada, aumenta en +1 el contador
if (veces_presionada > 0)
{
contador++;
if (contador == 3) //Si el contador llega a 3, el cursor avanza una posicion
{
posX++;
veces_presionada = 0;
}
}
mostrar_cursorPantalla++; //Variable para el control del parpadeo del cursor
if (mostrar_cursorPantalla > 1)
{
mostrar_cursorPantalla = 0;
}
}
if (mostrar_cursorPantalla == 1) //Muestra el cursor en la pantalla
{
lcd.setCursor(posX, posY);
lcd.cursor();
}
if (mostrar_cursorPantalla == 0) //Oculta el cursor en la pantalla
{
lcd.setCursor(posX, posY);
lcd.noCursor();
}
if (posX > 12) //La posicion en X no puede ser mayor a 15 (el eje X va desde 0 hasta 15)
{
posX = 0;
posY = 1;
}
if (posX < 0) //La posicion en X no puede ser menor a 0
{
posX = 0;
}
if (posY > 1) //La posicion en Y no puede ser mayor a 1 (el eje Y va desde 0 hasta 1)
{
posY = 0;
}
switch (tecla_presionada) //Switch-case de acuerdo a la tecla presionada
{
case 'A': //La tecla A es la espaciadora. Aumenta en +1 la posicion del cursor
posX++;
veces_presionada = 0;
break;
case 'B': //La tecla B sirve para borrar el caracter anterior escrito
posX--;
lcd.setCursor(posX, posY);
lcd.print(" ");
veces_presionada = 0;
break;
case 'C': //La tecla C borra TODO lo escrito en la pantalla y posiciona el cursor en (0,0)
lcd.clear();
lcd.setCursor (0,0);
lcd.print("CODI:");
posX = 0;
posY = 1;
veces_presionada = 0;
break;
case 'D': //La tecla D se usa como Enter, debe leer el codigo escrito en el LCD y buscar el archivo en la SD para luego interpretarlo y hacer una secuencia.
myFile = SD.open("Prueba.txt");//abrimos el archivo con el codigo del cable introducido con el teclado en el LCD
int totalBytes=myFile.size();
String cadena="";
if (myFile) {
if(UltimaPosicion>=totalBytes) UltimaPosicion=0;
myFile.seek(UltimaPosicion);
//--Leemos una línea de la hoja de texto--------------
while (myFile.available()) {
char caracter=myFile.read();
cadena=cadena+caracter;
UltimaPosicion=myFile.position();
if(caracter==10)//ASCII de nueva de línea
{
break;
}
}
//---------------------------------------------------
myFile.close(); //cerramos el archivo
Serial.print("Cadena Leida:");
Serial.print(cadena);
//-----------procesamos la cadena------------
int index=0;
char c=cadena[index++];
pausa=0;
while (c >= '0' && c <= '9')
{
pausa = 10*pausa + (c - '0');
c = cadena[index++];
}
Serial.print("pausa=");
Serial.print(pausa);
Serial.print(" PINS |");
for(int i=0;i<8;i++)
{
if(cadena[index+i*2]=='1')
{
digitalWrite(Pins[i], HIGH);
Serial.print(" 1 |");
}
else
{
digitalWrite(Pins[i], LOW);
Serial.print(" 0 |");
}
}
Serial.println();
Serial.println();
} else {
Serial.println("Error al abrir el archivo");
lcd.clear();
lcd.print ("Error archivo");
}
delay(pausa);
break;
case '0':
//Condicional para que avance el cursor si anteriormente se estaba presionando una tecla distinta
if (presionando != '0' && veces_presionada > 0)
{
posX++;
veces_presionada = 0;
}
lcd.setCursor(posX, posY);
veces_presionada++;
contador = 0;
presionando = '0';
if (veces_presionada > 5)
{
veces_presionada = 1;
}
if (veces_presionada == 1)
{
lcd.print('0');
}
if (veces_presionada == 2)
{
lcd.print('-');
}
if (veces_presionada == 3)
{
lcd.print('*');
}
if (veces_presionada == 4)
{
lcd.print('/');
}
if (veces_presionada == 5)
{
lcd.print('+');
}
break;
case '*': //La tecla * activa y desactiva las mayusculas
mayuscula_activada++;
if (mayuscula_activada > 1)
{
mayuscula_activada = 1;
}
break;
case '#':
//Condicional para que avance el cursor si anteriormente se estaba presionando una tecla distinta
if (presionando != '#' && veces_presionada > 0)
{
posX++;
veces_presionada = 0;
}
lcd.setCursor(posX, posY);
veces_presionada++;
contador = 0;
presionando = '#';
if (veces_presionada > 5)
{
veces_presionada = 1;
}
if (veces_presionada == 1)
{
lcd.print('>');
}
if (veces_presionada == 2)
{
lcd.print('<');
}
if (veces_presionada == 3)
{
lcd.print('=');
}
if (veces_presionada == 4)
{
lcd.print('!');
}
if (veces_presionada == 5)
{
lcd.print('#');
}
break;
case '1':
//Condicional para que avance el cursor si anteriormente se estaba presionando una tecla distinta
if (presionando != '1' && veces_presionada > 0)
{
posX++;
veces_presionada = 0;
}
lcd.setCursor(posX, posY);
veces_presionada++;
contador = 0;
presionando = '1';
if (veces_presionada > 5)
{
veces_presionada = 1;
}
if (veces_presionada == 1)
{
lcd.print('1');
}
if (veces_presionada == 2)
{
lcd.print(')');
}
if (veces_presionada == 3)
{
lcd.print('.');
}
if (veces_presionada == 4)
{
lcd.print(',');
}
if (veces_presionada == 5)
{
lcd.print('(');
}
break;
case '2':
//Condicional para que avance el cursor si anteriormente se estaba presionando una tecla distinta
if (presionando != '2' && veces_presionada > 0)
{
posX++;
veces_presionada = 0;
}
lcd.setCursor(posX, posY);
veces_presionada++;
contador = 0;
presionando = '2';
if (veces_presionada > 4)
{
veces_presionada = 1;
}
if (veces_presionada == 2)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('A');
}
else
{
lcd.print('A');
}
}
if (veces_presionada == 3)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('B');
}
else
{
lcd.print('B');
}
}
if (veces_presionada == 4)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('C');
}
else
{
lcd.print('C');
}
}
if (veces_presionada == 1)
{
lcd.print('2');
}
break;
case '3':
//Condicional para que avance el cursor si anteriormente se estaba presionando una tecla distinta
if (presionando != '3' && veces_presionada > 0)
{
posX++;
veces_presionada = 0;
}
lcd.setCursor(posX, posY);
veces_presionada++;
contador = 0;
presionando = '3';
if (veces_presionada > 4)
{
veces_presionada = 1;
}
if (veces_presionada == 2)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('D');
}
else
{
lcd.print('D');
}
}
if (veces_presionada == 3)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('E');
}
else
{
lcd.print('E');
}
}
if (veces_presionada == 4)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('F');
}
else
{
lcd.print('F');
}
}
if (veces_presionada == 1)
{
lcd.print('3');
}
break;
case '4':
//Condicional para que avance el cursor si anteriormente se estaba presionando una tecla distinta
if (presionando != '4' && veces_presionada > 0)
{
posX++;
veces_presionada = 0;
}
lcd.setCursor(posX, posY);
veces_presionada++;
contador = 0;
presionando = '4';
if (veces_presionada > 4)
{
veces_presionada = 1;
}
if (veces_presionada == 2)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('G');
}
else
{
lcd.print('G');
}
}
if (veces_presionada == 3)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('H');
}
else
{
lcd.print('H');
}
}
if (veces_presionada == 4)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('I');
}
else
{
lcd.print('I');
}
}
if (veces_presionada == 1)
{
lcd.print('4');
}
break;
case '5':
//Condicional para que avance el cursor si anteriormente se estaba presionando una tecla distinta
if (presionando != '5' && veces_presionada > 0)
{
posX++;
veces_presionada = 0;
}
lcd.setCursor(posX, posY);
veces_presionada++;
contador = 0;
presionando = '5';
if (veces_presionada > 4)
{
veces_presionada = 1;
}
if (veces_presionada == 2)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('J');
}
else
{
lcd.print('J');
}
}
if (veces_presionada == 3)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('K');
}
else
{
lcd.print('K');
}
}
if (veces_presionada == 4)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('L');
}
else
{
lcd.print('L');
}
}
if (veces_presionada == 1)
{
lcd.print('5');
}
break;
case '6':
//Condicional para que avance el cursor si anteriormente se estaba presionando una tecla distinta
if (presionando != '6' && veces_presionada > 0)
{
posX++;
veces_presionada = 0;
}
lcd.setCursor(posX, posY);
veces_presionada++;
contador = 0;
presionando = '6';
if (veces_presionada > 4)
{
veces_presionada = 1;
}
if (veces_presionada == 2)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('M');
}
else
{
lcd.print('M');
}
}
if (veces_presionada == 3)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('N');
}
else
{
lcd.print('N');
}
}
if (veces_presionada == 4)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('O');
}
else
{
lcd.print('O');
}
}
if (veces_presionada == 1)
{
lcd.print('6');
}
break;
case '7':
//Condicional para que avance el cursor si anteriormente se estaba presionando una tecla distinta
if (presionando != '7' && veces_presionada > 0)
{
posX++;
veces_presionada = 0;
}
lcd.setCursor(posX, posY);
veces_presionada++;
contador = 0;
presionando = '7';
if (veces_presionada > 5)
{
veces_presionada = 1;
}
if (veces_presionada == 2)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('P');
}
else
{
lcd.print('P');
}
}
if (veces_presionada == 3)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('Q');
}
else
{
lcd.print('Q');
}
}
if (veces_presionada == 4)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('R');
}
else
{
lcd.print('R');
}
}
if (veces_presionada == 5)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('S');
}
else
{
lcd.print('S');
}
}
if (veces_presionada == 1)
{
lcd.print('7');
}
break;
case '8':
//Condicional para que avance el cursor si anteriormente se estaba presionando una tecla distinta
if (presionando != '8' && veces_presionada > 0)
{
posX++;
veces_presionada = 0;
}
lcd.setCursor(posX, posY);
veces_presionada++;
contador = 0;
presionando = '8';
if (veces_presionada > 4)
{
veces_presionada = 1;
}
if (veces_presionada == 2)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('T');
}
else
{
lcd.print('T');
}
}
if (veces_presionada == 3)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('U');
}
else
{
lcd.print('U');
}
}
if (veces_presionada == 4)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('V');
}
else
{
lcd.print('V');
}
}
if (veces_presionada == 1)
{
lcd.print('8');
}
break;
case '9':
//Condicional para que avance el cursor si anteriormente se estaba presionando una tecla distinta
if (presionando != '9' && veces_presionada > 0)
{
posX++;
veces_presionada = 0;
}
lcd.setCursor(posX, posY);
veces_presionada++;
contador = 0;
presionando = '9';
if (veces_presionada > 5)
{
veces_presionada = 1;
}
if (veces_presionada == 2)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('W');
}
else
{
lcd.print('W');
}
}
if (veces_presionada == 3)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('X');
}
else
{
lcd.print('X');
}
}
if (veces_presionada == 4)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('Y');
}
else
{
lcd.print('Y');
}
}
if (veces_presionada == 5)
{
if (mayuscula_activada == 1 || (posX == 0 && posY == 0))
{
lcd.print('Z');
}
else
{
lcd.print('Z');
}
}
if (veces_presionada == 1)
{
lcd.print('9');
}
break;
}
}