Lectura archivos SD

Hola buenas,

Estoy con un proyecto en el que mediante un teclado matricial y un LCD escribo un código y lo visualizo, el problema esta en que necesito que el programa sea capaz de leer el código que he escrito y lea en una SD el archivo con el código que he introducido anteriormente. Es posible hacerlo? Cualquier información y ayuda es bienvenida, gracias!

Ejemplo: Al escribir el codigo "217BSD0004" arduino sea capaz de leerlo y buscar en la SD el archivo con ese nombre.

No hay suficiente información...

Debo entender que tienes archivos en la SD con nombres como el que digitas por teclado y visualizas en el LCD como el que has dado por ejemplo?
Si es asi, no creo que haya problemas, solo prestar atencion al tamaño del nombre y su extensión si la tiene.
La restricción de la librería FAT es la siguiente:

The file name follows the 8.3 format (8-character file name, 3-character file extension) and 2) it is in the root directory

En este hilo el autor de SDFat da sus motivos para no leer archivos con nombres largos.

Resumiendo, puedes digitar un nombre (restringido a 8 digitos o letras) SI, y luego encontrarlo en tu SD, la respuesta es SI.

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;
  }
}

Moderador:
Hola @imgenesis no puedes doble postear hilos.
Preguntas en un sitio sobre tu código sin ponerlo y en el otro pones el código y haz preguntas relacionadas. Eso es doble posteo.
Próximo doble posteo recibirás una sanción sin acceso por 1 dia para comenzar, y luego las sanciones serán acumulativas en potencia de 2.
Lee las normas del foro.
El otro hilo fue cerrado.

hola lo primero que noto es que usas el pin 4 como fila del matricial y también como Chip-select del sd

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.