Hola amigos!!!
como puedo controlar el tiempo de llamada saliente de la shield gsm con arduino UNO !! me explico: general mente en el monitor serial tengo todas las respuestas si al número marcado esta ocupado "BUSY" si no responde o esta apagado, y según eso puedo hacer una acción de respuesta,, pero aquí esta el pero: cuando la llamada se ha efectuado con éxito no tengo respuesta rápida de que hay conexiónen el monitor serial para yo poder decir al shield "muy bien la llamada se ha realizado y ahora espera 5 segundos y luego cuelga"
en general como puedo limitar el tiempo de llamada??
cualquier consejo muchas gracias!!
haz un contador desde que llamas y cuando pase un cierto segundos cuelgas co el comando ATH(calgar la llamada)
Podrías postear el código del programa? Es que necesito saber cómo el Arduino se da cuenta de que está en plena llamada saliente...
Es que ese es el punto es extraño porque cuando se marca un numero y este esta ocupado enseguida tengo una respuesta de "BUSY" y yo puedo responder con cualquier otro comentado como ATDL por ejemplo!! pero cuando se establece una llamada no tengo ninguna respuesta es como que el proceso se parara hasta que la otra persona cuelgue ahi obtengo un "OK" que hizo conexión seguido de un "NO CARRIER" que es cuando colgó la otra parte!!!! y respondiendo tu pregunta el arduino no se da cuenta hasta que la llamada haya finalizado y ahi recibo un OK que es de la conexión de la llamada!
Bueno pero con todas esas respuestas puedes resolver que hacer.
Esperas la respuesta BUSY,OK o NO CARRIER y tienes acciones claras. Pero cuando estableces la llamada arrancas un timer y cortas por timeout.
No sabes hacerlo?
Bueno por timeout sinceramente no se hacerlo pero lo voy a investigar!! pero otra ves me parece que vuelvo al problema no se cuando se establece la llamada incluso no puedo hacer nada hasta que cuelgue la otra parte , es como hacer un delay de X segundo que primero tengo que esperar ese tiempo para después hacer otro proceso !
javierfer:
y respondiendo tu pregunta el arduino no se da cuenta hasta que la llamada haya finalizado y ahi recibo un OK que es de la conexión de la llamada!
Algún comando que devuelva el estado del módulo?
Algo así que le diga al Arduino que está "en espera", "en plena llamada", "intentando enviar SMS", etc.
Este es mi codigo como pueden ver si el modem gsm recibe de respuesta un BUSY tiene hacer un ATDL y esto todo funciona pero ahora lo que necesito es que cuando se establezca la comunicación pueda colgarlo despues de 2 o 3 segundos!
#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(2, 3);
String inGSM;
int btnPin = 12;
int robo = 10;
boolean prevBtn = HIGH;
boolean prevBtn1 = LOW;
boolean roboin = HIGH;
double ttl=0; //Tiempo de vida
void setup()
{
gprsSerial.begin(9600);
Serial.begin(9600);
initGSM();
}
void loop()
{
inGSM="";
ttl++;
while (gprsSerial.available()>0){
delay(10);
inGSM += (char)gprsSerial.read();
}
Serial.print(inGSM);
boolean currBtn = digitalRead(btnPin);
if (prevBtn != currBtn && currBtn == LOW) {
gprsSerial.println("ATD+xxxxxxx;");
}
prevBtn = currBtn;
boolean currBtn1 = digitalRead(btnPin);
if (prevBtn1 != currBtn1 && currBtn1 == HIGH) {
gprsSerial.println("ATD+xxxxxx;");
}
prevBtn1 = currBtn1;
boolean robobolean = digitalRead(robo);
if (roboin != robobolean && robobolean == LOW) {
gprsSerial.println("ATD+xxxxxx;");
delay(30000);
}
roboin = robobolean;
if (inGSM.indexOf("BUSY")>-1){
delay(1000);
gprsSerial.print("ATDL\r\n");
delay(1000);
}
if (inGSM.indexOf("CREG:")>-1 && inGSM.indexOf("CREG: 0,1")==-1){
Serial.println("Se ha perdido la cobertura, reiniciando...");
gprsSerial.print("AT+CFUN=1,1\r\n");
delay(4000);
initGSM();
}
//Comprobar estado de la red
if (ttl==150000){
gprsSerial.print("AT+CREG?\r\n");
ttl=0;
}
}
void initGSM(){
Serial.println("Iniciando...");
delay(1000);
gprsSerial.print("AT+COPS=?\r\n"); //Activar alarma llamada
delay(500);
}
lucario448 si tienes razón hay un comando de identificación de linea conectada que es AT+COLP (Connected Line Identification Presentation) en respuesta en el monitor serial recibo en el momento que se conecta esto: +COLP: "+XXXXXX",145,"",0,"" donde XXXXX es mi numero de teléfono ahora como puedo escribir el código para cuando reciba el +COLP: "+XXXXXX",145,"",0,"" cuelgue después de 3 segundos algo asi:
if (inGSM.indexOf("COLP: "+XXXXXX",145,"",0,")-1){
delay(3000);
gprsSerial.print("AT+ATH\r\n");
}
Estaría Bien??
javierfer:
lucario448 si tienes razón hay un comando de identificación de linea conectada que es AT+COLP (Connected Line Identification Presentation) en respuesta en el monitor serial recibo en el momento que se conecta esto: +COLP: "+XXXXXX",145,"",0,"" donde XXXXX es mi numero de teléfono ahora como puedo escribir el código para cuando reciba el +COLP: "+XXXXXX",145,"",0,"" cuelgue después de 3 segundos algo asi:
if (inGSM.indexOf("COLP: "+XXXXXX",145,"",0,")-1){
delay(3000);
gprsSerial.print("AT+ATH\r\n");
}
Estaría Bien??
Usando delay? Seguro que durante el tiempo de espera no querrás que se haga nada más?
Y otra cosa, ese número de teléfono que dices, es del módulo o de quién llama? Poner un número como "constante" no es buena idea (a menos que sea el del módulo en sí).
En su lugar, más bien quiero saber qué devuelve ese comando cuando está en plena llamada; y qué devuelve cuando está en espera.
Yo no se porque no investigaste las Librerías como GSM.h.
Estuve viendo que tienen todo tipo de respuesta de las informaciones que el módulo entrega.
Todo lo que estas relatando esta ahi contemplado.
Aca tienes la librería GSM_GPRS Library y mira en especial los carteles
y acá GSM.h podrás ver toda la seríe de etiquetas disponibles que te informan del estado del módulo.
Muchas gracias chicos por su tiempo bueno he logrado hacer, lo que esta buscando pero como pasa en la vida después de un obstáculo viene otro!!
bueno lo solucione con la busque del (COLP) es decir que cuando hay conexión aparece el +COLP: "+XXXXXX",145,"",0,"" y yo solo busco es "COLP" y luego hago el comando ATH y todo bien
Ahora como pueden ver en mi código tengo dos entradas que cuando la una sea negativa me llame a un numero de teléfono y si se hace positiva llama a otro numero y la segunda entrada solo llama a un numero cuando solo es negativa!!
pues bien ahora por ejemplo si la segunda entrada se hace negativa y procede a realizar la llamada y después de tres segundos la primera entrada cambia de estado y también quiere realizar una llamada, esta se pierde porque todavía la primera llamada no ha terminado !!
En fin como puedo hacer que al realizar una llamada y si hay que hacer una segunda lo hagan si que se pierda la ultima!
no se si me esplique bien!
Entonces alguna idea de como puedo hacer una llamada tras otra sin que se pierda ninguna llamada?
javierfer:
Entonces alguna idea de como puedo hacer una llamada tras otra sin que se pierda ninguna llamada?
Es posible? Yo pensé que solo era posible una llamada por terminal...
Bueno yo igual no se si sera posible que cuando se realice una llamada y si se necesita hacer en ese mismo tiempo otra llamada, la segunda pueda esperar hasta que termina la primera y después la otra!
Arma un registro de llamadas pendientes o cola de espera.
Si el sistema esta ocupado la llamada queda en cola de espera y cuando se libera si la cola es distinto de 0 es porque tienes una llamada pendiente, entonces ejecutas con el número que corresponda.
tal vez requiera ajustes, es algo que hice al vuelo.
#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(2, 3);
String inGSM;
int btnPin = 12;
int robo = 10;
boolean prevBtn = HIGH;
boolean prevBtn1 = LOW;
boolean roboin = HIGH;
double ttl=0; //Tiempo de vida
void setup() {
gprsSerial.begin(9600);
Serial.begin(9600);
initGSM();
}
void loop() {
inGSM="";
ttl++;
while (gprsSerial.available() > 0){
delay(10);
inGSM += (char)gprsSerial.read();
}
Serial.print(inGSM);
boolean currBtn = digitalRead(btnPin);
if (prevBtn != currBtn && currBtn == LOW) {
if (ocupado)
cola = 1;
else
gprsSerial.println("ATD+xxxxxx1;");
}
prevBtn = currBtn;
boolean currBtn1 = digitalRead(btnPin);
if (prevBtn1 != currBtn1 && currBtn1 == HIGH) {
if (ocupado)
cola = 2;
else
gprsSerial.println("ATD+xxxxxx2;");
}
prevBtn1 = currBtn1;
boolean robobolean = digitalRead(robo);
if (roboin != robobolean && robobolean == LOW) {
gprsSerial.println("ATD+xxxxxx;");
delay(30000);
}
roboin = robobolean;
if (inGSM.indexOf("BUSY")>-1){
ocupado = true;
delay(1000);
gprsSerial.print("ATDLrn");
delay(1000);
}
else {
// no se si esto es correcto
ocupado = false;
// disco telefono en cola si lo hay
if (cola != 0) {
if (cola == 1)
gprsSerial.println("ATD+xxxxxx1;");
else
gprsSerial.println("ATD+xxxxxx2;");
delay(30000);
cola = 0;
}
}
if (inGSM.indexOf("CREG:")>-1 && inGSM.indexOf("CREG: 0,1")==-1){
Serial.println("Se ha perdido la cobertura, reiniciando...");
gprsSerial.print("AT+CFUN=1,1rn");
delay(4000);
initGSM();
}
//Comprobar estado de la red
if (ttl==150000){
gprsSerial.print("AT+CREG?rn");
ttl=0;
}
}
void initGSM(){
Serial.println("Iniciando...");
delay(1000);
gprsSerial.print("AT+COPS=?rn"); //Activar alarma llamada
delay(500);
}
NOTA: de paso esta es la manera que debiste prsentar tu código en el post que Hector te lo pidió y lo pasaste por alto.
Presta mas atención a las recomendaciones de los Administradores. es para que todo luzca mas ordenado.
Gracias surbyte
referente al código que me enviaste "ocupado" hay que declararlo como una función al principio verdad porque en el momento de la compilación me aparece como "ocupado" was not declared in this scope y lo mismo me parece con lo que se refiere a "cola"
por cierto abajo en el codigo esta gprsSerial.print("AT+COPS=?rn"); //Activar alarma llamada pero en los comandos AT COPS describe que es selección de operador (Operator selection)
Si.. ponlo como bool.
Te dije que lo hice al vuelo. Mira a ver si puede funcionar la idea.