View All

Facebook Timeline

Appels, SMS, et MMS avec le shield SIM800C, le shield Carte SD et Arduino UNO

Posted On: juil. 27, 2021

Seen by: 413

Categories: GSM/GPRS

Author: Christian Joseph

Tags: sim800c , arduino uno , carte sd , shield

Si vous avez déjà regardé LES POWER RANGERS, alors vous savez que dans tous les épisodes (pratiquement!), chaque personnage fait appel à son robot personnel à un moment donné (vous savez, ce moment où le méchant devient plus haut que des immeubles!) et ensuite ils assemblent leur robots respectifs pour former un robot géant unique appelé le MEGAZORD. Quant à nous nous n'allons pas affronter un méchant de haute taille, mais nous allons envoyer des SMS, des MMS, et émettre des appels avec notre MEGAZORD constitué d'une carte Arduino UNO, d'un Shield Carte SD, et enfin un Shield GSM SIM800C.

1 - Présentation du module SIM800C

Le Shield SIM800C est un module GSM GPRS compatible avec la 2G et permet d'envoyer des SMS, des MMS et des Appels.

Le Shield SIM800C est conçu pour fonctionner avec les cartes Arduino UNO et MEGA et peut être alimenté soit via la carte Arduino, soit par une alimentation externe. Dans ce tutoriel, nous l'alimentons au plus simple via la carte Arduino UNO. Nous aurons naturellement besoin d'une carte Nano SIM, et d'une carte SD (ou micro) de 4Go au moins.

A la mise sous tension de la carte Arduino, la LED PWR (sous entendu POWER) du Shield SIM800C s'allume, mais le Shield n'est toujours pas reveillé. Dans ce cas il faut appuyer sur le bouton On/OFF du Shield pendant au moins 3 secondes pour allumer (ou éteindre aussi) le module SIM800C.

Pour indiquer à l'utilisateur que le module est réveillé, la LED STA (pour STATUS = ETAT) s'allume, et la LED NET (pour NETWORK = RESEAU) clignote rapidement au début (Recherche du réseau), puis toutes les 3 secondes environs (réseau trouvé). Votre Shield est alors opérationnel et peut donc émettre des APPELS, des SMS, et des MMS.

Présentation du Shield SIM800C

2 - LE MEGAZORD

Power rangers arduino sd sim800c

Arduino UNO SD SIM800C Megazord

3 - LES PROGRAMMES ARDUINO

Etant donné que l'éditeur Blog ne prend pas encore en compte le symbole antislash (ou Backslash en anglais), qu'il assimile à du code HTML et donc l'ignore, il faudra alors remplacer dans le code le mot (Antislash) par son symbole, avant de télécharger le script dans votre carte Arduino UNO. Petite astuce: ouvrez l'IDE Arduino et copiez le code dessus, puis faites Ctrl + F et vous obtenez ceci:

Remplacer mot dans Arduino IDE SIM800C

Dans la case "Trouver", renseignez le mot (Antislash), et mettez son symbole dans la case "Remplacer par", puis cliquez sur "Tout remplacer"

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

1) APPELS

Une fois que vous aurez téléchargé le code ci-dessous, ouvrez le moniteur série de l'IDE ARDUINO pour envoyer votre commande + ENTREE, comme par exemple 2 pour l'identification du modèle de module GSM, 3 pour la version de  Firmware, 5 pour appeler un numéro de téléphone, 6 pour décrocher un appel, ou encore 7 pour raccrocher. (voir image ci-dessous)

SIM800C - Arduino - Appels et SMS

SIM800C-Arduino-Pick-a-call-Decrocher un appel

/*
Projet: APPELS avec le Shield SIM800C
Auteur: Christian Joseph
Cartes utilisées: Arduino UNO + Shield SIM800C
Date: 21/07/2021
Website: https://www.eagle-robotics.com
*/
#include "SoftwareSerial.h"

SoftwareSerial SIM800 (7,8);
unsigned char data=0;

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

void loop()
{ //Entrer des valeurs depuis le moniteur série pour activer les fonctions du SIM800C:
//1,2,3,4,5,6,7,8,9
  if(SIM800.available())
  {
    while(SIM800.available())
    {
      data=SIM800.read();
      Serial.write(data);
    }
    data=0;
  }
 
  if(Serial.available())
  {
    data=Serial.read();
  }  
   if(data=='p')
  {
    SIM800.print("AT+CPIN=2107(Antislash)r"); //Faire le code Pin carte SIM si activé (remplacer 2107 par votre pin)
                                     // Si code Pin désactivé, ignorer
  }  
  if(data=='1')
  {
    SIM800.print("AT+CGMI(Antislash)r"); // Identification du fabricant
  }  
  if(data=='2')
  {
    SIM800.print("AT+CGMM(Antislash)r"); //Identification du modèle
  }
 
  if(data=='3')
  {
    SIM800.print("AT+CGMR(Antislash)r"); //Version du Firmware
  }
 
  if(data=='4')
  {
    SIM800.print("AT+CGSN(Antislash)r"); //Numéro IMEI
  }
 
  if(data=='5')
  {
    SIM800.print("ATD+33644757223;(Antislash)r"); //Appeler un numéro
  }
 
  if(data=='6')
  {
    SIM800.print("ATA(Antislash)r"); //Décrocher un appel
  }
 
  if(data=='7')
  {
    SIM800.print("ATH(Antislash)r"); //Raccrocher un appel
  }
 
 
}
 

