View All

Facebook Timeline

APPELS, SMS et MMS avec le module SIM900 et ARDUINO

Posted On: juin 24, 2020

Seen by: 12321

Categories: GSM/GPRS

Author: Christian Joseph

Tags: Sim900 , Arduino Mega , GSM , GPRS , MMS , appels , Arduino , carte SD , Micro SD , SMS

INTRODUCTION:

Le SIM900 est un module GSM/GPRS, lequel combiné à une carte Arduino ou Raspberry Pi permet d'émettre ou de recevoir des appels téléphoniques, des SMS, et des MMS avec des images stockées dans une carte SD ou micro-SD.

Le SIM900 est utilisé dans des applications de contrôle à distance, de domotique, et aussi de sécurité.

Dans ce tutoriel, nous allons:

  • Envoyer et recevoir de SMS
  • Envoyer des MMS
  • Emettre un appel
  • Envoyer un MMS à partir d'une photo prise par une caméra PTC06
  • Créer notre propre système d'alarme avec un détecteur de présence HC-SR501. Vous pouvez aussi utiliser un capteur de température, de niveau d'eau, de lumière ou de CO2 à la place par exemple.

Présentation du module:

SIM900 Pinout

Descrption arrière Sim900

Etape 1: Liste des composants

Etape 2: Shémas de câblage

Arduino SIM900 wiring

ARDUINO MEGASIM900
TX2RX
RX2TX
GNDGND

ARDUINO MEGAMODULE SD
GNDGND
5VVCC
50MISO
51MOSI
52SCK
53CS

Il faut impérativement installer la carte SD ou micro SD et la carte SIM avant la mise sous tension. Il est préférable que le code Pin de la carte SIM soit désactivé, mais il est possible de dévérouiller le code Pin avec le programme Arduino. A la mise sous tension, il faut appuyer au minimum 2 secondes le "Switch ON/OFF" du module SIM900. Si le code Pin est désactivé, la" Led état réseau" clignote toutes les 3 secondes au bout d'un moment, dès que le module SIM900 a terminé son initialisation; autrement dès que le code Pin est desactivé via le programme Arduino, la led clignote toutes les 3 secondes, ce qui signifie que le module SIM900 est bien connecté au réseau mobile.

Attention: pour l'envoi de MMS, le firmware du module doit être mis à jour afin d'être compatible avec la France. C'est pourquoi tous nos modules SIM900  sont mis à jour et sont compatibles MMS avec les réseaux France et Europe.

Etape 3: Programmes Arduino

Les programmes suivants permettent de tester les fonctions du module SIM900, comme l'envoi et la réception des 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 le 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

Etant donné que l'éditeur Blog ne prend pas encore en compte le symbole antislash( Eh oui il l'assimile à du code HTML), il faudra donc remplacer dans le code (antislash) par son symbole, avant de télécharger votre script dans la carte Arduino.

1- 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://www.eagle-robotics.com
*/

#include "SD.h"

#define PWR 31
#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(115200);// modifiez la vitesse si nécéssaire

//car il se peut que votre module Sim900 fonctionne à 9600 bauds par exemple
digitalWrite(PWR,LOW);
delay(10);
digitalWrite(PWR,HIGH);
delay(10);

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(antislash)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(antislash)r"); // Identification du fabricant
}
if(data=='2')
{
Serial2.print("AT+CGMM(antislash)r"); //Identification du modèle
}

if(data=='3')
{
Serial2.print("AT+CGMR(antislash)r"); //Version du Firmware
}

if(data=='4')
{
Serial2.print("AT+CGSN(antislash)r"); //Numéro IMEI
}

if(data=='5')
{
Serial2.print("ATD+33644757223;(antislash)r"); //Appels (ATD+numero à appeler)
}

if(data=='6')
{
Serial2.print("ATH(antislash)r"); //Racrocher un appel
}

if(data=='7') //Envoyer un SMS
{
Serial2.println("AT");
delay(500);
Serial2.print("AT+CMGF=1(antislash)r"); //Activation mode Texte
delay(500);
Serial2.println("AT+CMGS=(antislash)"+33644757223(antislash)""); //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(antislash)r"); //Lire message
}

