SIM900 Leer datos de sd y compararlo con cadena

Saludos tengo un problema que no he logrado solucionar, tengo un modulo sim900 que funciona bien recibe llamadas y mensajes y puedo verlos desde el monitor, tambien lee el numero que esta llamando, el problema esta en que tengo una SD con datos dentro de un archivo y no encuentro como compararlo con el numero que llama para darle acceso o no a unos relay que he conectado. tengo la funcion inicializaSD que busca un numero en el archivo y si esta imprime Match pero no encuentro como unirla para comparar los numeros.

#include <Separador.h>
#include <SoftwareSerial.h>
#include <SD.h>

SoftwareSerial SIM900(10, 9);
File myFile;
String quienLlama;
char buf[13];
const int chipSelect = 2;
Separador s;
char incoming_char = 0; //Variable que guarda los caracteres que envia el SIM900
String mensaje = "";
bool estado = false ;  //Variable para guardar el estado del LED

void setup()
{    

  inicializaSIM900();

}

void loop()
  {
 quienLlama = "";
  
   while (SIM900.available()>0){
      delay(10);
      quienLlama += (char)SIM900.read(); 
   }
  
   Serial.print(quienLlama);
 
   if (quienLlama.indexOf("RING")>-1){
      delay(1000);
      String num;
      int inicio=quienLlama.indexOf('"')+1;
      int fin=inicio+11;
      num=quienLlama.substring(inicio,fin);
      
      if (num=="04263333333"){
         Serial.print("NUMERO ACERTADO");
      }else{
         Serial.print("NUMERO ERRONEO");
      }
  } 
  
  }
void inicializaSD()
{
  //Serial.begin(19200);
  pinMode(2, OUTPUT);
   
  // Si ha habido error al leer la tarjeta informamos por el puerto serie.
  if (!SD.begin(chipSelect)){
    Serial.println("Error al leer la tarjeta.");
    return;
  } 
  Serial.println("inicializacion exitosa");
 
  myFile = SD.open("claves.txt");//abrimos  el archivo 
  if (myFile) {
    Serial.println("telefonos.txt:");
      while (myFile.available()) {
             myFile.read(buf,11);        
             if(strncmp(buf,"04263333333",11)==0)
             {
                 Serial.println("Match!");       
             }
         }
         // close the file:
         myFile.close();
       } else {
        // if the file didn't open, print an error:
         Serial.println("error opening test.txt");
       }
}

void inicializaSIM900()
{
 SIM900.begin(19200); //Configura velocidad del puerto serie para el SIM900
 Serial.begin(19200); //Configura velocidad del puerto serie del Arduino
 Serial.println("OK");
 delay (1000);
 //SIM900.println("AT + CPIN = \"\""); //Comando AT para introducir el PIN de la tarjeta
 //delay(25000); //Tiempo para que encuentre una RED
 //Serial.println("PIN OK");
 SIM900.print("AT+CLIP=1\r"); // Activa la identificación de llamada
 delay(100);
 SIM900.print("AT+CMGF=1\r"); //Configura el modo texto para enviar o recibir mensajes
 delay(1000);
 SIM900.print("AT+CNMI=2,2,0,0,0\r"); // Saca el contenido del SMS por el puerto serie del GPRS
 delay(1000);
}

Dos preguntas:

  • ¿Puedo ver el contenido de ese archivo?
  • Comparas con una constante, ¿no se suponía que debe comparar el número entrante?

Lucario448:
Dos preguntas:

  • ¿Puedo ver el contenido de ese archivo?
  • Comparas con una constante, ¿no se suponía que debe comparar el número entrante?

Si con la funcion inicializaSD se puede ver el contenido del archivo y en el loop esta la variable num la cual quiero comparar con los numeros guardados en el archivo claves.txt

inicializaSD de momento no hace absolutamente; nadie lo llama.

Creo que este problema le había visto varias veces, el de comparar cadenas de caracteres con ==. Lo correcto sería con strcmp o String.equals.
Ya que usas el objeto String, entonces sería:

if (num.equals("04263333333"))

Lucario448:
inicializaSD de momento no hace absolutamente; nadie lo llama.

Creo que este problema le había visto varias veces, el de comparar cadenas de caracteres con ==. Lo correcto sería con strcmp o String.equals.
Ya que usas el objeto String, entonces sería:

if (num.equals("04263333333"))