2) ENVOI DE SMS

En ce qui concerne l'envoi de SMS, le module SIM800C comme la plupart de ses congénaires supporte très mal les accents en mode Texte. En fait il ne supporte que la notation anglo-saxonne (En Français cela veut dire qu'il faut éviter les accents quoi!). Si néanmoins vous désirez envoyer des accents, il vous faudra passer au mode PDU, mais qui est quand même Archi complexe. Mais en attendant il faudra vous contenter d'écrire "les chaussettes de l'Archiduchesse sont seches"

/*
 * Projet: Envoi de SMS avec le Shield SIM800C
 * Cartes utilisées: Arduino UNO + Shield SIM800C
 * Auteur: Christian Joseph
 * Date: 22/07/2021
 * Website: www.eagle-robotics.com
 */
#include "SoftwareSerial.h" // Librarie pour la communication Série
SoftwareSerial SIM800(7, 8); // //Utilisation du port virtuel de la SIM800C


String message = "";   // Donnée pour enregistrer le message à envoyer


void setup()
{
  SIM800.begin(9600); //Démarrage liaison série avec le module SIM800
  Serial.begin(9600);//Démarrage liaison série arduino <-> PC
 

delay(30000); // Si votre module SIM800C n'est pas allumé, ce délai de 30 secondes vous laisse le temps d'appuyer sur le bouton ON du SIM800 et ce délai permet aussi au module SIM800C de se connecter au réseau mobile

                      // Si votre module est déjà allumé, alors vous pouvez ramener ce délai à 2 ou 3 secondes par exemple en remplaçant 30000 par 2000 ou 3000


}

void loop()
{
 message = "Bonjour cher utilisateur,Je suis le MEGAZORD Arduino";
 send_message(message);
 delay(3000);
 message = "Je suis fait de Arduino Uno + Shield SD + Shield SIM800C";
 send_message(message);
 
 while(1); // Boucle infinie de fin de programme
}


void send_message(String message) //Envoi du SMS
{
 
  SIM800.println("AT"); //Réveil du module SIM800C
  delay(1000);
  updateSerial();
  SIM800.println("AT+CMGF=1");    //Module GSM en mode Texte
  updateSerial();
  delay(1000);  
  SIM800.println("AT+CMGS=(Antislash)"+33644757223(Antislash)""); // Numéro du destinataire
  updateSerial();
  delay(1000);
  SIM800.print(message);   // Message à envoyer
  delay(1000);
  updateSerial();
  SIM800.write((char)26);  // Envoi du message
  delay(1000);  
}
void updateSerial() // Permet d'afficher l'echange de données entre L'arduino Uno et le Shield SD
{

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

3) ENVOI DE MMS

Pour l'envoi de MMS nous allons enregistrer notre image à envoyer dans la carte SD ou micro SD, et nous utiliserons les paramètres de l'Opérateur SFR. Notre image s'appelle "Pic777.jpg", mais libre à vous de renommer vos images comme bon vous semble.

Pour les autres opérateurs, voici les données à remplacer dans le code:

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

LA POSTE MOBILE/ CMMSCURL = mmsdebitel; CMMSPROTO = 10.143.156.003; APN =mmsdebitel

Vous devez connaître la taille (ou le poids en octets) de votre image à envoyer. Pour cela, avant de l'enregistrer dans votre carte SD, faites click droit dessus > Propriétés:

Taille de l'image MMS

Lorsque vous aurez téléchargé le code ci-dessous, ouvrez le moniteur série de l'IDE ARDUINO afin de voir les échanges entre les cartes Arduino, Shield carte SD et shield SIM800C comme ceci:

Moniteur série Arduino SIM800C Carte SD

Moniteur série arduino mms sim800c

/*
 * Projet: Envoi de MMS à partir d'une carte SD
 * Cartes utilisées: Arduino UNO + Shield SIM800C + Shield SD CARD
 * Auteur: Christian Joseph
 * Date: 22/07/2021
 * Website: www.eagle-robotics.com
 */
#include "SPI.h"
#include "SD.h"
#include "SoftwareSerial.h"

#define  CS    10

SoftwareSerial SIM800 (7,8); //Utilisation du port virtuel de la SIM800C

File dataFile;
int a;
unsigned char data=0;

