Go Down

Topic: Leer datos de SD de un archivo txt (Read 5920 times) previous topic - next topic

luismaya

Hola Ingresando al Mundo Arduino
Estoy tratando de leer datos de la SD donde he creado un archivo llamado "servo.txt" donde pongo algunos numero separados por comas 90,150,200,215,320,420,520 lo que he visto es que la función valor=dataFile.read(); va recorriendo de uno en uno.
Lo que pretendo hacer es por ejemplo leer completo el valor 90 y guardaarlo para despues usarlo en mi codigo, el cual me servira para posicionar un servo motor. pero no logro hacer que ese valor seguarde.
Lo que me entrega son valores en ASCII, por lo tanto en la funcion que quiero ocupar no reconoce esos valor, posiblemente exista alguna funcnion para guadar estos valores como un entero, supongamos que para diferenciar de entre uno y otro esta la ' , '
No se si sea la mejor forma de hacer esto.
Gracias
Saludos
adjunto el codigo. 

Marcial

Supongo que habrá mas soluciones, pero te podrá funcionar esta:
Vas leyendo caracter a caracter  y añadiéndolo a un string, hasta llegar a una coma y despues usas Toint()

http://arduino.cc/en/Reference/StringToInt

Un saludo

luismaya

Si es una buena solución, el detalle es que posiblemente este haciendo algo mal, para guadar los datos en un string
char valor[100];   
void leer()
{
  File dataFile = SD.open("servo.txt",FILE_READ);
  if (dataFile)
{
   while (dataFile.available())
{
   valor=dataFile.read(); esta función no admite declarar la variable asi.
Serial.write(valor);
}
dataFile.close();

Marcial

Te paso las funciones que use yo en un programa  que maneja SD con la libreira tinyFAT.h, por si te si te sirve para algo:

Hay funciones que manejan una pantalla lcd, tienes que sacarlas

Code: [Select]
void Iniciar_SD()
{
  byte Error;                                                              // Auxiliar para el codigo de error si lo hay
  Pantalla.print("INICIANDO TARJETA SD", CENTER,1);                        // Arrancando tarjeta
  Error=file.initFAT();                                                    // Cargar error si lo hay
  byte Opcion=0;                                                           // Auxiliar para opciones de botones
  if (Error!=NO_ERROR)                                                     // Si ni inicia correctamente la tarjeta
  {                                                   
    PintaBotonGS("SI","NO");                                               // Botones SI/NO
    Color=255;
    while (Opcion==0)                                                      // Paralizar programa hasta q pulse la pantalla
    {     
      Pantalla.setColor(Color,0,0);                                        // Color pantalla rojo
      Pantalla.print("ERROR INICIANO TARJETA SD",CENTER,13);               // Sacar mensaje por pantalla indicando lo q hacemos
      Pantalla.print("CONTINUAR SIN SD?" , CENTER,25);                     // Sacar mensaje por pantalla indicando lo q hacemos
      Color=Color-10;                                                      // Bajar tono rojo
      Opcion=ChequeaBotonesGS();                                           // Esperar a que pulse una de las dos opciones
      if (Color<1) {Color=255;}                                            // Si se acaban los tonos volver a comenzar
    }   
    if (ChequeaBotonesGS()==2)                                             // Finalizar programa
    {
      Pantalla.clrScr();                                                   // Borra la pantalla
      while (true) {}                                                      // Bucle cerrado para q no salga de ahy
    }
    Pantalla.setColor(0,0,255);                                            // Color azul
    T_SD=false;                                                            // Tarjera SD incorrecta
  } 
  else
  {
    T_SD=true;                                                             // Tarjera SD correcta
    Pantalla.print("TARJETA SD INICIADA CORRECTAMENTE", CENTER,13);        // Arrancando tarjeta
    delay(1000);
  }           
  Pantalla.clrScr();                                                       // Borra la pantalla
  Pantalla.drawRoundRect (0,0,319,40);                                     // Pintarlo marco de nuevo
}



Marcial

Code: [Select]
String Abrir_Ficheros(String Mensaje, String Fichero, int Buffer)
{
  byte Error;                                                            // Auxiliar para el codigo de error si lo hay
  byte Opcion=0;                                                         // Auxiliar para opciones de botones
  char Registro[Buffer+1];                                               // Auxiliar para leer registro
  char Nombre_Fichero[13];                                               // Auxilia para nombre de fichero
  char Nombre_Copia[13];                                                 // Auxilia para nombre de fichero
  String Auxiliar;                                                       // Auxiliar para nombre de fichero
  Auxiliar=Fichero + ".TXT";                                             // Nombre real del fichero enl a SD
  Auxiliar.toCharArray(Nombre_Fichero,Auxiliar.length()+1);              // Nombre del fichero en disco
  Pantalla.print("COMPROBANDO FICHERO DE " + Mensaje, CENTER,1);         // Sacar mensaje por pantalla indicando lo q hacemos
  delay(1000);
  if (!file.exists(Nombre_Fichero))                                      // Si no existe el fichero
  {
    Pantalla.print("NO EXISTE FICHERO DE " + Mensaje, CENTER,25);        // Sacar mensaje por pantalla indicando q no existe
    Auxiliar=Fichero + ".BAK";                                           // Nombre real de la copia de seguridad del fichero
    Auxiliar.toCharArray(Nombre_Copia,Auxiliar.length()+1);              // Nombre de la copia fichero en disco
    if (file.exists(Nombre_Copia))                                       // Si existe la copia                                   
    {
      Pantalla.print("USAR LA COPIA O CREARLO?", CENTER,13);             // Sacar mensaje por pantalla indicando q no existe
      PintaBotonGS("COPIA","CREAR");                                     // Botones COPIA/CREAR
      while (Opcion==0)                                                  // Mientras no pulse una opcion
      {
        Opcion=ChequeaBotonesGS();                                       // Esperar a que pulse una de las dos opciones   
      }
      if (Opcion==1)
      {
        Error=file.openFile(Nombre_Copia, FILEMODE_TEXT_READ) ;          // Abrir copia fichero
        if (Error!=NO_ERROR)                                             // Si error al abrir el fichero   
        {
          Color=255;
          file.closeFile();
          while (!Tactil.dataAvailable())                                // Paralizar programa hasta q pulse la pantalla
          {     
            Pantalla.setColor(Color,0,0);                                // Color pantalla rojo
            Pantalla.print("ERROR ABRIENDO COPIA DE " + Mensaje,CENTER,13);// Sacar mensaje por pantalla indicando lo q hacemos
            Pantalla.print("PULSE PARA CONTINUAR" , CENTER,25);          // Sacar mensaje por pantalla indicando lo q hacemos
            Color=Color-10;                                              // Bajar tono rojo
            if (Color<1) {Color=255;}                                    // Si se acaban los tonos volver a comenzar
          }
          Opcion=2;                                                      // No sepuede abrir, pasamos a crearlo     
        }
        else
        {
          file.readLn(Registro, Buffer);                                 // Leer registro   
          delay(150);
          file.closeFile();                                              // Cerrar fichero al finalizar
          delay(150);
        }   
      }
    } 
    Pantalla.print("CREANDO FICHERO DE " + Mensaje, CENTER,25);          // y que lo vamos a crear partiendo de unos datos inicales
    file.create(Nombre_Fichero);                                         // Crear fichero
    file.openFile(Nombre_Fichero, FILEMODE_TEXT_WRITE);                  // Abrir fichero para llenarlo de ceros y asi porder leerlo e inicializar variables
    if (Opcion!=1)                                                       // No usar copia
    {
      for (int X=0;X<=Buffer;X++) {Registro[X]=0;}                       // Registro vacio todo a 0
    }
    file.writeLn(Registro);                                              // Guardando registro
    delay(150);       
    file.closeFile();                                                    // Cerrar fichero
    delay(1000);
  }   
  Pantalla.clrScr();                                                       // Borra la pantalla
  Pantalla.drawRoundRect (0,0,319,40);                                     // Pintarlo marco de nuevo
  Pantalla.print("ABRIENDO FICHERO DE " + Mensaje, CENTER,1);            // Sacar mensaje por pantalla indicando lo q hacemos
  delay(500);
  Error=file.openFile(Nombre_Fichero, FILEMODE_TEXT_READ) ;              // Abrir fichero
  if (Error!=NO_ERROR)                                                   // Si error al abrir el fichero   
  {
      Color=255;
      file.closeFile();
      while (!Tactil.dataAvailable())                                    // Paralizar programa hasta q pulse la pantalla
      {     
        Pantalla.setColor(Color,0,0);                                    // Color pantalla rojo
        Pantalla.print("ERROR ABRIENDO FICHERO DE " + Mensaje,CENTER,13);// Sacar mensaje por pantalla indicando lo q hacemos
        Pantalla.print("PULSE PARA CONTINUAR" , CENTER,25);              // Sacar mensaje por pantalla indicando lo q hacemos
        Color=Color-10;                                                  // Bajar tono rojo
        if (Color<1) {Color=255;}                                        // Si se acaban los tonos volver a comenzar
      }
      Pantalla.clrScr();                                                 // Borra la pantalla
      Pantalla.drawRoundRect (0,0,319,40);                               // Pintarlo marco de nuevo
      return "0";                                                        // Retornar vacio para indicar error de lectura   
  }
  else
  {
    file.readLn(Registro, Buffer);                                       // Leer registro   
    delay(100);
    file.closeFile();                                                    // Cerrar fichero al finalizar
    Pantalla.print("FICHERO DE " + Mensaje + " LEIDO" ,CENTER,13);       // Sacar mensaje por pantalla indicando lo q hacemos
    return String(Registro);                                             // Todo correcto, retornar registro
  }
}

Marcial

Code: [Select]
boolean Guardar_Ficheros(String Mensaje, String Fichero, char *Registro, boolean Valido)
{
  byte Error;                                                              // Auxiliar para el codigo de error si lo hay
  byte Opcion=0;                                                           // Auxiliar para opciones de botones
  char Nombre_Fichero[13];                                                 // Auxilia para nombre de fichero
  char Nombre_Copia[13];                                                   // Auxilia para nombre de fichero
  String Auxiliar;                                                         // Auxiliar para nombre de fichero
  Auxiliar=Fichero + ".TXT";                                               // Nombre real del fichero enl a SD
  Auxiliar.toCharArray(Nombre_Fichero,Auxiliar.length()+1);                // Nombre del fichero en disco
  Auxiliar=Fichero + ".BAK";                                               // Nombre real de la copia de seguridad del fichero
  Auxiliar.toCharArray(Nombre_Copia,Auxiliar.length()+1);                  // Nombre de la copia fichero   
  if (Valido)                                                              // Si el fichero se abrio correctamente
  {
    if (file.exists(Nombre_Copia))                                         // Si existe fichero .BAK
    {
      file.delFile(Nombre_Copia);                                          // Borrar el .bak
      delay(150);
      file.rename(Nombre_Fichero,Nombre_Copia);                            // Cambiar de extension el fichero actual para quedar de compia
      delay(150);     
    }   
  }
  if (file.exists(Nombre_Fichero))                                         // Si existe fichero .TXT
  {
    file.delFile(Nombre_Fichero);                                          // Borrar el .TXT     
    delay(150);
  } 
  file.create(Nombre_Fichero);                                             // Crear fichero de parametros de nuevo
  delay(150);
  Error=file.openFile(Nombre_Fichero, FILEMODE_TEXT_WRITE);                // Abrir fichero para añadir
  delay(100);
  if (Error==NO_ERROR)                                                     // Si no hay error procedemos a guardar los registros
  {
    file.writeLn(Registro);                                                // Guardando registro
    delay(150);     
    file.closeFile();                                                      // Cerrar fichero al finalizar
    return true;
  }
  else                                                                     // Error abriendo fichero
  {
    file.closeFile();                                                      // Cerrar fichero
    while (!Tactil.dataAvailable())                                        // Paralizar programa hasta q pulse la pantalla
    {     
      Pantalla.setColor(Color,0,0);                                        // Color pantalla rojo
      Pantalla.print("ERROR ABRIENDO FICHERO DE "+ Mensaje,CENTER,201);    // Sacar mensaje por pantalla indicando lo q hacemos
      Pantalla.print("PULSE PARA CONTINUAR" , CENTER,213);                 // Sacar mensaje por pantalla indicando lo q hacemos
      Color=Color-10;                                                      // Bajar tono rojo
      if (Color<1) {Color=255;}                                            // Si se acaban los tonos volver a comenzar
    }
    Pantalla.setColor(0,0,255);                                            // Color pantalla azul
    return false;
  }
}

Go Up