SIM900: Inviare e ricevere SMS con Arduino UNO

La shield SIM900 può essere in grado di risolvere molti problemi relativi alla connettività di Arduino al mondo esterno attraverso SMS e chiamate telefoniche. Il suo utilizzo è molto valido in tutte quelle occasioni in cui il nostro progetto non dispone di una connessione ad Internet e vogliamo inviare e/o ricevere dati e informazioni da/a Arduino.

Tuttavia, per quanto mi riguarda, il suo funzionamento (lato software e lato hardware) non è stato facilissimo da apprendere: questo è il motivo per cui ora scrivo questa piccola guida.

Il modulo GPRS SIM900

Si tratta di un modem GSM seriale che permatte di:

  • accedere ad internet tramite connessione GPRS
  • inviare e ricevere SMS
  • inviare e ricevere chiamate ed intercettare i toni DTMF

Applicazioni

E’ ottimo per accendere da remoto un dispositivo (un termostato, il cancello del garage…) in modo semplice e veloce.

Caratteristiche

  • Compatibile con Arduino (e compatibili);
  • Funziona attraverso comandi seriali AT
  • Funziona con 4 frequenze: 850; 900; 1800 e 1900 MHz e quindi in tutte le nazioni
  • Integra anche un orologio RTC
  • Integra i jack per le cuffie e il microfono per gestire le chiamate

Configurazione hardware

Inserimento SIM

Il primo passo è quello di inserire una scheda SIM senza codice PIN nella parte inferiore del modulo.

Alimentazione

Dovrete poi procurarvi un Alimentatore per il modulo, da collegare al jack DC, come mostrato nell’immagine. L’alimentatore deve essere da 5V e almeno 2A. In alternativa potete usare un alimentatore da 9V o 12V e 1A.

Dovete inoltre posizionare l’interruttore vicino al jack sulla modalità “external power”, come mostrato nell’immagine.

Per accendere la shield bisogna premere il piccolo pulsante indicato nella foto seguente. Questa operazione può essere bypassata collegando il pulsante ad un pin digitale di Arduino e gestendone l’accensione da codice.

Jumper porta seriale

Assicuratevi poi che i due piccoli jumper che permettono di scegliere la porta seriale siano spostati su D8 e D7 invece che su D1 e D0. Questo è fondamentale per il funzionamento con la libreria SIM900.h.

I due jumper

Collegamento ad Arduino

Effettuate il collegamento con Arduino UNO come mostrato nell’immagine.

Collegamenti

Software

Per programmare il modulo SIM900 ho usato la libreria SIM900.h, che potete scaricare dalla relativa pagina github, scegliendo la voce “Download ZIP”.

Questa libreria mette a disposizione classi e metodi che permettono di dialogare con il modulo GSM in modo chiaro e pulito.

Lo sketch che segue permette la gestione di un relè tramite comandi inviati tramite SMS:

  • ON accende il relè
  • OFF lo spegne
  • STATUS risponde con lo stato attuale del relè

 

#include "SIM900.h"
#include 
#include "sms.h"

#define RELAY 11

/* *** GSM SIM900 Settings *** */
SMSGSM sms;
int numdata;
boolean GSMOK = false;
char SMSBuffer[160];
char sender[20];

void setup() {
  Serial.begin(9600);

  // GSM setup
  digitalWrite(9, HIGH);
  delay(2000);
  digitalWrite(9, LOW);
  int trys = 0;
  Serial.println("SIM900 setup...");
  if (gsm.begin(2400)) {
     Serial.println("SIM900 successfully initialized.");
     GSMOK=true;  
  }
  else 
     Serial.println("Unable to initialize SIM900.");
 
   // Initialize digital PIN
  pinMode(RELAY, OUTPUT);
  digitalWrite(RELAY, HIGH);
}

void loop() {
  
  if (GSMOK) {
    char position = sms.IsSMSPresent(SMS_ALL);

    if (position) {
      sms.GetSMS(position, sender, SMSBuffer, 160);
      Serial.print("\n--- New SMS ---\n\n");
      Serial.println("Tel.:" + String(sender));
      Serial.println("Content: " + String(SMSBuffer));

      if(String(SMSBuffer) == "ON")
        digitalWrite(RELAY, HIGH);
      else if(String(SMSBuffer) == "OFF")
        digitalWrite(RELAY, LOW);
      else if(String(SMSBuffer) == "STATUS") {
        String response;
        if(digitalRead(RELAY))
          response = "ON";
        else 
          response = "OFF";
        sms.SendSMS(sender, const_cast<char*>(response.c_str()));
      }

      sms.DeleteSMS(position);

      Serial.print("\n--- SMS Deleted ---\n\n");
    }
  }

  delay(150);
}