void setup()
{
  pinMode(CS,OUTPUT);
  SIM800.begin(9600); //Démarrage liaison série avec le module SIM800
  Serial.begin(9600);//Démarrage liaison série arduino <-> PC
  while (!Serial) {
  }

// Initialisation Shield CARTE SD
  Serial.print("Initialisation Carte SD...");

  if (!SD.begin(CS)) {
    Serial.println("initialisation KO!");
    return;
  }
  Serial.println("initialisation Faite.");

//Fin d'initialisation
  delay(30000); // Si votre module SIM800C n'est pas allumé, ce délai de 30 secondes vous laisse le temps d'appuyer sur le bouton ON du SIM800 et ce délai permet aussi au module SIM800C de se connecter au réseau mobile

                      // Si votre module est déjà allumé, alors vous pouvez ramener ce délai à 2 ou 3 secondes par exemple en remplaçant 30000 par 2000 ou 3000
    
}

void loop()
{
  sendMMS();// Sous-programme d'envoi de MMS
  while(1); // Boucle infinie de fin de programme
}

void sendMMS()
{
   SIM800.println("AT");
  delay(1000);
 updateSerial();
 
  SIM800.println("AT+CMMSINIT"); // Activation du Mode MMS
  delay(1000);
 updateSerial();
 
  SIM800.print("AT+CMMSCURL=(Antislash)"mms1(Antislash)"(Antislash)r");
  delay(1000);
  updateSerial();
 
  SIM800.print("AT+CMMSCID=1(Antislash)r");
  delay(1000);
  updateSerial();
 
  SIM800.print("AT+CMMSPROTO=(Antislash)"10.151.0.1(Antislash)",8080(Antislash)r");
  delay(1000);
  updateSerial();
 
  SIM800.print("AT+CMMSSENDCFG=6,3,0,0,2,4,1,0(Antislash)r");
  delay(1000);
  updateSerial();
 
  SIM800.print("AT+SAPBR=3,1,(Antislash)"CONTYPE(Antislash)",(Antislash)"GPRS"r");
  delay(1000);
  updateSerial();
 
  SIM800.print("AT+SAPBR=3,1,(Antislash)"APN(Antislash)",(Antislash)"sl2sfr(Antislash)"(Antislash)r");
  delay(1000);
  updateSerial();
 
  SIM800.print("AT+SAPBR=1,1(Antislash)r");
  delay(4000);
  updateSerial();
 
  SIM800.print("AT+SAPBR=2,1(Antislash)r");
  delay(1000);
  updateSerial();

  SIM800.print("AT+CMMSEDIT=0(Antislash)r"); // On vide la mémoire du SIM800C, autrement les MMS envoyés précédemment pourraient être envoyés avec le nouveau MMS.
  delay(100);
  updateSerial();
 
  SIM800.print("AT+CMMSEDIT=1(Antislash)r");
  delay(1000);
  updateSerial();
   
  SIM800.print("AT+CMMSDOWN=(Antislash)"PIC(Antislash)",6589,20000,(Antislash)"pic777.jpg(Antislash)"(Antislash)r"); //Ici on indique au module SIM800C qu'on va lui envoyer une image appelée "pic777.jpg" pesant 6589 octets à partir de la carte SD dans un délai maximal de 20 secondes. Augmentez le délai si nécessaire en fonction de la taille de votre image, car plus l'image est grande, plus il faut du temps pour la télécharger vers le module SIM800C. Si le temps est trop court, votre image ne sera pas entièrement chargée et vous aurez une erreur.

  delay(1000);
  updateSerial();
 

  dataFile=SD.open("pic777.jpg"); // Ouverture de notre image Pic777.jpg image dans la carte SD
  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();
      SIM800.write(data);                //Envoi de l'image Octet par Octet vers le SIM800C
    }
    dataFile.close();
    
  }  
  else
  {
    Serial.println("erreur ouverture du fichier");
  }

  delay(1000);
  SIM800.print("AT+CMMSRECP=(Antislash)"+33644757223(Antislash)"(Antislash)r"); // Numéro de téléphone du destinataire
  delay(1000);
  updateSerial();
 
  SIM800.print("AT+CMMSVIEW(Antislash)r"); // Visualisation du MMS avant envoi
  delay(1000);
  updateSerial();
 
  SIM800.print("AT+CMMSSEND(Antislash)r"); // Envoi du MMS
  delay(1000);
  updateSerial();
 
  SIM800.print("AT+CMMSEDIT=0(Antislash)r"); // On efface la mémoire du SIM800C
  delay(100);
  updateSerial();
 
  SIM800.print("AT+CMMSTERM(Antislash)r"); // Sortie du mode MMS
  delay(1000);
 updateSerial();
}

void updateSerial()
{

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

Pour toute question, remarque ou demande d'aide relative à ce tutoriel n'hésitez pas à nous contacter sur projet@eagle-robotics.com. (Il paraît même qu'il répondent des fois à 23h voir minuit).