1°) Matériel :

* Une carte Arduino Leonardo,

* Une carte GSM Siemens TC 35 (http://www.sainsmart.com/arduino-compatibles-1/gps-gprs-gsm-module/siemens-tc35-sms-gsm-module-voice-adapter.html)

* Un bloc transformateur 5v DC

2°) Branchements : Il est nécessaire de raccorder la masse (GND) de la carte TC35 à la masse de la carte Arduino (fil jaune). Puis de raccorder le port TX de la TC35 (fil vert) à un port digital de la carte Arduino (ici le port 9) et de raccorder le port RX de la TC35 (fil bleu) au port digital (ici 10) de la carte Arduino. ATTENTION : pour la carte Leonardo pour le port RX seules les broches 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI) peuvent être utilisées. L’alimentation de la TC35 doit être de 5v DC, point central positif. Il est nécessaire d’allumer la carte TC35 en appuyant sur le bouton à gauche du port RS232, la led rouge clignotera alors lentement dans le cas où tout est ok (carte SIM valide).

2°) Test d’envoi de SMS :

Remarques : le débit doit être de 9600 bauds entre la carte Arduino et la TC35, les commandes AT tapées sans espace. Le programme ci-dessous permet la saisie d’un message dans le moniteur série puis l’envoie.

#include <SoftwareSerial.h> #define rxPin 10 #define txPin 9 // set up a new serial port for Leonardo SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin); char recu[150]; // Array for entering message String message=""; //string we're sending int i; void setup() {//--For Leonardo Serial.begin(9600); while (!Serial){ } // set the data rate for the SoftwareSerial port mySerial.begin(9600); delay(5000); Serial.println("Hello, tapez votre SMS en terminant par un point"); } void loop() { i = 0 ; while ( Serial.available()>0 ) {recu[i] = Serial.read(); message += recu[i]; i++; //-- 46 is the Ascii code for "." if (recu[i-1]==46) { Serial.println("Envoi du SMS..."); SendTextMessage(); ShowSerialData(); delay(1000); Serial.println("\r"); //-- Carriage return Serial.println("SMS parti !"); message=""; i=0; } } } ///SendTextMessage() ///this function is to send a sms message void SendTextMessage() { mySerial.print("AT+CMGF=1\r"); //Because we want to send the SMS in text mode delay(1000); mySerial.print("AT+CMGS=\"+336xxxxxxxx\"\r"); delay(1000); mySerial.println(message); mySerial.print("\r"); delay(1000); mySerial.println((char)26);//the ASCII code of the ctrl+z is 26 mySerial.println(); } void ShowSerialData() { while(mySerial.available()!=0) Serial.write(mySerial.read()); }

Attention, pour la lecture des informations en provenance de la carte, il est nécessaire de modifier la taille du buffer de réception dans le ficher SoftwareSerial.h à la ligne #define _SS_MAX_RX_BUFF 1024 // RX buffer size (ici nous avons augmenté le buffer à 1k).

Exemple d’envoi de commandes AT à la carte et de lecture du résultat.

#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 9); char recu[150]; // Array for entering message int i; String message=""; void setup() {//--For Leonardo Serial.begin(9600); while (!Serial){ } mySerial.begin(9600); delay(5000); Serial.println("Started!"); Serial.println("Hello, tapez votre commande en terminant par un point"); //-- Choose SIM memory and show the SMS in MEMORY //-> AT+CPMS="SM". //mySerial.println( "AT+CPMS=\"SM\"" ); //-- Ask for all the SMS //-> AT+CMGL="ALL".// mySerial.println( "AT+CMGL=\"ALL\"" ); //-> AT+CMGR=2. // Read the 2nd message //-> AT+CMGD=2. // Delete the 2nd message //-> AT+CNMI=?. //-- Test received message } void loop() { i = 0 ; while ( Serial.available()>0 ) {recu[i] = Serial.read(); if ((recu[i]!=46)&&(recu[i]!=13)&&(recu[i]!=10)) message += char(recu[i]); i++; if (recu[i-1]==46) { Serial.println("Envoi de la commande ["+message+"]"); SendCmdMessage(); ShowSerialData(); Serial.println("Commande finie,tapez votre commande en terminant par un point"); message=""; i=0; } } } void ShowSerialData() { while(mySerial.available()!=0) { Serial.print(char(mySerial.read())); } } void SendCmdMessage() { mySerial.println(message); delay(1000); }