Discrepo un poco. Es cierto que comparar con el operador == da problemas pero claro es que estás comparando un entero con un string... Pero si conviertes el tipo de variable no necesitas usar otra función (que vienen a realizar dicha conversión realmente).

Por ejemplo esto es diferente en lenguajes como php donde está el operador == y el operador === (que viene a ser el que equivale a C) y comprueba también el tipo de variable.

En definitiva no necesitas usar funciones nativas para convertir y comparar, basta con cambiar el tipo de variable. De todas formas así se muestra otra forma de hacerlo.

void setup() {
  Serial.begin(9600);
  String cadena = "123";
  int numero    = 123;
 
  if(cadena == numero){ //ESTO ES INCORRECTO COMPARAS UN INT CON UN STRING, OBVIO DARÁ FALSE
    Serial.println("comparacion 1 valida");
  }
  if(cadena == (String)numero){ // ESTO ES CORRECTO
    Serial.println("comparacion 2 valida");
  }
  if(cadena.toInt() == numero){ //ESTO ES CORRECTO TAMBIÉN
    Serial.println("comparacion 3 valida");
  }  
}

void loop() {
  // put your main code here, to run repeatedly:
}
#include <Separador.h>
#include <SoftwareSerial.h>
#include <SD.h>

SoftwareSerial SIM900(10, 9);
File myFile;
String num;
String quienLlama;
char buf[13];
const int chipSelect = 2;
Separador s;
char incoming_char = 0; //Variable que guarda los caracteres que envia el SIM900
String mensaje = "";
bool estado = false ;  //Variable para guardar el estado del LED

void setup()
{    

  inicializaSIM900();

}

void loop()
  {
 quienLlama = "";
  
   while (SIM900.available()>0){
      delay(10);
      quienLlama += (char)SIM900.read(); 
   }
  
   Serial.print(quienLlama);
 
   if (quienLlama.indexOf("RING")>-1){
      delay(1000);
      
      int inicio=quienLlama.indexOf('"')+1;
      int fin=inicio+11;
      num=quienLlama.substring(inicio,fin);

      inicializaSD;
  } 
  
  }
void inicializaSD()
{
  //Serial.begin(19200);
  pinMode(2, OUTPUT);
   
  // Si ha habido error al leer la tarjeta informamos por el puerto serie.
  if (!SD.begin(chipSelect)){
    Serial.println("Error al leer la tarjeta.");
    return;
  } 
  Serial.println("inicializacion exitosa");
 
  myFile = SD.open("claves.txt");//abrimos  el archivo 
  if (myFile) {
    Serial.println("telefonos.txt:");
      while (myFile.available()) {
             myFile.read(buf,13);        
             if(strncmp(buf,num,11)==0)
             {
                 Serial.println("Match!");       
             }
         }
         // close the file:
         myFile.close();
       } else {
        // if the file didn't open, print an error:
         Serial.println("error opening test.txt");
       }
}

void inicializaSIM900()
{
 SIM900.begin(19200); //Configura velocidad del puerto serie para el SIM900
 Serial.begin(19200); //Configura velocidad del puerto serie del Arduino
 Serial.println("OK");
 delay (1000);
 //SIM900.println("AT + CPIN = \"\""); //Comando AT para introducir el PIN de la tarjeta
 //delay(25000); //Tiempo para que encuentre una RED
 //Serial.println("PIN OK");
 SIM900.print("AT+CLIP=1\r"); // Activa la identificación de llamada
 delay(100);
 SIM900.print("AT+CMGF=1\r"); //Configura el modo texto para enviar o recibir mensajes
 delay(1000);
 SIM900.print("AT+CNMI=2,2,0,0,0\r"); // Saca el contenido del SMS por el puerto serie del GPRS
 delay(1000);
}

Este es el código llamando a la función inicializaSD después de haber guardado el numero telefónico en la variable “num” cuando va a hacer la comparación con el archivo sd me da el siguiente error:
cannot convert ‘String’ to ‘const char*’

En vez de volver a copiarnos tu código sería mejor si dijeses el número de la línea donde marca el error.
En todo caso es porque estás usando una función que está pidiendo un char y le estás pasando un String.

Bueno no es precisamente este le mejor (Nuevo Proyecto Discriminador llamadas telefónicas) porque recuerdo uno mas completo pero servirá de guia.

Mismo autor tal vez mejorado Desesperado con programa

Vaya uno a encontrarlo con ese título!!