SIM900 : Contrôle à Distance, SMS et MMS avec Arduino

Sommaire

Introduction

Explorez les possibilités infinies de communication avec le module SIM900 pour révolutionner votre domotique et renforcer la sécurité de votre domicile. Le module SIM900 est un dispositif GSM/GPRS compact qui permet à votre Arduino de se connecter à un réseau mobile, permettant ainsi l’envoi et la réception de SMS, d’appels vocaux et de MMS. Grâce à ce guide détaillé, vous apprendrez comment intégrer le SIM900 à vos projets Arduino pour créer un système de communication robuste et fiable.

Nous allons vous montrer comment configurer le module SIM900, envoyer et recevoir des SMS et des MMS, émettre des appels, et même créer un système d’alarme intelligent en utilisant divers capteurs. Que vous soyez un amateur passionné ou un professionnel de la domotique, ce guide vous fournira les connaissances et les compétences nécessaires pour exploiter pleinement les capacités du SIM900.

Liste des composants

  • Arduino Mega 2560
  • Module GSM/GPRS SIM900
  • Bloc d’alimentation 5V/2A
  • Lecteur de carte SD ou micro SD
  • Câbles Arduino 10cm ou 20cm
  • Caméra PTC06
  • Capteur Infrarouge HC-SR501
  • 1 carte SD ou micro SD (16Go max)
  • 1 carte SIM 4g (nous utilisons une SIM La poste mobile pour le tutoriel)

Schémas de câblage

Voici les schémas de câblage nécessaires pour connecter le module SIM900 à l’Arduino Mega 2560, ainsi que le module Micro SD. Assurez-vous de suivre attentivement ces instructions pour garantir une connexion correcte et stable.

Tableau de connexion 

Arduino Mega 2560SIM900
TX2RX
RX2TX
GNDGND
Arduino Mega 2560Module SD
GNDGND
5VVCC
50MISO
51MOSI
52SCK
53CS

Notes importantes

  • Installation de la carte SD et de la carte SIM :

    • Il est impératif d’installer la carte SD et la carte SIM avant de mettre sous tension le module SIM900.
    • Assurez-vous que le code PIN de la carte SIM est désactivé, sinon, utilisez le programme Arduino pour le déverrouiller. Maintenez le bouton “Switch ON/OFF” du module SIM900 enfoncé pendant au moins 2 secondes pour l’allumer.
  • Indicateurs LED :

    • Une LED clignotante rapide (3 secondes) sur le module SIM900 indique que le code PIN est désactivé.
    • Une LED clignotant lentement (3 secondes) indique que le module est connecté au réseau mobile.
  • Mise à jour du firmware :

    • Pour l’envoi de MMS, le firmware du module doit être mis à jour pour être compatible avec les réseaux français. Tous les modules SIM900 vendus par notre boutique sont déjà à jour et compatibles avec les réseaux MMS en France et en Europe.

Programmes Arduino

Les programmes suivants permettent de tester les fonctions du module SIM900, comme l’envoi et la réception de SMS, l’envoi des MMS (ici avec carte SIM Laposte mobile!), et une carte SD ou micro-SD contenant l’image à envoyer, et l’émission ou la réception des appels téléphoniques (nécessite un micro et des écouteurs branchés sur les connecteurs associés du SIM900).

Une fois le programme téléchargé dans la carte Arduino, il faut ouvrir le Terminal Arduino afin de lui envoyer les commandes servant à activer les différentes fonctions du module SIM900 : 1,2,3,4,5,6,7,8,9,d,p,s.

Configuration des opérateurs pour l’envoi de MMS

Si vous utilisez un autre opérateur, voici les données à remplacer pour l’envoi de MMS dans le code :

  • SFR:

    • CMMSCURL = http://mms1
    • CMMSPROTO = 10.151.0.1
    • APN = sl2sfr
  • ORANGE:

    • CMMSCURL = http://mms.orange.fr
    • CMMSPROTO = 192.168.10.200
    • APN = orange.acte
  • BOUYGUES:

    • CMMSCURL = mmsbouygtel
    • CMMSPROTO = 62.201.129.226
    • APN = mmsbouygtel.com

Envoi de SMS, appels et MMS

				
					/*
Projet: APPELS SMS MMS avec SIM900 et Carte SD
Auteur: Christian Joseph
Board: Arduino Mega 2560
Date: 20 May 2020
Website: https://atelierdelarobotique.fr
*/


#include "SD.h"


#define CS 53


File dataFile;
int i;
unsigned char data=0;
String message = "Bonjour tout le monde";


void setup()
{
 pinMode(PWR,OUTPUT);
 pinMode(CS,OUTPUT);
 Serial.begin(9600);
 Serial2.begin(9600);// modifiez la vitesse si nécéssaire entre 9600 et 115200


if (!SD.begin(CS)) Serial.println("initialisation non reussie!");
 else Serial.println("initialisation ok."); 
}


