Uso de funciones de librerias

Hola a todos, quería consultarles como debo usar una función que trae la librería que uso para poder agregar a mi código?
la librería que uso es Sim800L_Library_Revised ( written by Vittorio Esposito )
tiene una función para saber quien llama en el SIM800L.h:

void callNumber(char* number); 

en el SIM800L.cpp:

void  Sim800L::callNumber(char* number)
{
    this->SoftwareSerial::print (F("ATD"));
    this->SoftwareSerial::print (number);
    this->SoftwareSerial::print (F(";\r\n"));
}

como debo llamar a esa función en mi código?

1 Like

Hola, ya solucione la parte de callNumber, el readme dice:

callNumber(number)|None|

ya me da la variable que tengo que declarar que seria number ( como char*), el problema que tengo primero que detectar la llamada entrante, que seria con

getCallStatus()|uint8_t|Return the call status, 0=ready,2=Unknown(),3=Ringing,4=Call in progress
``
ahí se me quemaron un poco los papeles, no se como debo de configurarla la función para que detecte la llamada, y pueda supongo después la otra función guarde el numero del que llama...
alguien podrá tirarme alguna idea?

Lo que pongo en el loop es:

  //Lee el status de la llamada
  Call = Sim800l.getCallStatus();
  Serial.println(Call);

y de acuerdo a:

status, 0=ready,2=Unknown(),3=Ringing,4=Call in progress

efectivamente tengo un 0 en el monitor y cuando llamo un 3.. ahora cuando quiero trabajar con ese dato:

