Buenas, lo que quiero hacer es buscar dentro de un archivo de la targeta SD (Claves.txt) si esta la clave que tengo almacenada en una variable,
No se si me explico bien pero lo que tengo es una variable con un codigo (123456) y quiero ver si el codigo ese se encuentra dentro del archivo (Claves.txt) guardado dentro de la targeta SD, el archivo Claves.txt tendría un listado de claves (111111, 222222, 333333.....) y lo que quiero averiguar es si se encuentra la clave que tengo almacenada en una variable.
Hola de nuevo, el otro problema que tenia si que esta solucionado, este no se si lo as leido pero es otro caso y e provado varias maneras con la librería SD.h pero no consigo lo que quiero, y no encuentro lo que estoy buscando
Hola. No recuerdo exactamente el otro tema, aunque podrías haberlo reeditado y tendríamos accesible la "historia" de tu proyecto.
No indicas una cosa muy importante que sí recuerdo haberte dicho en la otra ocasión:
¿cómo has guardado los datos? ¿Texto o binario? ¿longitud fija o variable? ¿indexado o no indexado?
La rapidez de la búsqueda va a depender en gran medida de cómo esté organizado el archivo. En el peor de los casos tendrías que hacer una lectura secuencial del archivo completo, por lo que si es grande puede suponer un tiempo de espera largo.
Bueno en este caso es buscar en un archivo txt una clave numérica decimal, de longitud fija de unos 8 caracteres, la lista donde tengo que buscar si existe o no la clave sería de unas 10 claves.
La aplicación practica es que al leer una targeta RFID me busque en el archivo txt y si existe esa clave que se encienda un led verde y si no esta un led rojo.
No se si me explico bien pero lo que tengo es una variable con un código (123456) y quiero ver si el codigo ese se encuentra dentro del archivo (Claves.txt) guardado dentro de la targeta SD, el archivo Claves.txt tendría un listado de claves (111111, 222222, 333333.....) y lo que quiero averiguar es si se encuentra la clave que tengo almacenada en una variable.
Me parece que tienes que poner una clave por linea en el archivo de texto, así, creo yo es mas fácil leerlos
Antes de realizar ese sketch hay una pregunta más importante, ¿con cuántos registros vas a trabajar? a me dida que agregues más usuarios o contraseñas, más se demorará.
para hacer lo que quieres, creo que lo que debes hacer es almacenar una linea de la tarjeta y luego compararla con la otra. Una idea muy simple es algo como eso
while(sdFile.available()){ // recorre archivo en sd
c = sdFile.read(); //obtiene caracter desde archivo
while(c != '\n'){ // recorre archivo hasta encontrar un salto de linea
linea += c; //guarda linea en variable
c = sdFile.read(); //obtiene caracter desde archivo
}
if(linea == 'clave'){ //compara linea con la clave buscada
//acción al encontrar clave
break; // sale del while
}
}
Hola, mira este es el codigo que tengo hasta ahora y funciona bien, estoy probando con el que me puso gepd, y no consigo que me funcione.
#include <Wiegand.h> //incluimos la libreria para el lector
#include <SD.h> //incluimos la libreria para la Targeta SD
const int chipSelect = 4; //pin reservado para ethernet shield
WIEGAND wg;
long Tarjeta=0; //Variable donde se almacena el codigo leido
File dataFile;
int LedVerde=8; //Led Verde estara conectado a pin digital 8
int LedRojo=9; //Led Rojo estara conectado a pin digital 8
void setup() {
Serial.begin(9600); //iniciamos el puerto serie a 9600 baudios
wg.begin(); // iniciamos comunicacion con lector RFID
pinMode(53, OUTPUT); // Pin 53 lo definimos como salida aun que no lo usemos
pinMode(LedVerde, OUTPUT);//Led Verde lo definimos como salida
pinMode(LedRojo, OUTPUT);//Led Rojo lo definimos como salida
//Inicializamos la targeta SD
Serial.print("Inicializando Targeta SD...");
// Si hay targeta se inicializa
if (!SD.begin(chipSelect)) {
Serial.println("La targeta no esta o a fallado");
return;
}
Serial.println("Targeta inicializada.");
//abrimos el archivo Accesos.txt
dataFile = SD.open("Accesos.txt");
}
void loop() {
//Si se detecta alguna tarjeta, almacenamos en la variable Tarjeta el codigo leido
if(wg.available()){
Tarjeta=wg.getCode();
Serial.println(Tarjeta); //imprimimos por el puerto serie el codigo almacenado
}
}
en la parte del loop cuando me lee la targeta el lector RFID me la almacena en la variable Tarjeta y me lo muestra por el puerto serie, hasta ahi funciona perfectamente.
Ahora lo que quiero conseguir es que me busque en el archivo Accesos.txt (que consta de contraseñas una en cada linea) si la contraseña almacenada en la variable Tarjeta se encuentra en el archivo Accesos.txt, y si es asi que se encienda el led verde y si no esta se encienda el le rojo.
Eso es lo que tengo y lo que quiero conseguir. Las contraseñas son de 7 numeros decimales.
No probé el código pero debería ser algo como eso:
#include <Wiegand.h> //incluimos la libreria para el lector
#include <SD.h> //incluimos la libreria para la Targeta SD
const int chipSelect = 4; //pin reservado para ethernet shield
WIEGAND wg;
long Tarjeta=0; //Variable donde se almacena el codigo leido
char claveSD[8];
File dataFile;
int LedVerde=8; //Led Verde estara conectado a pin digital 8
int LedRojo=9; //Led Rojo estara conectado a pin digital 8
void setup() {
Serial.begin(9600); //iniciamos el puerto serie a 9600 baudios
wg.begin(); // iniciamos comunicacion con lector RFID
pinMode(53, OUTPUT); // Pin 53 lo definimos como salida aun que no lo usemos
pinMode(LedVerde, OUTPUT);//Led Verde lo definimos como salida
pinMode(LedRojo, OUTPUT);//Led Rojo lo definimos como salida
//Inicializamos la targeta SD
Serial.print("Inicializando Targeta SD...");
// Si hay targeta se inicializa
if (!SD.begin(chipSelect)) {
Serial.println("La targeta no esta o a fallado");
return;
}
Serial.println("Targeta inicializada.");
//abrimos el archivo Accesos.txt
dataFile = SD.open("Accesos.txt");
}
void loop() {
//Si se detecta alguna tarjeta, almacenamos en la variable Tarjeta el codigo leido
if(wg.available()){
Tarjeta=wg.getCode();
Serial.println(Tarjeta); //imprimimos por el puerto serie el codigo almacenado
}
if(datafile){ // reviso archivo sólo si está disponible
int i=0; // variable para almacenar linea en char array
while(datafile.available()){ // mientras no se haya leído todo el archivo
char c = datafile.read(); // extrae un caracter de la tarjeta
while(c != '\n'){ // mientras no encuentre un final de linea
claveSD[i] = c; // almacena cadena en un char array
i++;
}
claveSD[i] = '\0'; = '\0'; // termina char array con \0
if(atoi(claveSD) == Tarjeta){ // compara cadena encontrada con la de la tarjeta (atoi convierte array en integer)
Serial.println("clave válida"); // acción al encontrar clave
break; // sale del loop
}
i= 0; // reinicia variable cuando la linea encontrada no coincide
}
}
}
Lo e probado tal y como me pones y se me queda colgado, por el puerto serie me impreme inicializando tarjeta S y no me termine ni la frase, se queda asi y no hace nada mas.
no se si el archivo de la targeta SD lo tengo bien creado, ahora mismo lo tengo asi:
El ejemplo me funciona bien, uso un arduino mega y una ethernet shield mega compatible.
el codigo que e cargado es este.
#include <Wiegand.h> //incluimos la libreria para el lector
#include <SD.h> //incluimos la libreria para la Targeta SD
#include <SPI.h>
const int chipSelect = 4; //pin reservado para ethernet shield
WIEGAND wg;
long Tarjeta=0; //Variable donde se almacena el codigo leido
File dataFile;
char claveSD[8];
int LedVerde=8; //Led Verde estara conectado a pin digital 8
int LedRojo=9; //Led Rojo estara conectado a pin digital 8
void setup() {
Serial.begin(9600); //iniciamos el puerto serie a 9600 baudios
wg.begin(); // iniciamos comunicacion con lector RFID
pinMode(chipSelect, OUTPUT);
pinMode(53, OUTPUT); // Pin 53 lo definimos como salida aun que no lo usemos
pinMode(LedVerde, OUTPUT);//Led Verde lo definimos como salida
pinMode(LedRojo, OUTPUT);//Led Rojo lo definimos como salida
//Inicializamos la targeta SD
Serial.print("Inicializando Targeta SD...");
// Si hay targeta se inicializa
if (!SD.begin(chipSelect)) {
Serial.println("La targeta no esta o a fallado");
return;
}
Serial.println("Targeta inicializada.");
//abrimos el archivo Accesos.txt
dataFile = SD.open("Accesos.txt");
}
void loop() {
//Si se detecta alguna tarjeta, almacenamos en la variable Tarjeta el codigo leido
if(wg.available()){
Tarjeta=wg.getCode();
Serial.println(Tarjeta); //imprimimos por el puerto serie el codigo almacenado
}
if(dataFile){ // reviso archivo sólo si está disponible
int i=0; // variable para almacenar linea en char array
while(dataFile.available()){ // mientras no se haya leído todo el archivo
char c = dataFile.read(); // extrae un caracter de la tarjeta
while(c != '\n'){ // mientras no encuentre un final de linea
claveSD[i] = c; // almacena cadena en un char array
i++;
}
claveSD[i] = '\0'; // termina char array con \0
if(atoi(claveSD) == Tarjeta){ // compara cadena encontrada con la de la tarjeta (atoi convierte array en integer)
digitalWrite(LedVerde,HIGH);
Serial.println("clave válida"); // acción al encontrar clave
break; // sale del loop
}
digitalWrite(LedRojo,HIGH);
i= 0; // reinicia variable cuando la linea encontrada no coincide
}
}
}
y nose porque se me queda colgado en el setup y no me termina de escribir lo de inicializar tarjeta
voy a explicarme de nievo por que no se si lo entendistes bien.
yo tengo un archivo .txt cullo contenido es:
7896543
6786542
Vale, entonces yo cuando ponga una tarjeta magnetica en el RFID la lea y me la guarde en una variable, me guardara por ejemplo 6786542.
ahora lo que quiero y no consigo es: leer la primera linea de el archivo .txt que seria 7896543 y compararla con la leida por el RFID, si son iguales se enciende un led verde, si no lo son pues que siga leyendo la siguiente linea del archivo .txt que seria 6786542 y me la vuelva a comparar, si es igual(en este caso seria igual) se enciendo un led verde, si no fuera igual como no quedan mas claves en el archivo pues se encenderia un led rojo y volveria a estado de espera.
hice una prueba rápida y ese ejemplo está funcionando, busca una cadena en un archivo en la SD y lo compara con otro, como no tengo un lector de tarjeta no hice lo otro, pero ya está funcionando:
#include <SD.h>
File myFile;
char claveSD[7];
int index = 0;
void setup(){
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.print("Initializing SD card...");
pinMode(10, OUTPUT);
digitalWrite(10, HIGH);
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
}
void loop(){
if(true){
myFile = SD.open("claves.txt");
if (myFile) {
while (myFile.available()) {
char c = myFile.read();
while(c != '\n'){
claveSD[index] = c;
c = myFile.read();
index++;
}
claveSD[index] = '\0';
if(strstr(claveSD,"1234567")){
Serial.println("encontrado");
while(true); // loop infinito cuando encuentra clave (solo para debug)
}
index = 0;
}
myFile.close();
} else {
Serial.println("error al abrir archivo");
}
}
}