L'innovation sans limites

Votre spécialiste en électronique et robotique.

Piloter le module SIMCOM A7670E avec un ESP32 : SMS, commandes AT et GPS

Sommaire

Présentation du module GSM SIMCOM A7670E

Le module SIMCOM A7670E est un module de communication 4G LTE qui intègre également une fonctionnalité GPS, ce qui en fait un choix polyvalent pour les projets connectés et de géolocalisation. Dans ce tutoriel, nous allons apprendre à l’utiliser avec une carte Arduino afin de mettre en œuvre des fonctions essentielles comme l’envoi et la réception de SMS, ainsi que l’acquisition de données GPS pour suivre la position d’un dispositif.

Description du module GSM GPS A7670E
Description du module GSM GPS A7670E
Présentation du module GSM GPS A7670E
Présentation du module GSM GPS A7670E
  1. Puce A7670E
  2. Antenne GPS
  3. Antenne GSM
  4. Indicateur LED GPS
  5. Connecteur Micro USB
  6. Connecteur pour antenne GPS
  7. Connecteur pour carte Micro SIM
  8. Indicateur LED GSM
  9. Connecteur pour antenne GSM

Description des broches :

  • S : Sleep (Mode Sommeil)
  • G : Ground (Masse)
  • V : VCC (+5V à +10V)
  • K : PowerKey (Extinction du module)
  • T : TX (Emission de données)
  • R : RX (Réception de données)
  • G : Ground (Masse)

Montage

Dans cette section, nous listons le matériel nécessaire et présentons le câblage entre une carte ESP32et la carte SIMCOM A7670E

Matériel nécessaire

  • 1 Carte ESP32 WROOM-32
  • 1 carte SIMCOM A7670E
  • 1 câble USB Type-C
  • Câbles de connexion M-M 10 cm
  • 1 Breadboard 400 points
  • 1 Bloc d’alimentation 5V/2A
  • 1 Connecteur Jack 2.1 x 5.5 MM
  • 1 Carte SIM au format Nano SIM
Montage du module A7670E avec la carte ESP32 WROOM
Schéma de montage du module A7670E avec la carte ESP32 WROOM

Tableau récapitulatif

Le tableau ci-dessous indique la correspondance entre les broches numériques de l’ ESP32 WROOM-32 et le module SIMCOM A7670E


ESP32 WROOMModule A7670ELED 5 MM5V/2A
D5T  
D15R  
D18 Anode + (Patte longue) 
GNDGCathode – (Patte courte)
 V +

Mise en route du module A7670E

Branchez les antennes GSM et GPS sur les connecteurs dédiés. Dans ce tutoriel, une carte Nano SIM du réseau ORANGE est utilisée.

À la mise sous tension, l’indicateur LED GSM s’allume d’abord de manière fixe. Après environ 3 secondes, il se met à clignoter à un rythme d’environ une fois par seconde : cela correspond à la phase d’initialisation et de recherche du réseau.

Il faut ensuite patienter une dizaine de secondes pour que le module A7670E puisse se connecter au réseau GSM, à condition que la couverture réseau soit suffisante. 

Il est important de noter qu’il n’y a pas de différence réellement perceptible dans la fréquence de clignotement de la LED entre la phase de recherche de réseau et celle où le module A7670E est effectivement connecté. La LED continue de clignoter de manière similaire tout au long de l’exploitation du module 4G LTE A7670E, ce qui peut prêter à confusion.

C’est pourquoi nous recommandons de prévoir un délai d’au moins une vingtaine de secondes afin de garantir que le module A7670E ait bien le temps de s’enregistrer correctement sur le réseau GSM.

Dans nos programmes Arduino, un délai de 20 secondes a été volontairement ajouté pour couvrir ce temps de connexion. Il est également possible d’alimenter le module A7670E en premier et d’attendre qu’il se connecte avant de mettre sous tension la carte Arduino. Dans ce cas, ce délai peut être réduit, voire supprimé, dans le code Arduino.

Programmation Arduino du module A7670E (Arduino Mega 2560)