if(data=='9')
{
Serial2.print("AT+CMGD=1,0(antislash)r"); //Effacer un message
}
if(data=='d')
{
Serial2.print("ATDT(antislash)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=(antislash)"mmsdebitel(antislash)"(antislash)r");
delay(1000);
if(Serial2.available())
{
while(Serial2.available()) Serial.write(Serial2.read());
}
Serial2.print("AT+CMMSCID=1(antislash)r");
delay(1000);
if(Serial2.available())
{
while(Serial2.available()) Serial.write(Serial2.read());
}
Serial2.print("AT+CMMSPROTO=(antislash)"10.143.156.003(antislash)",8080(antislash)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(antislash)r");
delay(1000);
if(Serial2.available())
{
while(Serial2.available()) Serial.write(Serial2.read());
}
Serial2.print("AT+SAPBR=3,1,(antislash)"CONTYPE(antislash)",(antislash)"GPRS(antislash)"(antislash)r");
delay(1000);
if(Serial2.available())
{
while(Serial2.available()) Serial.write(Serial2.read());
}
Serial2.print("AT+SAPBR=3,1,(antislash)"APN(antislash)",(antislash)"mmsdebitel(antislash)"(antislash)r");
delay(1000);
if(Serial2.available())
{
while(Serial2.available()) Serial.write(Serial2.read());
}
Serial2.print("AT+SAPBR=1,1(antislash)r");
delay(4000);
if(Serial2.available())
{
while(Serial2.available()) Serial.write(Serial2.read());
}
Serial2.print("AT+SAPBR=2,1(antislash)r");
delay(1000);
if(Serial2.available())
{
while(Serial2.available()) Serial.write(Serial2.read());
}

Serial2.print("AT+CMMSEDIT=0(antislash)r"); // Efface le Buffer
delay(1000);
if(Serial2.available())
{
while(Serial2.available()) Serial.write(Serial2.read());
}
Serial2.print("AT+CMMSEDIT=1(antislash)r"); // Mode Edition activé
delay(1000);
if(Serial2.available())
{
while(Serial2.available()) Serial.write(Serial2.read());
}
Serial2.print("AT+CMMSDOWN=(antislash)"PIC(antislash)",6651,20000,(antislash)"pic777.jpg(antislash)"(antislash)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=(antislash)"+33644757223(antislash)"(antislash)r"); //Numéro du destinataire du MMS
delay(1000);
if(Serial2.available())
{
while(Serial2.available()) Serial.write(Serial2.read());
}
Serial2.print("AT+CMMSVIEW(antislash)r");
delay(1000);
if(Serial2.available())
{
while(Serial2.available()) Serial.write(Serial2.read());
}
Serial2.print("AT+CMMSSEND(antislash)r"); //Envoi du MMS
delay(1000);
if(Serial2.available())
{
while(Serial2.available()) Serial.write(Serial2.read());
}
Serial2.print("AT+CMMSTERM(antislash)r"); // Fin du MMS
delay(1000);
if(Serial2.available())
{
while(Serial2.available()) Serial.write(Serial2.read());
}
}

Sim900 Terminal Arduino

2 - ENVOI DE SMS A DE MULTIPLES DESTINATAIRES

String message = "Eagle Robotics is Awesome";
String numero[3]= {"0644757223(antislash)"","0606060606(antislash)"", "0770070707(antislash)""}; // 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(antislash)r"); //Activation mode Texte
delay(1000);
Serial2.print("AT+CMGS=(antislash)""); //Numéro du destinataire
Serial2.println(numero[a]);
delay(1000);
//Serial2.print(message);//Message à envoyer
Serial2.write("Eagle Robotics is awesome"); //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

}
}

3 - RECEPTION 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());
  }
}

Et Voilà le résultat:

Lecture SMS Arduino Sim900

4 - ENVOI DE MMS AVEC UNE CAMERA

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

Sim900 Arduino camera ptc06 uart mms sd

ATTENTION: Dans ce programme, la caméra PTC06  doit être reliée à notre carte Arduino Mega sur le port TX2 et RX2, tandis que le SIM900 communique avec l'Arduino Mega sur le TX3 et RX3. Donc il va falloir déplacer les pins de la carte SIM900 du TX2/RX2  vers le TX3/RX3 de l'arduino Mega. La vitesse de transfert est de 38400 bauds. Pensez à redémarrer votre module SIM900 si vous étiez en train de l'utiliser afin de pouvoir l'utiliser à une vitesse de 38400 bauds. (Ne me demandez pas pourquoi, mais ça fonctionne ainsi!)

Lorsque vous aurez téléchargé le programme dans la carte Arduino Mega, ouvrez le moniteur Série afin de voir le flux de données entre la carte Arduino Mega, La caméra PTC06, et le SIM900.

Une fois que vous aurez réussi à faire fonctionner le programme ci-dessous, vous pourrez également ajouter par la suite un détecteur de présence comme le HC-SR501, de sorte que votre carte Arduino prenne une photo et vous l'envoi par MMS en cas de détection de mouvement. ET ENCORE UNE FOIS, ATTENTION AUX MECHANTS (antislash).

#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=(antislash)"http://mms1(antislash)"(antislash)r");
delay(1000);
updateSerial();

Serial3.print("AT+CMMSCID=1(antislash)r");
delay(1000);
updateSerial();

Serial3.print("AT+CMMSPROTO=(antislash)"10.151.0.1(antislash)",8080(antislash)r");
delay(1000);
updateSerial();

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

Serial3.print("AT+SAPBR=3,1,(antislash)"CONTYPE(antislash)",(antislash)"GPRS(antislash)"(antislash)r");
delay(1000);
updateSerial();

Serial3.print("AT+SAPBR=3,1,(antislash)"APN(antislash)",(antislash)"sl2sfr(antislash)"(antislash)r");
delay(1000);
updateSerial();

Serial3.print("AT+SAPBR=1,1(antislash)r");
delay(2000);
updateSerial();

Serial3.print("AT+SAPBR=2,1(antislash)r");
delay(1000);
updateSerial();

