Préparation (suite) d'une librairie pour le GSM/GPRS de GOF

Cela fait quelques-mois que le GSM/GPRS shield de GeekOnFire (GOF pour les intimes) est disponible chez MC Hobby.
GSM/GPRS shield de GOF pour Arduino
Disponible chez MC Hobby

Même s'il est bien documenté (voir notre wiki) et les exemples parfaitement fonctionnels, l'utilisation d'un tel module dans des projets peut réclamer un effort de programmation non négligeable.

Partant de ce constat, et ayant nous même des projets (localisation par SMS, contrôle de température et activation d'une chaudière à distance, ouverture de porte à distance, etc), nous avons décidé d'essayer de mettre en place une librairie.

Le projet GoGprs
Actuellement en cours d'écriture, GoGprs est une classe (et futur libraire) qui permettra de contrôler le GPRS de GOF.

Notre premier article faisait état de nos premiers résultats prometteurs ceoncernant les SMS.
Bien que nous n'avançons pas aussi vite qu'attendu, cette soirée aura été productive concernant les appels téléphoniques vocaux.

Dans l'état actuel de nos travaux, la librairie a étendu ses fonctionnalités :
  • Etablissement d'une communication téléphonique
    gsm.call( "+32999887766" )
  • Savoir si une communication est en cours (numérotation ou communication vocale)
    gsm.isCalling()
  • Savoir si le GPRS "sonne" (reçoit une communication entrante)
    gsm.isRinging()
  • Savoir si le GPRS est prêt à établir une communication vocale (donc qu'il ne sonne pas en communication entrante OU qu'il n'est pas en cours de numérotation ou communication vocale établie).
    gsm.isReadyForCall() 
  • Interrompre la communication en cours de numérotation ou en cours d'échange vocal
    gsm.hangUp()
  • D'accepter une communication entrante.
    gsm.acceptCall()
Quelques exemples
Nos efforts commencent à porter leurs fruits, voici le temps de partager un autre exemple... et d'avoir un premier retour d'impressions.

Cet exemple etablit une communication sortante attend qu'elle soit coupée par le destinataire... ou finalement la coupe au bout de 15 seconds.
Si le téléphone sonne pendant 8 + 15 sec sans réponse, la communication sera également interrompue par logiciel

/* ------------------------------
       Main Routines
   ------------------------------ */
GoGprs gsm = GoGprs();

void setup() {
  Serial.begin(19200); // Establish conection with IDE's Serial Monitor
  
  // Init communication with GSM/GPRS shield (on pin 7 and 8)
  gsm.begin("1234");// Sim card pinCode
}   

void loop() {
  gsm.execute();
  
  unsigned long currentMillis;
  
  if( gsm.isCallReady() ){
    // Start Call
    Serial.println( "Initiating Call" );
    if( gsm.call( "+32999887766" ) )
      Serial.println( "Call initiated" );
    else {
      Serial.println( "Call refused!" );
      while( true ) ; // program end
    }
    
    // Wait a time because isCalling() is also true while 
    // remote host is ringing
    Serial.println( "wait 8 sec to establish communication" );
    delay( 8000 ); 
        
    // Is the voice call established?
    if( not( gsm.isCalling() ) ){
      Serial.println( "User did not responded to call" ); 
      while( true ); // program end
    }
    Serial.println( "Call established (or still ringing)." );

    // 15 seconds OR communcation ends by Host
    Serial.println( "   wait end of call by host OR 15 sec max" );    
    currentMillis = millis();
    while( gsm.isCalling() && ((millis()-currentMillis) < 15000) )
      delay(200);
      
    // If still communicating then ENDS THE CALL
    if( gsm.isCalling() ) {
      Serial.println( "Still under call... HANG UP communication by software" );
      if( gsm.hangUp() ) 
        Serial.println( "Hang-Up accepted" );
      else 
        Serial.println( "Hang-Up refused!" );
    }
    else 
      Serial.println( "Remote host did HANG-UP the phone call" );    
            
     while( true ); // stop program
     
  } // if gsm.isCallReady()
}

Le code reste encore facile a suivre... pourtant le processus de communication avec le GPRS est relativement complexe.

Voici ce que le programme retourne comme information

Initiating Call
Call initiated
wait 8 sec to establish communication
Call established (or still ringing).
   wait end of call by host OR 15 sec max
Remote host did HANG-UP the phone call