Nous allons configurer et programmer le module SIMCOM A7670E boutons avec un ESP32 WROOM-32 pour réaliser plusieurs applications interactives :

  • Envoi de SMS : Le module A7670E envoi un SMS à un numéro de téléphone mobile.
  • Commande par SMS simple : L’utilisateur pilote une LED par SMS via le module A7670E.
  • Commande par SMS avec filtrage de numéro : Seul les utilisateurs autorisés peuvent piloter la LED via le A7670E
  • GPS 1 : Coordonnées GPS et Lien Google MAPS affichés dans le moniteur série. 
  • GPS 2 : Coordonnées GPS + lien Google Maps affichés dans le moniteur série Arduino + envoi par SMS.

Librairies

TinyGPSPlus.h (nécéssaire uniquement pour le GPS)


Envoi de SMS

Ce code Arduino permet à la carte ESP32 d’envoyer un SMS via le A7670E :

				
					#include <HardwareSerial.h>

HardwareSerial sim(1);

// Broches UART
#define RXD2 5
#define TXD2 15

void sendAT(String cmd, int delayTime = 2000) {
  sim.println(cmd);
  delay(delayTime);

  while (sim.available()) {
    Serial.write(sim.read());
  }
}

void setup() {
  Serial.begin(115200);
  sim.begin(115200, SERIAL_8N1, RXD2, TXD2);

  delay(3000);

  Serial.println("Initialisation module GSM...");

  sendAT("AT");            // Test
  sendAT("AT+CPIN?");      // SIM OK ?
  sendAT("AT+CSQ");        // Signal
  sendAT("AT+CREG?");      // Réseau

  // Mode texte SMS
  sendAT("AT+CMGF=1");

  // Numéro destinataire (format international)
  sim.println("AT+CMGS=\"+33644757223\"");
  delay(1000);

  // Message
  sim.print("Bonjour, ceci est un SMS envoye par ESP32");

  // CTRL+Z pour envoyer
  sim.write(26);

  Serial.println("SMS envoyé !");
}

void loop() {
}
				
			

Le résultat attendu

Envoi de SMS avec le A7670E et l'ESP32 WROOM
Envoi de SMS avec le A7670E et l'ESP32 WROOM
Réception du SMS envoyé par l'ESP32 via le A7670E
Réception du SMS envoyé par l'ESP32 via le A7670E

Commande par SMS simple

Le code Arduino suivant permet de piloter de piloter la LED intégrée de la carte ESP32 WROOM grâce à 2 commandes envoyées par SMS au module A7670E :

  • LED ON : Allume la LED
  • LED OFF : Eteint la LED

→ La LED est reliée à la broche D2 de la carte ESP32. libre à vous de modifier le port de commande pour y connecter un module externe (LED 5mm, relais, servomoteur, etc…) .

				
					#include <HardwareSerial.h>

HardwareSerial sim(1);

#define RXD2 5
#define TXD2 15
// LED
#define LED_PIN 18


String smsBuffer = "";
void sendAT(String cmd, int delayTime = 2000) {
  sim.println(cmd);
  delay(delayTime);
  while (sim.available()) {
    Serial.write(sim.read());
  }
}
void setup() {
   // LED
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
  Serial.begin(115200);
  sim.begin(115200, SERIAL_8N1, RXD2, TXD2);

  delay(3000);

  Serial.println("Initialisation GSM...");

  sendAT("AT");
  sendAT("AT+CPIN?");
  sendAT("AT+CSQ");
  sendAT("AT+CREG?");

  // Mode texte
  sendAT("AT+CMGF=1");

  // Notif automatique des SMS reçus
  sendAT("AT+CNMI=2,2,0,0,0");

  Serial.println("Prêt à recevoir des SMS...");
}

void loop() {
  while (sim.available()) {
    char c = sim.read();
    Serial.write(c);
    smsBuffer += c;
  }

  // Détection d'un SMS
  if (smsBuffer.indexOf("+CMT:") != -1) {
    Serial.println("\n--- NOUVEAU SMS ---");

    // Affichage brut
    Serial.println(smsBuffer);

    // Ici tu peux traiter le message
    traiterSMS(smsBuffer);

    smsBuffer = "";
  }
}



