View All

Facebook Timeline

MEGAZORD ACTIVATED: Appels, SMS, MMS et Autostart avec le shield SIM800C, le shield Carte SD et Arduino UNO

Posted On: juil. 27, 2021

Seen by: 4514

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 ou utiliser le mode AutoStart pour allumer ou éteindre le module à l'aide du programme Arduino (Voir chapitre 4).

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.

3-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
  }
 
 
}
 

3-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-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. Je vous suggère aussi d'utiliser une carte de 4GB ou 8GB avec Arduino. Au-delà, la carte risque de ne pas être reconnue par le système Arduino.

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,50000,(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 50 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());
  }
}

4- AUTOSTART: Allumer ou éteindre votre SIM800 avec le software Arduino

Le module SIM800C dispose d'une broche permettant d'allumer ou d'éteindre le module à l'aide du programme Arduino, sans avoir besoin de toucher au bouton ON/OFF.

Cette broche est reliée à la broche 9 de notre carte Arduino UNO. Il suffit de passer cette broche à l'état HAUT pendant 4 secondes environs, puis de la remettre à l'état BAS. Si le module est éteint lorsque vous appliquez cette procédure, alors le module SIM800 s'allumera, mais si le module est allumé, alors cette procédure permettra de l'éteindre.

Ainsi vous disposez d'un moyen d'allumer ou d'éteindre votre module SIM800C à l'aide du soft Arduino de cette manière:

void setup() {
  // configuration de la broche 9 en SORTIE
pinMode(9, OUTPUT);
delay(1000);
}

void loop() {
  //Procédure pour allumer ou éteindre le module SIM800C selon son état initial
digitalWrite(9, HIGH);
delay(4000);
digitalWrite(9, LOW);
delay(15000);  // on allume ou on éteint le module toutes les 15 secondes

}

Pour toute question, remarque ou demande d'aide relative à ce tutoriel n'hésitez pas à nous contacter sur projet@eagle-robotics.com.