void loop()
{ //Entrer des valeurs depuis le moniteur série pour activer les fonctions du SIM900:
//1,2,3,4,5,6,7,8,9,d,p,s
 if(Serial2.available())
 {
 while(Serial2.available())
 {
 data=Serial2.read();
 Serial.write(data);
 }
 data=0;
 }
 
 if(Serial.available())
 {
 data=Serial.read();
 } 
 if(data=='p')
 {
 Serial2.print("AT+CPIN=1234\r"); //Faire le code Pin carte SIM si activé
 // Si code Pin désactivé, ignorer// Mettre le code pin à la place de 1234 si différent
 } 
 if(data=='1')
 {
 Serial2.print("AT+CGMI\r"); // Identification du fabricant
 } 
 if(data=='2')
 {
 Serial2.print("AT+CGMM\r"); //Identification du modèle
 }
 
 if(data=='3')
 {
 Serial2.print("AT+CGMR\r"); //Version du Firmware
 }
 
 if(data=='4')
 {
 Serial2.print("AT+CGSN\r"); //Numéro IMEI
 }
 
 if(data=='5')
 {
 Serial2.print("ATD+33644757223;\r"); //Appels (ATD+numero à appeler)
 }
 
 if(data=='6')
 {
 Serial2.print("ATH\r"); //Racrocher un appel
 }
 
 if(data=='7') //Envoyer un SMS
 {
 Serial2.println("AT"); 
 delay(500);
 Serial2.print("AT+CMGF=1\r"); //Activation mode Texte
 delay(500);
 Serial2.println("AT+CMGS=\"+33644757223\""); //Numéro du destinataire
 delay(500);
 Serial2.print(message);//Message à envoyer 
 //Serial2.print("bonjour ceci est mon message"); //2eme methode pour envoyer un message 
 delay(500);
 Serial2.write((char)26); //Envoi du message
 }
 
 if(data=='8')
 {
 Serial2.print("AT+CMGR=1\r"); //Lire message
 }
 
 if(data=='9')
 {
 Serial2.print("AT+CMGD=1,0\r"); //Effacer un message
 } 
 if(data=='d')
 {
 Serial2.print("ATDT\r"); //Décrocher un appel
 } 
 
 if(data=='s') sendMMS(); //Envoyer un MMS
 data=0;
}


void sendMMS() //Envoi de MMS avec paramètre APN La poste mobile
//Regarder sur le site des opérateurs pour les paramètres APN, MMSCURL, CMMSPROTO
{
 Serial2.println("AT+CMMSINIT");
 delay(1000);//100
 if(Serial2.available())
 {
 while(Serial2.available()) Serial.write(Serial2.read());
 }
 Serial2.print("AT+CMMSCURL=\"mmsdebitel\"\r"); 
 delay(1000);
 if(Serial2.available())
 {
 while(Serial2.available()) Serial.write(Serial2.read());
 }
 Serial2.print("AT+CMMSCID=1\r");
 delay(1000);
 if(Serial2.available())
 {
 while(Serial2.available()) Serial.write(Serial2.read());
 }
 Serial2.print("AT+CMMSPROTO=\"10.143.156.003\",8080\r");
 delay(1000);
 if(Serial2.available())
 {
 while(Serial2.available()) Serial.write(Serial2.read());
 }
 Serial2.print("AT+CMMSSENDCFG=6,3,0,0,2,4,1,0\r");
 delay(1000);
 if(Serial2.available())
 {
 while(Serial2.available()) Serial.write(Serial2.read());
 }
 Serial2.print("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r");
 delay(1000);
 if(Serial2.available())
 {
 while(Serial2.available()) Serial.write(Serial2.read());
 }
 Serial2.print("AT+SAPBR=3,1,\"APN\",\"mmsdebitel\"\r");
 delay(1000);
 if(Serial2.available())
 {
 while(Serial2.available()) Serial.write(Serial2.read());
 }
 Serial2.print("AT+SAPBR=1,1\r");
 delay(4000);
 if(Serial2.available())
 {
 while(Serial2.available()) Serial.write(Serial2.read());
 }
 Serial2.print("AT+SAPBR=2,1\r");
 delay(1000);
 if(Serial2.available())
 {
 while(Serial2.available()) Serial.write(Serial2.read());
 }


 Serial2.print("AT+CMMSEDIT=0\r"); // Efface le Buffer
 delay(1000);
 if(Serial2.available())
 {
 while(Serial2.available()) Serial.write(Serial2.read());
 } 
 Serial2.print("AT+CMMSEDIT=1\r"); // Mode Edition activé
 delay(1000);
 if(Serial2.available())
 {
 while(Serial2.available()) Serial.write(Serial2.read());
 } 
 Serial2.print("AT+CMMSDOWN=\"PIC\",6651,20000,\"pic777.jpg\"\r"); //Chargement de l'image "pic777.jpg" de taille 6651 octets stockée dans la carte SD
 //20000 représente le temps qu'on laisse au système pour télécharger l'image
 
 delay(1000);
 if(Serial2.available())
 {
 while(Serial2.available()) Serial.write(Serial2.read());
 }


dataFile=SD.open("pic777.jpg"); //Téléchargement de l'image depuis la carte SD ou micro SD vers mémoire du SIM900
 i=0;
 if(dataFile)
 {
 while(dataFile.available())
 {
 data=dataFile.read();
 if(data<0x10) Serial.print("0");
 Serial.print(data,HEX);
 i++;
 if((i%40)==0) Serial.println();
 Serial2.write(data);
 }
 dataFile.close();
 } 
 else
 {
 Serial.println("erreur ouverture pic777.jpg");
 } 


delay(1000); Serial2.print("AT+CMMSRECP=\"+33644757223\"\r"); //Numéro du destinataire du MMS






 delay(1000);
 if(Serial2.available())
 {
 while(Serial2.available()) Serial.write(Serial2.read());
 }
 Serial2.print("AT+CMMSVIEW\r");
 delay(1000);
 if(Serial2.available())
 {
 while(Serial2.available()) Serial.write(Serial2.read());
 }
 Serial2.print("AT+CMMSSEND\r"); //Envoi du MMS
 delay(1000);
 if(Serial2.available())
 {
 while(Serial2.available()) Serial.write(Serial2.read());
 }
 Serial2.print("AT+CMMSTERM\r"); // Fin du MMS
 delay(1000);
 if(Serial2.available())
 {
 while(Serial2.available()) Serial.write(Serial2.read());
 }
}
				
			