// Fonction pour traiter le SMS
void traiterSMS(String sms) {

  if (sms.indexOf("LED ON") != -1) {
    Serial.println("Commande: LED ON");
     digitalWrite(LED_PIN, HIGH);
  }

  if (sms.indexOf("LED OFF") != -1) {
    Serial.println("Commande: LED OFF");
     digitalWrite(LED_PIN, LOW);
  }
}
				
			
Affichage du SMS reçu dans le moniteur série Arduino
Affichage du SMS reçu dans le moniteur série Arduino
Commande de la LED intégrée par SMS
Commande de la LED intégrée par SMS

Commande par SMS avec filtrage de numéro

Le code Arduino ci-dessous permet de piloter une LED connectée à la broche D18 de la carte ESP32 WROOM via les commandes suivantes :

  • LED ON : Allumage de la LED
  • LED OFF : Extinction de la LED
  • STATUS : Etat de la LED (ON ou OFF)

Le code permet de filtrer les numéros de sorte que seuls les numéros autorisés puissent commander la LED : 

				
					#include <HardwareSerial.h>

HardwareSerial sim(1);

#define RXD2 5
#define TXD2 15

// LED
#define LED_PIN 18

// Numéro autorisé
String authorizedNumber = "644757223";

String smsBuffer = "";

//  Fonction commandes AT
void sendAT(String cmd, int delayTime = 2000) {

  sim.println(cmd);

  delay(delayTime);

  while (sim.available()) {
    Serial.write(sim.read());
  }
}

//  Fonction envoi SMS
void sendSMS(String number, String text) {

  Serial.println("Envoi SMS...");

  sim.print("AT+CMGS=\"");
  sim.print(number);
  sim.println("\"");

  delay(1000);

  sim.print(text);

  delay(500);

  sim.write(26); // CTRL+Z

  delay(5000);

  Serial.println("SMS envoye !");
}

void setup() {

  // LED
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);

  Serial.begin(115200);

  sim.begin(115200, SERIAL_8N1, RXD2, TXD2);

  delay(5000);

  Serial.println("Initialisation GSM...");

  sendAT("AT");
  sendAT("ATE0");
  sendAT("AT+CPIN?");
  sendAT("AT+CSQ");
  sendAT("AT+CREG?");

  // Mode texte SMS
  sendAT("AT+CMGF=1");

  // Réception SMS directe
  sendAT("AT+CNMI=2,2,0,0,0");

  Serial.println("Pret a recevoir des SMS...");
}

void loop() {

  while (sim.available()) {

    char c = sim.read();

    Serial.write(c);

    smsBuffer += c;
  }

  // SMS reçu
  if (smsBuffer.indexOf("+CMT:") != -1) {

    delay(500);

    while (sim.available()) {
      char c = sim.read();

      Serial.write(c);

      smsBuffer += c;
    }

    Serial.println("\n--- NOUVEAU SMS ---");

    Serial.println(smsBuffer);

    traiterSMS(smsBuffer);

    smsBuffer = "";
  }
}

//  Traitement SMS
void traiterSMS(String sms) {

  sms.toUpperCase();

  //  Vérification numéro autorisé
  if (sms.indexOf(authorizedNumber) == -1) {

    Serial.println("Numero NON autorise");

    return;
  }

  Serial.println("Numero autorise");

  //  LED ON
  if (sms.indexOf("LED ON") != -1) {

    Serial.println("Commande: LED ON");

    digitalWrite(LED_PIN, HIGH);

    sendSMS("+33644757223", "LED ALLUMEE");
  }

  //  LED OFF
  else if (sms.indexOf("LED OFF") != -1) {

    Serial.println("Commande: LED OFF");

    digitalWrite(LED_PIN, LOW);

    sendSMS("+33644757223", "LED ETEINTE");
  }

  //  STATUS
  else if (sms.indexOf("STATUS") != -1) {

    String etat;

    if (digitalRead(LED_PIN)) {
      etat = "LED ON";
    } else {
      etat = "LED OFF";
    }

    sendSMS("+33644757223", "STATUS: " + etat);
  }

  //  Commande inconnue
  else {

    sendSMS("+33644757223", "Commande inconnue");
  }
}
				
			

Le résultat attendu

SMS reçu dans le moniteur série Arduino
SMS reçu dans le moniteur série Arduino
Commande par SMS d'une LED avec filtrage de numéro
Commande par SMS d'une LED avec filtrage de numéro