if (Call == "3") {

no hace nada, no lo reconoce...que estoy haciendo mal?

Un problema es la función:

uint8_t Sim800l::getCallStatus(){
/*
  values of return:
 
 0 Ready (MT allows commands from TA/TE)
 2 Unknown (MT is not guaranteed to respond to tructions)
 3 Ringing (MT is ready for commands from TA/TE, but the ringer is active)
 4 Call in progress

*/
  SIM.print (F("AT+CPAS\r\n"));
  _buffer=_readSerial();  
  return _buffer.substring(_buffer.indexOf("+CPAS: ")+7,_buffer.indexOf("+CPAS: ")+9).toInt();

}

es un dato uint8_t, entonces no puedo usar indexof

if (textSms.indexOf("3"){

por ejemplo...no se, algo debo estar haciendo mal a parte de la conversión.. tal vez la comparación tmb esta mal...

Pero ahi te dice que la función devuelve uint8_t o sea te dice 0, 1, 2, 3 o 4 como resultado de la comunicación.

En la parte anterior de tu pregunta tu supones que el resultado es "3" y en cambio es un numero 3 simple. El problema es que Call no se si es un String en cuyo caso no sirve para compararlo.

Este

if (Call == "3") {

Obviamente no va.
si Call fuera entero o un uint8_t o sea un unsigned char no tendrías problemas.

Hola Surbyte gracias por tu respuesta, lo configure asi:

uint8_t Call = "";

y si aparece en monitor con:

Serial.println(Call);

cuando no recibe llamadas aparece 0 y cuando recibe 3...
pero al comparar no funciona:

void Llamadas() {
    //Verifico que la llamad sea codigo 3 ("Ringing")
    if (Call > 0) {
    Sim800l.callNumber(number);
    Serial.println(number);

    if (number == parametros.NumCorrecto)
    {
      Sim800l.hangoffCall();
      digitalWrite(LED1, 0);
      text = "\nSirena encendida.";
      Msj = Sim800l.sendSms(numberSms.c_str(),text);
      Msj = Sim800l.delAllSms(); //Apaga SMS
    }
  }
``
ese es el código para comparar y poder encender la sirena...`

Creo que no miras lo mas obvio y luego te pierdes con los Strings una y otra vez.
Observa esto

uint8_t Sim800L::getCallStatus()
{
    /*
      values of return:

     0 Ready (MT allows commands from TA/TE)
     2 Unknown (MT is not guaranteed to respond to tructions)
     3 Ringing (MT is ready for commands from TA/TE, but the ringer is active)
     4 Call in progress

    */
    this->SoftwareSerial::print (F("AT+CPAS\r\n"));
    _buffer=_readSerial();
    return _buffer.substring(_buffer.indexOf("+CPAS: ")+7,_buffer.indexOf("+CPAS: ")+9).toInt();

}

Extraigo el return para su análisis.

return _buffer.substring(_buffer.indexOf("+CPAS: ")+7,_buffer.indexOf("+CPAS: ")+9).toInt();

Y al final del String que tienes, un toInt() o sea.. el número devuelto es un entero, pero como va de 0 a 4, suficiente con uint8_t
Ahora porque defines o mejor dicho porque asignas de este modo?

uint8_t Call = "";

coloca un simple

uint8_t Call = 0;

A ver si ahora lo puedes orientar.

Genial Surbyte anda perfecto, de la otra manera anda pero se activa siempre porque al ser nada "" la placa tiene 4 opciones, la de standby es 0, y si pongo que > 0 la activa...(lo escribí básicamente para mi la explicación jaja uds obvio que saben el porque)..
pero la función que no me funciona es la de identificar el numero, así esta en la librería:

void  Sim800l::callNumber(char* number){
  SIM.print (F("ATD"));
  SIM.print (number);
  SIM.print(F(";\r\n"));
}

lo que hice fue crear un char de nombre number como creo me sugiere la función, y en mi código la llamo, como puse en el msj anterior, asi:

Sim800l.callNumber(number);
Serial.println(number); 

lo imprimo para ver si lo guarda pero no, escribe en blanco en monitor...estoy haciendo algo mal con la variable o es otro problema? la idea es que solo el numero autorizado lo pueda activar, ya que sino podría activarse ante cualquier llamada...

Esa función es para hacer una llamada, no devuelve el caller-id.

ATD es el comando para discar (marcar).

Saludos

Hola gatul, es correcto, mis disculpas recién caigo en el error jamás iba a funcionar, el código debería ser +CLIP..
como puedo agregarlo a la Liberia para usarlo y poder identificar la llamada?

Ahí ya no te puedo ayudar.

define el número asi

char telefono[] = "1147879565";

Surbyte y no podria hacer algo asi:

void  Sim800l::callID(char* numberID){
  SIM.print (F("ATCLIP"));
  SIM.print (numberID);
  SIM.print(F(";\r\n"));
}

para agregar en la librería? no entiendo la ultima instrucción SIM.print(F(";\r\n")); el punto y coma...

ya esta, puedo leer lo que manda la placa que es le ring y el mensaje con el numero:


y capturo el num con:

    String serial = Sim800l._readSerial();
    Serial.println(serial);

    String char13 = serial;
    uint8_t startPos, endPos;
    startPos = char13.indexOf("\"") + 1;
    endPos = char13.indexOf("\"", startPos);
    IDcall = char13.substring(startPos, endPos);
    Serial.println(IDcall);

son importantes las librerias, casi tienen todo resuelto por uno,
con esa funcion Sim800l._readSerial() se podria capturar cualquier cosa que la placa devuelva?

Eso es simplemente como si hiceras un Serial.print()
El F es porque el contenido entre comillas esta en la flash y no ocupa memoria.
y lo que envia son ; y luego carriage return CR y line feed LF.
Es lo mismo cuando uno escribe un dato en el monitor serie y le da ENTER.

Ahh ok ok, y con el comando Sim800l._readSerial() que esta en el cpp:

String Sim800l::_readSerial(){
  _timeout=0;
  while  (!SIM.available() && _timeout < 12000  ) 
  {
    delay(13);
    _timeout++;
  }
  if (SIM.available()) {
 	return SIM.readString();
  }
}

que significa, que durante 12 seg va a capturar todo lo que salga de la SIM?

Exacto, pero en realidad le da un máximo de 12 segundos a algo que tu previamente le has enviado. O sea, la respuesta a un comando tienen un timeout de 12 seg.

Surbyte esa iba a ser mi próxima pregunta jaja, o sea la respuesta de ¿cualquier comando? la puedo capturar con esa función...
supongo que 12 seg en un montón para casi cualquier comando...

edito:
para pasarlo a una variable lo que sea que responda la sim con esto estaría bien?

String variable = Sim800l._readSerial() ;

o debo usar otro tipo de dato?

Si, esta bien. La clase String te da la posibilidad de transformar las cosas a lo que gustes. Puedes salir a int, float, caracteres, lo que quieres.