Envoi de SMS à de multiples destinataires

				
					String message = « Atelier de la Robotique est super »;
String numero[3]= {« 0644757223\ » », »0606060606\ » », « 0770070707\ » »}; // Numéros des destinataires. Si vous ajoutez plus de numéros, pensez à modifier aussi le nombre entre les crochets de numero et aussi la valeur à laquelle « a » doit être inférieure dans la boucle « For » plus bas.

void setup()
{

Serial.begin(9600);
Serial2.begin(115200);

}

void loop()
{
for ( int a=0; a<3; a++){
Serial2.println(« AT »);
delay(1000);
Serial2.print(« AT+CMGF=1\r »); //Activation mode Texte
delay(1000);
Serial2.print(« AT+CMGS=\ » »); //Numéro du destinataire
Serial2.println(numero[a]);
delay(1000);
//Serial2.print(message);//Message à envoyer
Serial2.write(« Atelier de la Robotique est super »); //2eme methode pour envoyer un message
delay(3000);
Serial2.write((char)26); //Envoi du message
Serial.print(a);
delay(5000); //délai de 5 secondes entre les messages
}

while(1){ // Boucle infinie pour fin d’envoi

}
}
				
			

Réception et lecture des SMS

				
					void setup()
{
 
  Serial.begin(9600); //initialisation communication avec le moniteur série arduino
  Serial2.begin(115200); //initialisation communication avec le SIM900
 

  Serial.println(« Initialisation… »);
  delay(1000);

 //Connection avec le SIM900
  Serial2.println(« AT »);
  updateSerial();
 
  Serial2.println(« AT+CMGF=1 »); // Mode Texte
  updateSerial();
  Serial2.println(« AT+CNMI=1,2,0,0,0 »); // Activation de notification textos entrants
  updateSerial();
}

void loop()
{
 
  while (Serial.available())
  {
    Serial2.write(Serial.read());
  }
  while(Serial2.available())
  {
    Serial.write(Serial2.read());
  }
}

void updateSerial()
{

  delay(500);
  while (Serial.available())
  {
    Serial2.write(Serial.read());
  }
  while(Serial2.available())
  {
    Serial.write(Serial2.read());
  }
}
				
			

Envoi de MMS avec une Caméra

Nous allons maintenant envoyer un MMS  avec notre module SIM900 et une photo prise avec une caméra UART PTC06 .

Attention :

  • La caméra PTC06 doit être reliée à l’Arduino Mega sur le port TX2 et RX2.
  • Le SIM900 communique avec l’Arduino Mega via TX3 et RX3.
  • La vitesse de transfert est de 38400 bauds. Redémarrez votre module SIM900 si nécessaire pour appliquer cette configuration.

Instructions :

  1. Téléchargez et installez le programme sur la carte Arduino Mega.
  2. Ouvrez le moniteur Série pour vérifier le flux de données entre la carte Arduino Mega, la caméra PTC06 et le SIM900.

Astuce : Vous pouvez ajouter un détecteur de présence (comme le HC-SR501) pour que l’Arduino prenne une photo et l’envoie par MMS en cas de détection de mouvement.

				
					#include « SPI.h »
#include « SD.h »

