Moduli gsm

io l'ho impostato cosi

  case CALL_INCOM_VOICE:
    gsm.CallStatusWithAuth(number_incoming,0,0);

se ho letto bene la funzione server per

verifica lo stato delle chiamate (in entrata o in corso) e autorizza le posizioni di SIM;

L'ho inserito anche prima del controllo switch (call) , ma mi resttuisce vuoto, nel caso di numero presente in rubrica.

il setup iniziale è questo.

 gsm.TurnOn(9600);          //module power on
  gsm.InitParam(PARAM_SET_1);//configure the module  
  gsm.Echo(0);

Ciao

Ok allora vedendo meglio la libreria con la funzione:
CallStatus
torna se c'è una chiamata in arrivo o attiva o nessuna ma senza che nella stringa di risposta ci sia il numero chiamante
Per la funzione :
CallStatusWithAuth
invece ritorna anche il numero ma solo se autorizzato (da quello che ho visto).
Utilizza la funzione che ti ho postato e sei ok. Se fai la CallStatusWithAuth senza che non ci siano chiamate in arrivo è ovvio che restituisca vuoto.

si grazie .. la tua funzione "funziona", pero volevo utilizzare la rubrica per la verifica di un numero autenticato,
ma una volta memorizzato il numero , non riconosce la chiamata , lo stato è sempre "no call" , appena cancello il numero dalla rubrica la chiamata viene riconosciuta.

Grazie..

Se hai il numero salvato in rubrica allora devi cambiare gli indici di:
gsm.CallStatusWithAuth(number_incoming,0,0);
cioè modificare gli 0 e mettere l'indirizzo di rubrica di partenza e quello di fine in modo che la libreria cerchi il numero in questo intervallo.

Salve ragazzi, ho da poco acquistato lo shield da futuraelettronica e devo dire che va benissimo. Ho scritto qualche altra funzione ma adesso vorrei interrogare il modulo con altri comandi AT. Stavo provando ad esempio con il comando AT+COPS=? per leggere il nome della rete e quindi stavo cercando di implementare tale funzione direttamente nella libreria e più precisamente nel file GSM_Shield.cpp e qui iniziano i problemi!!!
Invio il comando con il comando seguente
mySerial.print("AT+COPS=?");
ma poi non riesco a leggere la risposta.
Qualche dritta?

ypkdani:
Se hai il numero salvato in rubrica allora devi cambiare gli indici di:
gsm.CallStatusWithAuth(number_incoming,0,0);
cioè modificare gli 0 e mettere l'indirizzo di rubrica di partenza e quello di fine in modo che la libreria cerchi il numero in questo intervallo.

Ho smatettato un po, per far riconoscere un numero inserito in rubrica occorre utilizzare

gsm.CallStatusWithAuth(number_incoming,1,3);

che controlla a partire dalla posizione 1 per 3 celle

Ma le funzioni

gsm.CallStatus();

e

gsm.CallStatusWithAuth(number_incoming,1,3)

sono indipendenti cioè se chiamo con un numero in rubrica, questo viene riconosciuto solo dalla funzione

gsm.CallStatusWithAuth

ma non dalla

gsm.CallStatus();

naturalmente se il numero non è in rubrica succede il contrario.

Scusa ma gsm.CallStatus(); ti restituisce solo se c'è una chiamata in arrivo o una attiva o niente mentre gsm.CallStatusWithAuth(number_incoming,0,0); ritorna il numero del chiamante. Se vuoi vedere se il numero è in memoria allora (come hai fatto) cambi gli indici 0,0.
Riassumendo se vuoi che tu veda solo numeri in memoria allora metti gli indici tra cui cercare mentre se vuoi accettare tutti i numeri metti 0,0. Forse pero un motivo per cui non ti identifica il chiamante potrebbe essere che il numero salvato non ha il +39 iniziale. Prova a vedere