En cas de numéro non autorisé, le message suivant s’affiche dans le moniteur série :

Commande par SMS avec le A7670E : Numéro non autorisé

Utilisation du GPS A7670E

Lors de l’utilisation du module A7670E en mode GPS, l’indicateur LED GPS doit s’allumer en Bleu :

LED GPS allumée sur le module A7670E
LED GPS allumée sur le module A7670E.

L’acquisition des données GPS dépend fortement de l’environnement dans lequel se trouve le module A7670E. Il est important d’être dans un environnement dégagé ou dans un bâtiment permettant une bonne réception du signal, sinon de privilégier une utilisation en extérieur afin d’obtenir une meilleure précision et une acquisition plus fiable.

Lors de l’initialisation du GPS, la récupération des coordonnées peut prendre un certain temps avant d’être pleinement opérationnelle, généralement entre 20 secondes et 2 minutes.

Coordonnées GPS et lien Google MAPS

Le programme Arduino ci-dessous permet de récupérer les coordonnées GPS via le module A7670E et de les afficher dans le moniteur série. Il fournit plusieurs informations essentielles, telles que :

  • Le Nombre de satellites
  • La Longitude
  • La Latitude
  • La Date du jour
  • L’Heure
  • La Vitesse
  • L’Altitude
				
					#include <TinyGPS++.h>
#include <HardwareSerial.h>

// Objet GPS
TinyGPSPlus gps;

// UART du A7670E
HardwareSerial sim(1);

// Broches ESP32
#define RXD2 5
#define TXD2 15

void setup() {

  Serial.begin(115200);

  // UART GSM/GPS
  sim.begin(115200, SERIAL_8N1, RXD2, TXD2);

  delay(5000);

  Serial.println("Initialisation GPS...");

  // Activation GPS
  sim.println("AT+CGNSSPWR=1");
  delay(1000);

  // Envoi du flux NMEA
  sim.println("AT+CGNSSTST=1");
  delay(1000);

  // Routage NMEA vers UART
  sim.println("AT+CGNSSPORTSWITCH=0,1");
  delay(1000);

  Serial.println("Attente FIX GPS...");
}

void loop() {

  // Lecture données GPS
  while (sim.available()) {

    char c = sim.read();

    // Debug NMEA brut
    // Serial.write(c);

    gps.encode(c);
  }

  // Position valide
  if (gps.location.isUpdated()) {

    Serial.println("-------- GPS --------");

    Serial.print("Latitude: ");
    Serial.println(gps.location.lat(), 6);

    Serial.print("Longitude: ");
    Serial.println(gps.location.lng(), 6);

    Serial.print("Satellites: ");
    Serial.println(gps.satellites.value());

    Serial.print("Altitude: ");
    Serial.print(gps.altitude.meters());
    Serial.println(" m");

    Serial.print("Vitesse: ");
    Serial.print(gps.speed.kmph());
    Serial.println(" km/h");

    Serial.print("Date: ");
    Serial.print(gps.date.day());
    Serial.print("/");
    Serial.print(gps.date.month());
    Serial.print("/");
    Serial.println(gps.date.year());

    Serial.print("Heure UTC: ");
    Serial.print(gps.time.hour());
    Serial.print(":");
    Serial.print(gps.time.minute());
    Serial.print(":");
    Serial.println(gps.time.second());

    //  Lien Google Maps
    Serial.print("Google Maps: ");
    Serial.print("https://maps.google.com/?q=");
    Serial.print(gps.location.lat(), 6);
    Serial.print(",");
    Serial.println(gps.location.lng(), 6);

    Serial.println("---------------------");

    delay(3000);
  }

  // Aucun signal GPS
  if (millis() > 10000 && gps.charsProcessed() < 10) {

    Serial.println("Aucune donnee GPS recue");

    delay(2000);
  }
}
				
			
Le résultat attendu
Coordonnées GPS du A7670E et lien Google MAPS
Coordonnées GPS du A7670E et lien Google MAPS

Coordonnées GPS + lien Google Maps par SMS 