Serial3.print("AT+CMMSEDIT=0(antislash)r");
delay(1000);
updateSerial();

Serial3.print("AT+CMMSEDIT=1(antislash)r");
delay(1000);
updateSerial();

Serial3.print("AT+CMMSDOWN=(antislash)"PIC(antislash)","+ taillephoto + ",50000,(antislash)"image7.jpg(antislash)"(antislash)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=(antislash)"+33641363164(antislash)"(antislash)r");
delay(1000);
updateSerial();

Serial3.print("AT+CMMSVIEW(antislash)r");
delay(1000);
updateSerial();

Serial3.print("AT+CMMSSEND(antislash)r");
delay(1000);
updateSerial();

Serial3.print("AT+CMMSEDIT=0(antislash)r");
delay(100);
updateSerial();

Serial3.print("AT+CMMSTERM(antislash)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());
}
}

5 - SYSTEME D'ALARME AVEC LE SIM900

Nous allons maintenant créer un système basé sur le module HC-SR01, lequel est un détecteur de présence. Il est tout à fait possible de le faire aussi avec un capteur de niveau d'eau pour prévenir des inondations, un capteur de lumière pour prévenir  d'une défaillance sur une machine en captant le clignotement ou l'allumage d'une Led ou lampe sur la machine(oui oui nous l'avons déjà fait!) , un capteur de CO2 pour prévenir en cas de présence de Co2, un capteur de température pour prévenir par SMS en cas de température anormale dans un frigo de restaurant ou de magasin, ou encore n'importe quel type de capteur fonctionnant avec les cartes Arduino. 

Notre système d'alarme s'active et se désactive par SMS et il envoi un message d'alerte par SMS toutes les 40 à 60 secondes en cas de détection d'anomalie, jusqu'à ce qu'il soit désactivé. 

N.B Pensez à remplacer (antislash) par son symbole.

Sim900-Alarme-hc-sr501-arduino

Le Programme ci-dessous s'execute en plusieurs phases:

  1. Le système envoi un message de Bienvenue à l'utilisateur avec des instructions
  2. Le système est en attente du mot "Activation pour autoriser la détection de mouvements.
  3. L'utilisateur envoi le mot "Activation" pour activer le système et autoriser la détection de mouvements
  4. Le système reçoit et inspecte le SMS. Si le bon message et le bon numéro sont identifiés, alors le système active le détecteur de mouvements, sinon le système rejette le SMS et le détecteur reste désactivé.
  5. Une fois le détecteur activé, le système peut alors faire face à 2 choix possibles: Soit l'utilisateur envoi le mot "Stop" par SMS si par exemple il veut retourner dans la pièce parce qu'il a oublié ses clés, dans ce cas le système désactive le détecteur et retourne à l'étape 2 dans la phase d'attente du mot "Activation". Soit le détecteur se déclenche et dans ce cas on passe à la phase 6.
  6. Le message d'alerte est envoyé à l'utilisateur
  7. L'utilisateur dispose de 40 à 60 secondes pour envoyer le mot "Stop" et désactiver le système, autrement le message d'alerte est renvoyé à l'utilisateur au bout de ce temps là.
  8. Dès que le mot "Stop" est reçu, le système analyse également si le SMS provient du bon numéro de téléphone, autrement le SMS est rejeté et le message d'alerte continu d'être envoyé à l'utilisateur.
  9. Si le mot "Stop" est bien reçu du bon numéro, le système désactive le détecteur de mouvements et retourne à l'étape 2.

Si vous souhaiter utiliser d'autres mots, la première phase consiste à afficher votre SMS reçu en entier et ensuite la seconde phase permet de compter le nombre de caractères afin d'isoler le numéro entrant et le message reçu (prendre en compte les espaces aussi):

SIM900-Arduino-lecture-SMS

Donc nous savons que le numéro de téléphone commence au 10ème caractère et se termine au 20ème caractère, tandis que le mot "Activation" commence au 50ème caractère et se termine au 59ème caractère.  A partir de là dans notre programme, il nous suffira de dire à notre carte Arduino de concaténer (ou ajouter à la suite) tous les caractères du 10ème au 20ème caractère dans une variable appelée "numero". Dans cet exemple, on aura donc à la fin numero = "33644757223" et on pourra comparer cette variable de type String (ou chaine de caractères) avec le numéro que nous voulons.

Ensuite nous allons faire la même chose en mettant dans la variable "msgrecu" tous les caractères du 50ème au 59ème, et ensuite comparer avec le message que nous attendons de recevoir. Si votre message est plus long ou plus court, il faudra compter à partir du 50ème caractère jusqu'au dernier caractère de votre message. (pensez aussi à compter les espaces si votre message est composé de plusieurs mots).

Pour le mot "Stop" par exemple qui permet de mettre le système sur pause, nous avons compté à partir du caractère 50 au caractère n°53.

/*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://www.eagle-robotics.com
*/
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), 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());
}
}

Pour toutes questions, remarques ou suggestions relatives à ce tutoriel, n'hésitez pas à nous contacter à projet@eagle-robotics.com. (Même à 23h ou minuit si je ne dors pas je vous répondrai!)