ypkdani:
Scusa ma gsm.CallStatus(); ti restituisce solo se c'è una chiamata in arrivo o una attiva o niente mentre gsm.CallStatusWithAuth(number_incoming,0,0); ritorna il numero del chiamante. Se vuoi vedere se il numero è in memoria allora (come hai fatto) cambi gli indici 0,0.
Riassumendo se vuoi che tu veda solo numeri in memoria allora metti gli indici tra cui cercare mentre se vuoi accettare tutti i numeri metti 0,0. Forse pero un motivo per cui non ti identifica il chiamante potrebbe essere che il numero salvato non ha il +39 iniziale. Prova a vedere

Ti ringrazio del tuo aiuto.
I numeri sono salvati con il +39.
Il fattore fondamentale è nella funzione gsm.callstatus() che restituisce zero se il numero è in rubrica, quindi non va nel case dove posso utilizzare CallStatusWithAuth.. con gli indici cambiati.

Il fatto che restituisce zero mi sa molto strano perchè la funzione gsm.callstatus() non fa altro che inviare il comando:
Serial.println("AT+CPAS");
e vedere cosa restituisce. Se vedi qui(http://www.telit.com/module/infopool/download.php?id=542) il comando CPAS non guarda nella rubrica ma ritorna solo lo stato del modulo quindi il comportamento che mi dici mi sembra molto strano. Potresti provare magari a fare un reset del modulo alle impostazioni di fabbrica o vedere se durante la funzione di inizializzazione della libreria viene cambiato qualche cosa di sbagliato.

Ho utilizzato il tuo sistema del riconoscimento del numero chiamante con if strcmp e funziona bene.

Cambiando problema ho provato ad mettere i sensori 1 wire la compilazione va senza errori ma il modulo si blocca appena si avvia.

Volevo far colloquare 2 arduino, modulo gsm e modulo ethernet con la libreria wire, viene complato bene si carica ma fa lo stesso.
Credevo che era un problema di pin infatti ho chiesto in un'altro topic, ma la i2c utilizza pin analogici mentre il modulo gsm utilizza pin digitali.

Ragazzi aveve per caso provato ad inviare altri comandi al modulo GSM. Per esempio volevo interrogare il modulo con comandi tipo AT+CSQ per il livello del segnale etc ma come risposta ottengo caratteri strani... vi posto il codice.(modulo GSM di futuranet)

char GSM::line()
{
mySerial.println("AT+CSQ");
mySerial.print("\r");
delay(500);
}
Tale funzione l'ho inserita nel file GSM_Shield.cpp
Dov'è che sbaglio?

pines:
Ho utilizzato il tuo sistema del riconoscimento del numero chiamante con if strcmp e funziona bene.

Cambiando problema ho provato ad mettere i sensori 1 wire la compilazione va senza errori ma il modulo si blocca appena si avvia.

Volevo far colloquare 2 arduino, modulo gsm e modulo ethernet con la libreria wire, viene complato bene si carica ma fa lo stesso.
Credevo che era un problema di pin infatti ho chiesto in un'altro topic, ma la i2c utilizza pin analogici mentre il modulo gsm utilizza pin digitali.

A me si bloccava quando avevo un array di char per il quale andavo in overflow. Quando salvi infatti un carattere nell'array nella posizione sucessiva viene posto il carattere \0 quindi la dimensione dell'array deve essere di N+1 posti.

mimmofire:
Ragazzi aveve per caso provato ad inviare altri comandi al modulo GSM. Per esempio volevo interrogare il modulo con comandi tipo AT+CSQ per il livello del segnale etc ma come risposta ottengo caratteri strani... vi posto il codice.(modulo GSM di futuranet)

char GSM::line()
{
mySerial.println("AT+CSQ");
mySerial.print("\r");
delay(500);
}
Tale funzione l'ho inserita nel file GSM_Shield.cpp
Dov'è che sbaglio?

Fai cosi:
Serial.println("AT+CREG?");
status = WaitResp(5000, 50);
cambia il comando at e tramite WaitResp implementata nella libreria vedi cosa risponde

Attenzione.

Serial.println("AT+CREG?");
status = WaitResp(5000, 50);

Così lavori sulla seriale hardware.
se utilizzi la NewSoftSerial devi utilizzare mySerial.println

Allora ragazzi in parte ho risolto il problema. Ho scritto una funzione che analizza la stringa di risposta al comando AT inviato, nell'esempio Il comando CSQ che fornisce il livello del segnale ricevuto.

char GSM::line(void)
{
char status;
if (CLS_FREE != GetCommLineStatus()) return (REG_COMM_LINE_BUSY);
SetCommLineStatus(CLS_ATCMD);
mySerial.println("AT+CSQ");
// 5 sec. for initial comm tmout
// 50 msec. for inter character timeout
status = WaitResp(5000, 50);
if (status == RX_FINISHED) {
//
if(IsStringReceived("0")) {

Serial.println("0");
}else if(IsStringReceived("1")) {
Serial.println("1");
}else if(IsStringReceived("2")) {

Serial.println("2");
}else if(IsStringReceived("3")) {

Serial.println("3");
}else if(IsStringReceived("4")) {

Serial.println("4");
}else if(IsStringReceived("5")) {

Serial.println("5");
}else if(IsStringReceived("6")) {

Serial.println("6");
}else if(IsStringReceived("7")) {

Serial.println("7");
}else if(IsStringReceived("8")) {

Serial.println("8");
}else if(IsStringReceived("9")) {

Serial.println("9");
}else if(IsStringReceived("10")) {

Serial.println("10");
}else if(IsStringReceived("11")) {

Serial.println("11");
}else if(IsStringReceived("12")) {

Serial.println("12");
}else if(IsStringReceived("13")) {

Serial.println("13");
}else if(IsStringReceived("14")) {

Serial.println("14");
}else if(IsStringReceived("15")) {

Serial.println("15");
}else if(IsStringReceived("16")) {

Serial.println("16");
}else if(IsStringReceived("17")) {

Serial.println("17");
}else if(IsStringReceived("18")) {

Serial.println("18");
}else if(IsStringReceived("19")) {

Serial.println("19");
}else if(IsStringReceived("20")) {

Serial.println("20");
}else if(IsStringReceived("21")) {

Serial.println("21");
}else if(IsStringReceived("22")) {

Serial.println("22");
}else if(IsStringReceived("23")) {

Serial.println("23");
}else if(IsStringReceived("24")) {

Serial.println("24");
}else if(IsStringReceived("25")) {

Serial.println("25");
}else if(IsStringReceived("26")) {

Serial.println("26");
}else if(IsStringReceived("27")) {

Serial.println("27");
}else if(IsStringReceived("28")) {

Serial.println("28");
}else if(IsStringReceived("29")) {

Serial.println("29");
}else if(IsStringReceived("30")) {

Serial.println("30");
}else if(IsStringReceived("31")) {

Serial.println("31");
}

//
}
SetCommLineStatus(CLS_FREE);

}

Ancora non ho capito come poter vedere la stringa di risposta dato che nel file .cpp non c'è una funzione vera e propria che fa questo lavoro.
Analizzando le altre funzioni ho capito che si confronta la stringa ricevuta con un testo campione e da qui la mia funzione.
Inviando il comando AT+CSQ si ottiene come risposta un numero da 0 a 31 che corrispondono ad un preciso livello di segnale.
Il problema è che se la risposta contiene uno zero ( 0,10, 20), dal confronto con la funzione isStringReceived ottengo sempre zero

Qualche consiglio!!!

al posto di IsStringReceived non c'è una getStringReceived? se no programmatela da te, qusto switch non si può vedere :slight_smile:

Si in effetti questo switch non si può vedere, anche perchè non funziona.Cmq ho trovato la soluzione, appena completa la posto.
Grazie!!!

Ecco la soluzione per inviare comadi AT al modulo GSM di futura elettronica ed ottenere come risposta la stringa AT "pura".

if (CLS_FREE != GetCommLineStatus()) return (REG_COMM_LINE_BUSY);
SetCommLineStatus(CLS_ATCMD);
mySerial.println("AT+CSQ");
mySerial.print("\r");
// 5 sec. for initial comm tmout
// 50 msec. for inter character timeout
status = WaitResp(5000, 50);
if (status == RX_FINISHED) {
char testo = (char)comm_buf;
Serial.println(testo);
}
SetCommLineStatus(CLS_FREE);

Nell'esempio sopra si richiede al modulo GSM l'RSSI che altro non è che un indicatore della potenza del segnale ricevuto.

Mimmofire in questi giorni ho avuto anche io problemi con la funzione callStatus(). Ho quindi modificato la funzione in questo modo:

/**********************************************************
Method checks status of call

return: 
      CALL_NONE         - no call activity
      CALL_INCOM_VOICE  - incoming voice
      CALL_ACTIVE_VOICE - active voice
      CALL_NO_RESPONSE  - no response to the AT command 
      CALL_COMM_LINE_BUSY - comm line is not free
**********************************************************/
byte GSM::CallStatus(void)
{
  byte ret_val = CALL_NONE;
  byte status;
  
  if (CLS_FREE != GetCommLineStatus()) return (CALL_COMM_LINE_BUSY);
  SetCommLineStatus(CLS_ATCMD);
  Serial.flush();
  delay(100);
  Serial.println("AT+CPAS");
  
  // 5 sec. for initial comm tmout
  // 50 msec. for inter character timeout
  if (RX_TMOUT_ERR == WaitResp(5000, 50)) {
    // nothing was received (RX_TMOUT_ERR)
    // -----------------------------------
    ret_val = CALL_NO_RESPONSE;
  }
  else {
    // something was received but what was received?
    // ---------------------------------------------
    // ready (device allows commands from TA/TE)
    // <CR><LF>+CPAS: 0<CR><LF> <CR><LF>OK<CR><LF>
    // unavailable (device does not allow commands from TA/TE)
    // <CR><LF>+CPAS: 1<CR><LF> <CR><LF>OK<CR><LF> 
    // unknown (device is not guaranteed to respond to instructions)
    // <CR><LF>+CPAS: 2<CR><LF> <CR><LF>OK<CR><LF> - NO CALL
    // ringing
    // <CR><LF>+CPAS: 3<CR><LF> <CR><LF>OK<CR><LF> - NO CALL
    // call in progress
    // <CR><LF>+CPAS: 4<CR><LF> <CR><LF>OK<CR><LF> - NO CALL
    if(IsStringReceived("+CPAS: 0")) { 
      // ready - there is no call
      // ------------------------
      ret_val = CALL_NONE;
    }
    else if(IsStringReceived("+CPAS: 3")) { 
      // incoming call
      // --------------
      ret_val = CALL_INCOM_VOICE;
    }
    else if(IsStringReceived("+CPAS: 4")) { 
      // active call
      // -----------
      ret_val = CALL_ACTIVE_VOICE;
    }
	else{ 
      // active call
      // -----------
      ret_val = CALL_NO_RESPONSE;
    }
  }

  SetCommLineStatus(CLS_FREE);
  return (ret_val);

}

rispetto a prima viene ricercato anche il +CPAS: oltre il numero ed ora sembra mi funzioni bene mentre prima probabilmente leggeva degli 0 spuri che facevano pensare a nessuna chiamata in arrivo. Non so perchè ma fino a poco tempo fa funzionava anche con la vecchia funzione, forse cambiando qualche cosa nel mio sketch... Ciao

Se trovate dei problemi sulla libreria segnalatemelo in modo da poter aggiornare il codice

http://code.google.com/p/gsm-shield-arduino/