Le code Arduino ci-dessous permet d’acquérir les coordonnées GPS du module A7670E (Longitude et Latitude), et de les envoyer par SMS à un utilisateur avec le lien Google Maps en prime :

				
					#include <TinyGPS++.h>
#include <HardwareSerial.h>

// GPS
TinyGPSPlus gps;

// UART A7670E
HardwareSerial sim(1);

// Broches ESP32
#define RXD2 5
#define TXD2 15

// Numéro destination
String numero = "+33644757223";

// Variable anti spam
bool smsEnvoye = false;

void setup() {

  Serial.begin(115200);

  // UART GSM/GPS
  sim.begin(115200, SERIAL_8N1, RXD2, TXD2);

  delay(5000);

  Serial.println("Initialisation module...");

  //  SMS texte
  sim.println("AT+CMGF=1");
  delay(1000);

  //  Activation GPS
  sim.println("AT+CGNSSPWR=1");
  delay(1000);

  // Flux NMEA
  sim.println("AT+CGNSSTST=1");
  delay(1000);

  // Routage UART
  sim.println("AT+CGNSSPORTSWITCH=0,1");
  delay(1000);

  Serial.println("Attente FIX GPS...");
}

void loop() {

  // Lecture GPS
  while (sim.available()) {

    char c = sim.read();

    gps.encode(c);
  }

  // GPS valide
  if (gps.location.isUpdated()) {

    double lat = gps.location.lat();
    double lon = gps.location.lng();

    Serial.println("-------- GPS --------");

    Serial.print("Latitude: ");
    Serial.println(lat, 6);

    Serial.print("Longitude: ");
    Serial.println(lon, 6);

    //  Lien Google Maps
    String maps =
      "https://maps.google.com/?q=" +
      String(lat, 6) +
      "," +
      String(lon, 6);

    Serial.println(maps);

    Serial.println("---------------------");

    //  Envoi SMS UNE SEULE FOIS
    if (!smsEnvoye) {

      String sms =
        "Position GPS:\nLat: " +
        String(lat, 6) +
        "\nLon: " +
        String(lon, 6) +
        "\n" +
        maps;

      sendSMS(numero, sms);

      smsEnvoye = true;
    }

    delay(3000);
  }

  // Pas de GPS
  if (millis() > 10000 && gps.charsProcessed() < 10) {

    Serial.println("Aucune donnee GPS");

    delay(2000);
  }
}

//  Fonction envoi SMS
void sendSMS(String number, String text) {

  Serial.println("Envoi SMS...");

  sim.print("AT+CMGS=\"");
  sim.print(number);
  sim.println("\"");

  delay(1000);

  sim.print(text);

  delay(500);

  sim.write(26); // CTRL+Z

  delay(5000);

  Serial.println("SMS envoye !");
}
				
			
Le résultat attendu
Coordonnées GPS du module A7670E dans le moniteur série Arduino
Coordonnées GPS du module A7670E dans le moniteur série Arduino
Affichage de la localisation GPS dans Google Maps sur le smartphone
Affichage de la localisation GPS dans Google Maps sur le smartphone

Conclusion

Ce tutoriel vous a permis de découvrir les bases d’utilisation du module A7670E avec une carte ESP32, en mettant en œuvre des fonctionnalités concrètes et directement exploitables. Vous avez appris à envoyer et recevoir des SMS, à piloter des éléments matériels comme une LED à distance via SMS, mais aussi à exploiter le GPS intégré pour acquérir des coordonnées, les afficher et même les transmettre sous forme de lien Google Maps.

Ces différentes briques constituent une base solide pour de nombreux projets connectés. À partir de ce que vous venez de mettre en place, il est tout à fait possible d’aller plus loin en développant des systèmes de suivi de véhicules, des solutions de domotique contrôlées à distance, des dispositifs d’alerte (intrusion, coupure de courant, capteurs environnementaux), ou encore des applications industrielles de télémétrie. Le module A7670E, associé à l’ESP32, ouvre ainsi la voie à une large gamme de projets IoT autonomes, capables de communiquer et d’interagir avec leur environnement, même sans connexion Wi-Fi.

Il ne vous reste plus qu’à continuer d’explorer, tester et inventer vos propres applications… Les possibilités sont quasiment infinies !

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.

Panier
Retour en haut