byte ZERO = 0x00;
byte incomingbyte;
long int j=0,k=0,count=0,i=0x0000;
uint8_t MH,ML;
boolean EndFlag=0;
File myFile;
File dataFile;
int a;
unsigned char data=0;
unsigned long taille = 0;
String taillephoto;

void setup()
{
Serial.begin(38400);
while (!Serial)
{
; // attente connecttion du port Série sur Arduino Leonardo uniquement
}

Serial.print(« Initialisationde la carte SD… »);

pinMode(53, OUTPUT);
if (!SD.begin(53))
{
Serial.println(« initialisation KO! »);
return;
}
Serial.println(« initialisation Faite. »);
Serial.println(« Veuillez patienter …. »);

Serial2.begin(115200); //Démarrage de la caméra à 115200 bauds (vitesse par défaut de la caméra)
delay(100);
SendResetCmd();//Reset de la caméra
delay(2000);
SetBaudRateCmd();// réglage vitesse de transfert de la caméra à 38400 bauds
delay(1000);
Serial2.begin(38400); // Démarrage de la caméra à 38400 bauds
delay(2000);
Serial3.begin(38400);// Démarrage du SIM900 à 38400 bauds
}

void loop()
{
photo(); // prise de la photo avec la caméra
sendMMS(); // Envoi de la photo par MMS
while(1);
}


