ESCRIBIR Y LEER DATOS DE SD

Buenas,

actualmente estoy creando un proyecto que consiste en registrar personas mediante su huella dactilar y posteriormente al leer la huella con ese ID mover servomotores que realicen un movimiento u otro; dependiendo de dicha huella.

Ahora bien, cada ID tiene asociado uno o varios movimientos del servomotor por lo tanto tendria que guardar el ID y valores de variables ligados a ese ID.

En el caso de que use TARJETA SD para guardar datos como se dispondrian en el fichero, es decir, teniendo esta disposicion:

ID Servo1 Servo2 Servo3
1 0 2 1
2 1 0 0
3 0 1 2

como podria introducir en la SD los valores de cada columna asociados entre si y como los leeria desde arduino para utilizar las variables en funciones posteriores.

¿puede ser mas conveniente crear este tipo de vectores: int vector[5]={1,0,2,1}?
siendo la primera posicion del vector el ID y las posteriores los valores de cada variable servo.

En definitiva, me gustaria saber como podria leer dato a dato.

Otra opcion es guardar datos en una base de datos y realizar una consulta select dandole el ID y recogiendo en variables los valores de cada servo:

select servo1 into var1
from tablaSD
where ID = 1;

En el caso de que me decante por una base de datos mysql, como haria las consultas desde PHP a MYSQL o desde el mismo codigo arduino.

Gracias de antemano y un saludo.

Creo que una forma fácil de hacerlo es guardarlo tal cual en la SD

1021
2100
3012

Luego lees una linea del archivo y lo almacenas en un string array

linea[5];

while(file.available()){
  c = file.read();
  int = 1;
  while(c != '\n'){
    linea[i] = c; //almacena caracter
    i++;
  }
  linea[i++] = '\0'; //agrega final de array
  break;
}

para leer cada dato por separado solo quedaría hacer esto:
(atoi convierte el caracter en entero)

int id_servo = atoi(linea[0]);
int servo1   = atoi(linea[1]);
int servo2   = atoi(linea[2]);
int servo3   = atoi(linea[3]);

Hola.
Sería muy interesante conocer las características de las numeraciones; es decir, qué relación se establece entre huella dactilar e id, y qué tamaño de número necesitaremos para el id y para cada uno de los servos y qué número de registros aproximadamente vamos a tener. Dependiendo de ello, se puede establecer una estrategia más optimizada. Por ejemplo:
Si el número de registros es suficientemente pequeño como para hacerlo entrar en la memoria del arduino, o en la eeprom, pues te vas a quitar muchos quebraderos.
Si el número de ids es más elevado, pero son secuenciales y no aleatorios, teniéndolos bien ordenaditos en la SD, podemos saber en qué posición del archivo leer directamente los datos, sin tener que recorrer secuencialmente el archivo.
Si no son id's secuenciales, puede ser interesante ralentizar la escritura de un nuevo registro, pero insertarlo en posición ordenada, para en lugar de tener que recorrer de inicio a fin el archivo, realizar una búsqueda similar a la que hacemos en un diccionario.
Pero difícilmente se te puede aconsejar una dirección a tomar sin conocer esos pormenores.

se podria hacer algo parecido para guardar un id con un nombre en un txt y luego que buscara arduino un id especifico e imprimiera el nombre? por ejemplo

id nombre
1 salva
2 juan
3 pepe
4 lola

que buscara el id 3 e imprimiera pepe.

Se podría, pero para hacerlo rápido, los registros deben ser de la misma longitud. Entonces, para buscar un número de registro, sencillamente hay que desplazarse en el archivo a la posición (n_registro * tamaño_registro).

no lo entendi, podrias explicarmelo algo que pueda entender alguien de gente de menos nivel como yo jejee. GRACIAS

A ver si me puedo explicar mejor.

Si nuesto archivo está así:
1 Pepito|2 Juan|3 Nabucodonosor|4 Pi

Y necesitamos buscar el nombre 3, la única opción es recorrer el archivo hasta localizar el 3, y leer el nombre que hay después. Como los datos tienen longitud variable, no podemos predecir a qué altura del archivo está el registro 3.
Sin embargo, si nuestro archivo está así:

Pepito |juan |Nabucodonosor|Pi |
Es decir (aunque no se aprecie con esta fuente de letra) que TODOS LOS REGISTROS MIDAN LO MISMO; pongamos que 15 caracteres, y rellenamos los no utilizados con espacios o similar.
Para buscar el registro 3, sabríamos que va a comenzar en la posición 45 (3*15) tan sólo deberíamos hacer un myFile.seek(45) y leer 15 caracteres.

muchas gracias ahora si lo he entendido, pero yo lo quiero usar para que cada usuario registre su id pero si alguien usa el 3 sin usar el 2 no valdria eso, me explico?

El procedimiento podría ser similar. Lo que complica la cuestión es mantener el archivo ordenado; es decir, al dar de alta un nuevo id deberías insertarlo en su lugar correspondiente, lo que significa desplazar todos los registros que están después para hacer hueco al registro nuevo (y viceversa al eliminarlo). Si consigues eso, demorará tiempo la inserción/borrado de un nuevo registro (habría que ver si los tiempos son asumibles), pero las búsquedas se podrían hacer rápidamente sin recorrer todo el archivo, buscando primero el registro que está en mitad de la tabla, si el buscado es mayor, buscarías el de la mitad de la mitad superior; y si es menor, el de la mitad de la mitad inferior, y así sucesivamente vas delimitando la búsqueda. Con 16 lecturas, por ejemplo, podrías hallar un registro entre 65536.
Ahora mismo estoy intentando implementar una librería para crear una tabla indexada, con lo que todas las operaciones se podrían realizar con rapidez, pero de momento está en pañales. Si lo consigo, ya relanzaré el hilo de proyecto que inicié en este foro, a ver si resulta de utilidad.
Saludos.

Jajaja ya me preguntaba que pasó con el proyecto que planteamos pero no esperaba menos de ti NOTER. jajaja asi que trabajando en las sombras.
Pues ve compartiendo algo como para darte una mano. Pero hablo del post iniciado o lo harás por aca?

Hola buenos días, tengo que leer datos , específicamente un archivo html en una SD , por cuestión de orden quiero posicionarla dentro de una carpeta y no logro acceder, si lo hace cuando la coloco en en directorio raiz.
Y otra cuestión es si puedo utilizar el prototipo sin la conexión serial y pasar los msj a una pantalla lcd 20x4.
Dejo para que evalúen un tramo del código. Gracias

 Serial.begin(9600);                                                               // para debug
   
                                                                                         // inicializo SD card
   Serial.println("Inicializando SD Card...");
   if (!SD.begin(4)) {
       Serial.println("ERROR - SD card Inicializacion falla!!");
       return;                                                                        // error SD Card.
   }
   Serial.println("OK - SD Card Inicializada...");
                                                                                        // check archivo //data/index.html
   if (!SD.exists("//data/index.html")) {
       Serial.println("ERROR - No encuentro index.html file!");
       return;                                                                        // no se encuentra archivo !!!...
   }
   Serial.println("OK ! - SD Card  index.html file.");                   // Archivo OK.

Tienes que leer las normas y no responder hilos de mas de 120 dias.
Ahora crea uno nuevo con tu inquietud porque este se cierra.
Normas del foro