Header Ads

Préparation 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éclame 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.
Dans l'état actuel de nos travaux, la librairie est capable:
  • De détecter si le shield est disponible (isReady)
  • De se connecter sur le Réseaux GSM (en fournissant automatiquement le code PIN à module SIM900)
  • De savoir si l'on est connecté sur le réseau mobile (isCallReady)
  • De redémarrer le programme Arduino à chaud.
    Après un "reset" du programme Arduino, la fonction isCallReady sait vérifier l'état du Réseau mobile. Le programme se rendra alors compte que le GPRS était déjà connecté et il ne sera donc pas nécessaire de l'éteindre et le rallumer :-)
  • De lire le numéro IMEI (identification)
  • D'envoyer des SMS
  • De recevoir des SMS
    - Sur base de notification spontanée.
    - Texte limité à 40 caractères, suffisant pour envoyer un ordre par téléphone.
Quelques exemples
Nos efforts commencent à porter leurs fruits, voici le temps de partager quelques exemples... et d'avoir un premier retour d'impressions.

Ce premier exemple attend simplement la réception d'un SMS et en envoi le contenu vers le moniteur série

/* ------------------------------
       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();
  if( gsm.isCallReady() ) {
    
    if( gsm.hasSms() ){
      Serial.println( gsm.smsText() );
      Serial.println( gsm.smsCallee() );
      gsm.clearSms(); // reset the reception of the last SMS
    }
    else
      Serial.println( "no SMS" );
  }
  delay(500);
}

Simple non?
Ce second exemple envoi un message SMS (puis arrête l'exécution du programme)

/* ------------------------------
       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();
  /* Send a SMS */
  if( gsm.isCallReady() ){
    if( gsm.sendSms( "+32477665544", "GOF GPRS Shield is Great!" ) ) {
      Serial.println( "SMS Send" );
    }
    else {
      Serial.println( "SMS not sent!" );
    }
    // Avoids the scketch to continuously send sms.
    Serial.println( "execution stopped" );
    while( true ) ;
  } 
  delay(500);
}


Ce dernier exemple, issus de notre développement en cours montre comment:
  1. Créer la classe
  2. Fournir le code PIN
  3. Détecter l'activation/disponibilité du réseau
  4. Attendre l'arrivée d'un SMS
  5. Renvoyer un SMS automatiquement (avec un message)

/* ------------------------------
       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();
  /* Receive SMS and resend message to callee (with additionnal text) */
  if( gsm.isCallReady() ){
    if( gsm.hasSms() ) {
      String phoneNr = String( gsm.smsCallee() );
      String msg = String( "You said "+gsm.smsText() );
      gsm.clearSms();
      if( gsm.sendSms( phoneNr, msg ) )
        Serial.println( "Successfully replied "+msg+" to "+phoneNr );
      else 
        Serial.println( "Reply "+msg+" to "+phoneNr+ "did failed!" );
    }
  }
  
  delay(500);
}