void photo(){
byte a[32];
int ii;

SendResetCmd();
delay(2000);
SendTakePhotoCmd();
delay(1000);
while(Serial2.available()>0)
{
incomingbyte=Serial2.read();
}

myFile = SD.open(« image7.jpg », FILE_WRITE); 

while(!EndFlag)
{
j=0;
k=0;
count=0;
SendReadDataCmd();
delay(20);
while(Serial2.available()>0)
{
incomingbyte=Serial2.read();
k++;
delay(1);
if((k>5)&&(j<32)&&(!EndFlag))
{
a[j]=incomingbyte;
if((a[j-1]==0xFF)&&(a[j]==0xD9)) //indique que la photo est prise
{
EndFlag=1;
}
j++;
count++;
}
}

for(j=0;j<count;j++)
{
if(a[j]<0x10) Serial.print(« 0 »);
Serial.print(a[j],HEX); // observation de l’image via le port série
Serial.print( » « );
}

for(ii=0; ii<count; ii++)
myFile.write(a[ii]);
Serial.println();
}

myFile.close();
Serial.println(« Photo dans la carte SD »);
}
void sendMMS()
{
myFile = SD.open(« image7.jpg »); // ouverture de la photo prise
taille = myFile.size(); // on récupère le poids de photo
taillephoto = String(taille, DEC); // Conversion du poids du format int au format String
Serial.print(« Taille du fichier = « );
Serial.println(taillephoto); // Affiche le poids en octets de la photo
myFile.close(); // Fermeture de la photo

// Envoi du MMS
Serial3.println(« AT »);
delay(1000);//100
updateSerial();
Serial3.println(« AT+CMMSINIT »);
delay(1000);//100
updateSerial();

Serial3.print(« AT+CMMSCURL=\ »http://mms1\ »\r »);
delay(1000);
updateSerial();

Serial3.print(« AT+CMMSCID=1\r »);
delay(1000);
updateSerial();

Serial3.print(« AT+CMMSPROTO=\ »10.151.0.1\ »,8080\r »);
delay(1000);
updateSerial();

Serial3.print(« AT+CMMSSENDCFG=6,3,0,0,2,4,1,0\r »);
delay(2000);
updateSerial();

Serial3.print(« AT+SAPBR=3,1,\ »CONTYPE\ »,\ »GPRS\ »\r »);
delay(1000);
updateSerial();

Serial3.print(« AT+SAPBR=3,1,\ »APN\ »,\ »sl2sfr\ »\r »);
delay(1000);
updateSerial();

Serial3.print(« AT+SAPBR=1,1\r »);
delay(2000);
updateSerial();

Serial3.print(« AT+SAPBR=2,1\r »);
delay(1000);
updateSerial();

Serial3.print(« AT+CMMSEDIT=0\r »);
delay(1000);
updateSerial();

Serial3.print(« AT+CMMSEDIT=1\r »);
delay(1000);
updateSerial();

Serial3.print(« AT+CMMSDOWN=\ »PIC\ », »+ taillephoto + « ,50000,\ »image7.jpg\ »\r »);

delay(1000);
updateSerial();

dataFile=SD.open(« image7.jpg »);
a=0;
if(dataFile)
{
while(dataFile.available())
{
data=dataFile.read();
if(data<0x10) Serial.print(« 0 »);
Serial.print(data,HEX);
a++;
if((a%40)==0) Serial.println();
Serial3.write(data);
}
dataFile.close();

}
else
{
Serial.println(« erreur de fichier »);
}

delay(1000);
Serial3.print(« AT+CMMSRECP=\ »+33641363164\ »\r »);
delay(1000);
updateSerial();

Serial3.print(« AT+CMMSVIEW\r »);
delay(1000);
updateSerial();

Serial3.print(« AT+CMMSSEND\r »);
delay(1000);
updateSerial();

Serial3.print(« AT+CMMSEDIT=0\r »);
delay(100);
updateSerial();

Serial3.print(« AT+CMMSTERM\r »);
delay(1000);
updateSerial();

}
void SendResetCmd() // reset de la caméra
{
Serial2.write(0x56);
Serial2.write(ZERO);
Serial2.write(0x26);
Serial2.write(ZERO);
}

/*************************************/
/* réglage taille de l’image :
/* <1> 0x22 : 160*120
/* <2> 0x11 : 320*240
/* <3> 0x00 : 640*480
/* <4> 0x1D : 800*600
/* <5> 0x1C : 1024*768
/* <6> 0x1B : 1280*960
/* <7> 0x21 : 1600*1200
/************************************/
void SetImageSizeCmd(byte Size) // résolution de l’image
{
Serial2.write(0x56);
Serial2.write(ZERO);
Serial2.write(0x54);
Serial2.write(0x01);
Serial2.write(Size);
}

/*************************************/
/* Set BaudRate :
/* <1>¡¡0xAE : 9600
/* <2>¡¡0x2A : 38400
/* <3>¡¡0x1C : 57600
/* <4>¡¡0x0D : 115200
/* <5>¡¡0xAE : 128000
/* <6>¡¡0x56 : 256000
/*************************************/
void SetBaudRateCmd()
{
Serial2.write(0x56);
Serial2.write(ZERO);
Serial2.write(0x31);
Serial2.write(0x06);
Serial2.write(0x04);
Serial2.write(0x02);
Serial2.write(ZERO);
Serial2.write(0x08);
Serial2.write(0X2A);
Serial2.write(0xF2);
}

void SendTakePhotoCmd()// Prise de photo
{
Serial2.write(0x56);
Serial2.write(ZERO);
Serial2.write(0x36);
Serial2.write(0x01);
Serial2.write(ZERO);
}

void SendReadDataCmd()
{
MH=i/0x100;
ML=i%0x100;
Serial2.write(0x56);
Serial2.write(ZERO);
Serial2.write(0x32);
Serial2.write(0x0c);
Serial2.write(ZERO);
Serial2.write(0x0a);
Serial2.write(ZERO);
Serial2.write(ZERO);
Serial2.write(MH);
Serial2.write(ML);
Serial2.write(ZERO);
Serial2.write(ZERO);
Serial2.write(ZERO);
Serial2.write(0x20);
Serial2.write(ZERO);
Serial2.write(0x0a);
i+=0x20;
}

void StopTakePhotoCmd()
{
Serial2.write(0x56);
Serial2.write(ZERO);
Serial2.write(0x36);
Serial2.write(0x01);
Serial2.write(0x03);
}

void updateSerial()
{

delay(500);
while (Serial.available())
{
Serial3.write(Serial.read());
}
while(Serial3.available())
{
Serial.write(Serial3.read());
}
}
				
			

Système d'alarme avec le SIM900

Nous allons vous guider dans la création d’un système d’alarme basé sur le module HC-SR01, un détecteur de présence très efficace. Ce projet est extrêmement flexible : vous pouvez également intégrer différents types de capteurs en fonction de vos besoins spécifiques. Par exemple, un capteur de niveau d’eau peut être ajouté pour détecter et prévenir des inondations. De même, un capteur de lumière peut être utilisé pour surveiller des machines et détecter toute défaillance signalée par le clignotement ou l’allumage d’une LED. Nous avons déjà mis en œuvre avec succès de telles applications !

En outre, l’utilisation d’un capteur de CO2 peut alerter en cas de concentration élevée de CO2, tandis qu’un capteur de température peut envoyer des alertes SMS si la température d’un réfrigérateur de restaurant ou de commerce dépasse les seuils normaux. En fait, notre système est compatible avec tout type de capteur pouvant être connecté à une carte Arduino.

Le système d’alarme que nous construirons est géré par SMS. Il s’active et se désactive via SMS, et envoie une alerte toutes les 40 à 60 secondes en cas de détection d’anomalie, jusqu’à ce que le système soit désactivé.

Description du Fonctionnement du Système d’Alarme SMS Interactif

Ce système d’alarme innovant fonctionne en plusieurs étapes clés pour garantir la sécurité et la facilité d’utilisation :

  1. Accueil et Instructions :

    • À son démarrage, le système envoie un SMS de bienvenue accompagné des instructions nécessaires à l’utilisateur pour activer le détecteur de mouvements.
  2. Attente d’Activation :

    • Le système attend que l’utilisateur envoie le mot « Activation » par SMS pour démarrer la surveillance des mouvements.
  3. Analyse du SMS d’Activation :

    • À la réception du SMS, le système vérifie que le message et le numéro de l’expéditeur correspondent aux critères préétablis. Si les informations sont correctes, le détecteur de mouvements est activé. Sinon, le SMS est rejeté et le détecteur reste désactivé.
  4. Gestion des Commandes Pendant l’Activation :

    • Une fois activé, le système peut gérer deux scénarios :
      • Si l’utilisateur envoie « Stop » par SMS (par exemple, s’il a besoin de revenir dans la pièce), le système désactive le détecteur et revient à l’attente d’une nouvelle activation.
      • Si un mouvement est détecté, le système passe à l’étape suivante.
  5. Envoi d’Alertes :

    • Lorsqu’un mouvement est détecté, un message d’alerte est immédiatement envoyé à l’utilisateur.
  6. Désactivation Temporaire :

    • L’utilisateur a entre 40 et 60 secondes pour répondre avec le mot « Stop » et désactiver temporairement le système. Si le SMS de désactivation provient du bon numéro, le système est désactivé; sinon, les alertes continuent.
  7. Réinitialisation :

    • Après réception du mot « Stop » du bon numéro, le détecteur de mouvements est désactivé et le système retourne à la phase d’attente.

Note Supplémentaire :

  • Pour une personnalisation accrue, le système peut être configuré pour reconnaître d’autres mots-clés. Les messages reçus sont entièrement affichés et analysés pour extraire le numéro de l’expéditeur et le contenu du message, en tenant compte des espaces.

Dans notre programme, le processus d’identification et de traitement des informations reçues par SMS est défini comme suit : le numéro de téléphone de l’expéditeur est toujours situé entre le 10ème et le 20ème caractère du message. Ainsi, nous extrayons ces caractères et les stockons dans une variable nommée numero. Par exemple, si le message contient le numéro 33644757223 à la position spécifiée, celui-ci sera assigné à numero. Cette variable est ensuite utilisée pour vérifier si le numéro correspond à celui autorisé dans notre base de données.

De manière similaire, le mot clé qui déclenche une action, tel que « Activation », se trouve entre le 50ème et le 59ème caractère. Les caractères correspondants sont extraits et placés dans une variable appelée msgRecu. Cette méthode nous permet de comparer efficacement le contenu reçu avec le message attendu pour déclencher des actions spécifiques dans notre système.

Il est également important de noter que la longueur du message peut varier. Dans ce cas, l’extraction doit s’adapter pour capturer le texte à partir du 50ème caractère jusqu’au dernier caractère pertinent du message. Il est essentiel de prendre en compte les espaces, particulièrement si le message contient plusieurs mots.

Pour des commandes simples comme « Stop », qui permet de mettre le système en pause, les caractères sont extraits du 50ème au 53ème. Cette précision garantit que notre système réagit de manière appropriée aux commandes envoyées par l’utilisateur

				
					/*Projet: Alarme avec un SIM800 ou un SIM900
* Auteur: Christian Joseph
* Description: Ce Programme permet d’envoyer un SMS à un destinataire en cas d’activation d’un capteur
* Ex: PIR sensor, Water Sensor, photorésistance,etc…
* Le système s’active et se désactive par SMS
* Date: 08 Juillet 2021
* Website: https://atelierdelarobotique.fr
*/
char incoming_char;
String msgrecu= » »;
String numero = » »;
String bienvenue = « Bonjour, envoyez Activation pour mettre en route ou Stop pour mettre en pause »;
String alerte = « Alerte, erreur sur la machine »;
String alerteStop = « systeme mis en pause »;
String activer = « systeme mis en route »;
int a = 0;
int t = 0;
int r = 1;
int sensorPin = 2;// Broche de notre capteur de mouvement
void setup()
{
pinMode(sensorPin, INPUT);
Serial.begin(9600);
Serial2.begin(9600);// Liaison SIM900 sur le tx2 et rx2 de la carte Arduino Mega
message(bienvenue);// Envoi du message de Bienvenue du système
delay(2000);
}

void loop()
{
actif: delay(10);
configuration();// Activation du mode reception de sms
while(1){ // Boucle infinie d’attente d’activation: le système attent de recevoir un sms avec le mot « Activation »
//(Respecter les majuscules et minuscules et pas d’espace derrière)
activation(); // Attente du SMS avec le mot Activation pour autoriser le système à detecter des mouvements
if( r == 1){//la variable r = 1 si le SMS d’activation est valide
attachInterrupt(digitalPinToInterrupt(sensorPin), etat, HIGH);//Activation de l’autorisation d’interrution lorsque la broche de détecteur (sensorPin) passe à l’état HAUT
// les autres états possibles sont LOW (broche à l’état BAS), CHANGE(sur un changement d’état)
//RISING (état BAS vers état HAUT), FALLING(état HAUT vers état BAS)
// Choisissez l’état désiré en fonction de votre capteur
// Ici on choisi HAUT pour notre capteur de présence, mais on aurait pu choisir BAS
//pour un capteur de lumière pour indiquer que le capteur est exposé à la lumière.
message(activer); //Envoi du SMS de confirmation de mise en route du système
goto process;
}
}
process: // Dans cette boucle, on attend: 1)soit le SMS « Stop » pour désactiver le système. Imaginez vous oubliez vos clés de voiture dans la pièce
// et que vous ayez besoin d’y retourner. Dans ce cas vous envoyez « Stop » pour désactiver le système.
//2) soit notre détecteur se déclenche et le système envoi un message d’alerte. Là aussi il faut envoyer « Stop » pour tout désactiver.
configuration();
msgrecu= » »; //On réinitialise les variable numero et msgrecu
numero = » »;
desactivation1(); // Ceci est la désactivation si je veux entrer dans la pièce lorsque j’ai oublié mes clés par exemple.
if(r==2){ // Dans ce cas la variable r = 2
detachInterrupt(digitalPinToInterrupt(sensorPin));// on arrête toute interruption, sinon le sous-programme d’interruption s’executera sans fin
message(alerteStop); // on envoi le SMS indiquant que le système est mis en Pause
configuration(); //on efface tous les SMS reçus
goto actif;// on retourne au debut du programme en attente du mot « Activation » pour relancer le système
}
while(r == 3){ //la variable r = 3 en cas de détection d’un mouvement (ou de présence de lumière pour un capteur photosensible)
// Tant que r = 3 et SMS « Stop » non reçu, alors le SMS d’alerte est envoyé à l’utilisateur toutes les minutes environs

message(alerte); // Envoi du SMS d’alerte
//delay(2000);
while (Serial2.available() >0 ) {
Serial.print(Serial2.read());
}
configuration();
desactivation();// Attente du sms permettant la désactivation avec le mot « Stop »
//(Respecter les majuscules et minuscules et pas d’espace derrière).
}
message(alerteStop); //Envoi du SMS de mise en pause du système. Le système est désactivé.
while (Serial2.available() >0 ) {
Serial.print(Serial2.read());
}
delay(2000);
goto actif; // retour vers l’attente d’activation du système

}
void etat(){ // Sous-Programme d’interruption en cas de détection
if(digitalRead(sensorPin) == HIGH){ // Broche du capteur à l’état HAUT – Mouvement détecté
Serial.println(« Mouvement detecte »);
r = 3;
detachInterrupt(digitalPinToInterrupt(sensorPin));// Fin d’autorisation d’interruption
Serial.println(« fin interruption »);
 }
}

void message(String a){ //Envoi du message à l’utilisateur
Serial2.println(« AT »);
delay(500);
updateSerial();
Serial2.print(« AT+CMGF=1(antislash)r »); //Activation mode Texte
delay(500);
updateSerial();
Serial2.println(« AT+CMGS=(antislash) »+33644757223(antislash) » »); //Numéro du destinataire
delay(500);
updateSerial();
Serial2.print(a); //Message à envoyer
delay(500);
Serial2.write((char)26); //Envoi du message
delay(1000);
while (Serial2.available() > 0 ) { // On vide le Buffer de l’Arduino
Serial.print(Serial2.read());
}
delay(1000);
}

void updateSerial()
{

delay(500);
while (Serial.available())
{
Serial2.write(Serial.read());
}
while(Serial2.available())
{
Serial.write(Serial2.read());
}
}

void desactivation1(){// Desactivation de l’alarme sans détection de mouvement
while(1){ //on fait une boucle infini
reception2:
if (r == 3){ //Si le capteur se déclenche, r est mis à 3 dans le sous programme d’interruption
goto sortie2; // on sort de la boucle infinie et du sous-programme desactivation1
}
if(Serial2.available() > 0) {
incoming_char=Serial2.read();
if (a > 9 && a < 21){ // récupération du numéro de l’emetteur du SMS
numero += incoming_char; //on récupère le numéro caractère par caractère et on le stocke dans la variable numero
Serial.println(numero);
}
else if (a > 49 && a < 54){ // récupération du message de l’emetteur du SMS
msgrecu += incoming_char; //on récupère le message caractère par caractère et on le stocke dans la variable msgrecu
Serial.println(msgrecu);
}
if (a >= 54){ //Fin de reception et d’exploration du SMS (le sms entier fait 54 caractères)
goto compare2;
}
a++;
}
}
compare2:
if(numero == « 33644757223 » && msgrecu == « Stop »){ //Test si bon numéro entrant et bon message
//autrement n’importe qui pourrait désactiver le système
// Serial.println(« Systeme inactif,reussi merci »);
numero = «  »; //On réinitialise les variable numero et msgrecu
msgrecu = «  »;
a = 0;
r = 2;
t = 0;
incoming_char = 0;
configuration();
delay(2000);
goto sortie2;
}
else{
// Serial.println(« mauvais numéro ou mauvaise commande »);
numero = «  »;//On réinitialise les variable numero et msgrecu
msgrecu = «  »;
a = 0;
t = 0;
r = 1;
incoming_char = 0;
configuration();
goto reception2;
}
sortie2: delay(10);
}

void desactivation(){// Desactivation de l’alarme en cas de détection de mouvement
while(t < 400){ //On fait une boucle qui dure en réalité entre 40s et 1 minute, pour attendre le mot « Stop », sinon on ressort
reception2: //Attente du mot « Stop » par le bon numéro de téléphone
if(Serial2.available() > 0) {
incoming_char=Serial2.read();
if (a > 9 && a < 21){ // récupération du numéro de l’emetteur du SMS
numero += incoming_char; //on récupère le numéro caractère par caractère et on le stocke dans la variable numero
Serial.println(numero);
}
else if (a > 49 && a < 54){ // récupération du message de l’emetteur du SMS
msgrecu += incoming_char; //on récupère le message caractère par caractère et on le stocke dans la variable msgrecu
Serial.println(msgrecu);
}
a++;
if (a >= 54){ //Fin de reception et d’exploration du SMS (le sms entier fait 54 caractères)
goto compare2;
}
}
delay(100);
t++;
}
compare2:
if(numero == « 33644757223 » && msgrecu == « Stop »){ //Test si bon numéro entrant et bon message
//autrement n’importe qui pourrait désactiver le système
Serial.println(« Systeme inactif,reussi merci »);
numero = «  »; //On réinitialise les variable numero et msgrecu
msgrecu = «  »;
a = 0;
r = 0;
t = 0;
incoming_char = 0;
configuration();
delay(2000);
}
else{
Serial.println(« mauvais numéro ou mauvaise commande »);
numero = «  »; //On réinitialise les variable numero et msgrecu
msgrecu = «  »;
a = 0;
t = 0;
incoming_char = 0;
configuration();
}
}

void activation(){ // Activation de l’alarme
while(1){

reception:
if(Serial2.available() > 0) {
incoming_char=Serial2.read();
if (a > 9 && a < 21){ // récupération du numéro de l’emetteur du SMS
numero += incoming_char; //on récupère le numéro caractère par caractère et on le stocke dans la variable numero
Serial.println(numero);
}
else if (a > 49 && a < 60){ // récupération du message de l’emetteur du SMS
msgrecu += incoming_char; //on récupère le message caractère par caractère et on le stocke dans la variable msgrecu
Serial.println(msgrecu);
}

a++;
if (a >= 60){ //Fin de reception et d’exploration du SMS(le sms entier fait 60 caractères)
goto compare;
}
}
}
compare:
if(numero == « 33644757223 » && msgrecu == « Activation »){ //Test si bon numéro entrant et bon message
//autrement n’importe qui pourrait activer le système
// Serial.println(« Systeme actif,reussi merci »);
numero = «  »; //On réinitialise les variable numero et msgrecu
msgrecu = «  »;
a = 0;
r = 1;
incoming_char = 0;
configuration();//Efface le SMS reçu
goto sortie;
}
else{
// Serial.println(« mauvais numéro ou mauvaise commande »);
numero = «  »; //On réinitialise les variable numero et msgrecu
msgrecu = «  »;
a = 0;
configuration();//Efface le SMS reçu
goto reception;
}
sortie: delay(10);
}

void configuration(){ // Activation mode reception de sms
Serial2.println(« AT »);
updateSerial();
Serial2.println(« AT+CMGF=1 »); // Mode Texte
updateSerial();
Serial2.println(« AT+CMGD=1,4 »); // Efface tous les SMS en mémoire
updateSerial();
Serial2.println(« AT+CNMI=1,2,0,0,0 »); // Activation de notification textos entrants
updateSerial();
delay(1000);
while (Serial2.available() >0 ) {
Serial.print(Serial2.read());
}
}
				
			

Conclusion

Ce guide vous a montré comment exploiter le potentiel du module SIM900 en association avec une carte Arduino pour réaliser divers projets de communication et de sécurité. Que ce soit pour l’envoi de SMS et de MMS, la réalisation d’appels, ou la mise en place de systèmes d’alarme sophistiqués, le SIM900 se révèle être un outil extrêmement versatile pour vos initiatives de domotique et d’automatisation. En intégrant ce module à vos projets, vous ouvrez la porte à une myriade de possibilités créatives et pratiques, optimisant ainsi la gestion et la sécurité de votre environnement quotidien.

Nous vous encourageons à expérimenter avec le SIM900 et à découvrir toutes les applications possibles que ce module peut vous offrir. Commencez dès aujourd’hui à transformer vos idées en projets concrets et innovants !

Bonjour ! 🌟 Rejoignez notre newsletter pour ne rien manquer.

Recevez nos offres spéciales et les derniers articles directement dans votre boîte de réception

Nous ne faisons pas de spam, promis ! Consultez notre politique de confidentialité pour en savoir plus.

Retour en haut

Projet sur mesure