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:
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?
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();
}
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?
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:
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...
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?
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.
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?