[SOLUCIONADO]Comparar un variable con un código guardado en la tarjeta SD

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.

Gracias por la atencion, espero su ayuda.

Un saludo.

Perono lo habiamos visto eso ya?
Noter te habia dado algunas muy buenas soluicones.

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.

al menos busca la cita anterior

Perdonar no he caido en seguir en el otro pos.

El otro post era que no conseguía comunicar un lector RFID con el arduino el link al otro post es este: [SOLUCIONADO]Necesito ayuda con el protocolo de comunicación lector RFID - Hardware - Arduino Forum

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.

¿Qué programa tienes actualmente y qué te está fallando?

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

Gracias por la contestacion, tiene buena pinta pero al compilarlo me da el siguiente error: incompatible types in assignment of 'char' to 'char [8]'

y no lo entiendo por no estar muy familiarizado con variables char.

que tengo que hacer para solucionarlo?

¿no te aparece la linea del error?
copia el error tal cual te aparece, a simple vista no lo veo.

esto es lo que me sale.

sketch_dec14b.ino: In function 'void loop()':
sketch_dec14b:54: error: incompatible types in assignment of 'char' to 'char [8]'

me marca la linea donde pone:

claveSD = '\0'; // termina char array con \0

ok he modificado el código que dejé más arriba, se me ha escapado un detalle, esa linea debería haber sido

claveSD[i] = '\0';

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:

1234567
1234567

son dos clabes distintas.

si pruebas el ejemplo readWrite de la librería SD ¿te funciona? ¿qué Arduino estás usando?

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