Allumage d’une LED dès réception d’un SMS puis effaçage du SMS :

#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 9); char recu[150]; // Array for entering message int i; int dp=0; char c; String message=""; String cmd=""; String cReturn=""; int nReturn=0; int nPremier=0; //--Pin of the LED to turn ON and OFF int ledPin = 5; void setup() {//--For Leonardo Serial.begin(9600); while (!Serial){ } mySerial.begin(9600); delay(5000); Serial.println("Started!"); Serial.println("Hello, Pour commencer taper Envoyer"); message="AT+CPMS=\"SM\""; Serial.println("Envoi de la commande ["+message+"]"); SendCmdMessage(); ShowSerialData(); Serial.println(nReturn); nPremier=nReturn; pinMode( ledPin, OUTPUT ); digitalWrite( ledPin, LOW); //-- Choose SIM memory and show the SMS in MEMORY //-> AT+CPMS="SM". //mySerial.println( "AT+CPMS=\"SM\"" ); //-- Ask for all the SMS //-> AT+CMGL="ALL".// mySerial.println( "AT+CMGL=\"ALL\"" ); //-> AT+CMGR=2. // Read the 2nd message //-> AT+CMGD=2. // Delete the 2nd message //-> AT+CNMI=?. //-- Test received message } void loop() { while ( Serial.available()>0 ) { message="AT+CPMS=\"SM\""; SendCmdMessage(); ShowSerialData(); Serial.print("Nombre de SMS : "); Serial.println(char(nReturn+48)); if (nReturn>nPremier) {Serial.println("Nouveau SMS !"); //nPremier=nReturn-1; Serial.print(nReturn); Serial.print(" "); Serial.println(nPremier); digitalWrite( ledPin, HIGH); delay(1000); //--Read the nReturn message message=""; message=nReturn+message; message="AT+CMGR="+message; Serial.println("Envoi de la commande ["+message+"]"); SendCmdMessage(); ShowSmsData(); delay(1000); //--Delete the nReturn message message=""; message=nReturn+message; message="AT+CMGD="+message; Serial.println("Envoi de la commande ["+message+"]"); SendCmdMessage(); ShowSmsData(); message=""; delay(1000); digitalWrite( ledPin, LOW); } } } void ShowSerialData() { cReturn=""; while(mySerial.available()!=0) { //Serial.print(char(mySerial.read())); c=char(mySerial.read()); switch(dp){ case 1 : if (c==44)///-- Acii code for Comma dp=2; else cmd+=c; break; case 2 : if (cmd!="") { cmd.trim(); //Serial.println("Mem SMS ["+cmd+"]"); cReturn=cmd; if (cReturn.length()==1) {c=cReturn.charAt(0); nReturn=c-0; nReturn=nReturn-48;} else nReturn=0; } dp=0; cmd=""; break; default : if (c==58) //-- Acii code for : dp=1; break; } } } void ShowSmsData() { while(mySerial.available()!=0) { //Serial.print(char(mySerial.read())); c=char(mySerial.read()); switch(dp){ case 1 : if (c==13)///-- Acii code for Return dp=2; else cmd+=c; break; case 2 : if (cmd!="") Serial.println("Mem SMS ["+cmd+"]"); dp=0; cmd=""; break; default : if (c==58) //-- Acii code for : dp=1; break; } } } void SendCmdMessage() { mySerial.println(message); delay(1000); }

Même programme mais exécutable sans PC, branchement carte Arduino et carte GSM sur le secteur après avoir déversé le programme dans la carte Arduino :