Moduli gsm

mannaggia io parteciperei,ma senza modulo ho paura di fare più danni che altro.

Ciao
volevo segnalare, penso un bug.

Ho caricato lo sketch gsm_shield, funziona bene al 99%, ma quando sul modulo ricevo una chiamata dal numero presente nella rubrica non viene segnalato nulla.
Spero di essere stato chiaro.

A me funziona utilizzando la funzione:
int call=gsm.CallStatus();//leggo lo stato del modulo GSM
che mi restituisce se o una chiamata in arrivo, attivo,...

.. ho queste righe ..
call=gsm.CallStatus();
Serial.println(call);

se il numero è presente in rubrica mi da 0, se non cè mi visualizza 1.

Questa è la funzione che utilizzo per verificare ogni secondo se c'è una chiamata in arrivo:

//Funzione che controlla se chiamata in arrrivo
void Check_Call() 
{     
  char number[15];//array dove salvo il numero chiamante
  
  int call=gsm.CallStatus();//leggo lo stato del modulo GSM  
  switch (call)
  {    
  case CALL_NONE:
    Serial.println("no call");
    break;
  case CALL_INCOM_VOICE:
    gsm.CallStatusWithAuth(number,0,0);        
    if(strcmp(number,"")!=0){
      Serial.print("incoming voice call from ");     
      Serial.println(number);
      delay(1000);
      gsm.HangUp();//riattacco la chiamata
      //funzione 
    } 
    break;
  case CALL_ACTIVE_VOICE:
    Serial.println("active voice call");    
    break;
  case CALL_NO_RESPONSE:
    Serial.println("no response");
    break;
  }
  return;
}

forse sono le autorizzazioni che ti danno prob prova a vedere

si infatti è un sistema che aggira l'ostacolo,
pero era piu comodo inserire il numero in rubrica.
Scusami ma non ho capito quello che hai scritto prima

forse sono le autorizzazioni che ti danno prob prova a vedere

Grazie

Quello che dicevo riguardava la funzione:
CallStatusWithAuth

/**********************************************************
Method checks status of call(incoming or active) 
and makes authorization with specified SIM positions range

phone_number: a pointer where the tel. number string of current call will be placed
              so the space for the phone number string must be reserved - see example
first_authorized_pos: initial SIM phonebook position where the authorization process
                      starts
last_authorized_pos:  last SIM phonebook position where the authorization process
                      finishes

                      Note(important):
                      ================
                      In case first_authorized_pos=0 and also last_authorized_pos=0
                      the received incoming phone number is NOT authorized at all, so every
                      incoming is considered as authorized (CALL_INCOM_VOICE_NOT_AUTH is returned)

return: 
      CALL_NONE                   - no call activity
      CALL_INCOM_VOICE_AUTH       - incoming voice - authorized
      CALL_INCOM_VOICE_NOT_AUTH   - incoming voice - not authorized
      CALL_ACTIVE_VOICE           - active voice
      CALL_INCOM_DATA_AUTH        - incoming data call - authorized
      CALL_INCOM_DATA_NOT_AUTH    - incoming data call - not authorized  
      CALL_ACTIVE_DATA            - active data call
      CALL_NO_RESPONSE            - no response to the AT command 
      CALL_COMM_LINE_BUSY         - comm line is not free
**********************************************************/

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