Guide : LILYGO T-SIM7000G ESP32 (LTE, GPRS, GPS)

Guide : LILYGO T-SIM7000G ESP32 (LTE, GPRS, GPS)

Démarrez avec l’ESP32 et le module SIM7000G LTE/GPS/GPRS. Tout au long de ce didacticiel, nous utiliserons la carte LILYGO T-SIM7000G ESP32 qui combine la puce ESP32, le module SIM7000G, l’emplacement pour carte microSD, le support de batterie et le chargeur sur la même carte. Outre le Wi-Fi et le Bluetooth, vous pouvez communiquer avec cette carte ESP32 par SMS. Vous pouvez également le connecter à Internet en utilisant le plan de données de votre carte SIM et obtenir la position GPS.

Premiers pas avec LILYGO T-SIM7000G ESP32 LTE GPRS GPS

Présentation du LILYGO T-SIM7000G ESP32

Le LILYGO T-SIM7000G est une carte de développement ESP32 avec une puce SIM7000G. Cela ajoute LTE (4G), GPS et GPRS à votre carte. Cela signifie qu’avec cette carte, vous pouvez envoyer des SMS, obtenir l’emplacement et l’heure à l’aide du GPS et la connecter à Internet à l’aide d’un plan de données de carte SIM. Ce tableau ne prend pas en charge les appels téléphoniques.

LILYGO T-SIM7000G ESP32

Outre le module SIM7000G, la carte est également livrée avec des fonctionnalités intéressantes comme un support de batterie pour une batterie 18650, un circuit de charge de batterie où vous pouvez connecter des panneaux solaires pour recharger la batterie et un emplacement pour carte microSD qui peut être utile pour les projets d’enregistrement de données. ou pour enregistrer les paramètres de configuration.

Voici un résumé des caractéristiques de la carte LILYGO T-SIM7000G ESP32 :

  • Tension d’alimentation : 3,3 V CC ou 5 V CC
  • Puce ESP32 (module WROVER-B) (processeur double cœur 240 MHz)
  • Mémoire flash : 4 Mo
  • PSRAM : 8 Mo
  • SRAM : 520 Ko
  • Wi-Fi intégré
  • Bluetooth intégré
  • Convertisseur USB vers série : CP2104 ou CH9102 (pilotes)
  • Module SIM7000G intégré
  • Fente pour carte nano SIM intégrée
  • Fente d’antenne SIM intégrée
  • Fente d’antenne GPS intégrée
  • Circuit de charge de batterie Li-ion/Li-Po intégré :
    • Circuit intégré de protection de la batterie DW01A
    • Interface de charge d’énergie solaire CN3065 pour panneau solaire 4.4-6.8V
    • Support de batterie 1x 18650 intégré
    • Connecteur panneau solaire intégré 2p JST-PH
  • Fente pour carte Micro SD intégrée
  • Interrupteur marche/arrêt intégré

Pour utiliser les capacités de cette carte, vous devez disposer d’une carte nano SIM avec un plan de données et un Câble USB-C pour télécharger le code sur la carte.

Le forfait comprend une antenne externe pour LTE et une autre antenne pour GPS.

Antenne GPS ESP32 SIM7000G et antenne SIM

Il existe deux versions de cette carte (Version 20191227 et version 20200415). L’image ci-dessous montre les deux versions. Visuellement, ils diffèrent principalement sur la position du support de la carte nano SIM.

LILYGO ESP32 SIM7000G ANCIEN VS NOUVEAU MODÈLE

La première version avait quelques problèmes de conception, il est donc recommandé d’obtenir la dernière version. De plus, la dernière version est livrée avec quelques améliorations prenant en compte les commentaires des utilisateurs. J’ai eu ma planche il y a longtemps, j’ai la première version et c’est celle-là que nous allons utiliser tout au long de ce tutoriel. Cependant, cela est également compatible avec la dernière carte.

Voici une liste des améliorations apportées à la dernière version (vérifier la documentation):

  • Ajout du contrôle de puissance de l’antenne GPS active, lorsque le module GPIO 4 n’est pas allumé, l’antenne ne consomme que le courant statique du LDO ;
  • Remplacement de TP4056 par CN3065 pour la gestion de l’entrée de charge solaire ;
  • Protection de batterie inversée ajoutée ;
  • Protection supplémentaire contre les surcharges de batterie ;
  • Ajout d’une protection contre les décharges excessives de la batterie.

Vous pouvez consulter les schémas de principe de chaque version sur les liens suivants :

Où acheter LILYGO T-SIM7000G ESP32 ?

Vérifiez le lien suivant :

Tous les magasins du lien précédent devraient vendre la dernière version, mais revérifiez la page du produit, juste au cas où le vendeur changerait quelque chose.

Vous pouvez utiliser les liens précédents ou accéder directement à MakerAdvisor.com/tools pour trouver toutes les pièces pour vos projets au meilleur prix !

Guide LILYGO T SIM7000G ESP32 LTE GPRS GPS

Brochage LILYGO T-SIM7000G ESP32

Les images suivantes montrent le brochage de la carte T-SIM7000G ESP32.

Il s’agit du brochage de la version V1.0.

Et voici le brochage de la carte améliorée V1.1.

Le tableau suivant montre les connexions entre l’ESP32 et la puce SIM7000G :

SIM7000G ESP32
TX GPIO 26
RX GPIO 27
POUVOIR GPIO 4

Pour communiquer avec la carte microSD, vous avez besoin du protocole de communication SPI. Voici les GPIO utilisés :

Carte MicroSD (carte TF) ESP32
MOSI GPIO 15
SCLK GPIO 14
CS GPIO 13
MISO GPIO 2

Carte SIM

Cette carte ne prend en charge que les cartes nano SIM. Vous avez besoin d’une carte SIM pour LTE et GPRS. Cependant, si vous souhaitez uniquement utiliser les données GPS, vous n’avez pas besoin de carte SIM.

Carte nano SIM LILYGO T-SIM7000G ESP32

Pour utiliser LTE et GPRS, vous avez besoin d’une carte SIM avec un plan de données. Cela peut être coûteux dans certains pays, il peut donc être prohibitif en fonction du montant pour lequel vous pouvez obtenir un forfait de données dans votre pays.

Là où nous vivons (Portugal), nous pouvons obtenir une carte SIM avec forfait de données, appels et SMS (assez pour les projets ESP32) pour environ 12 $. Nous vous recommandons d’utiliser une carte SIM avec un forfait prépayé ou mensuel, afin que vous sachiez exactement combien vous allez dépenser. Il existe également des entreprises spécialisées dans les cartes SIM pour les projets IoT.

Détails APN

Pour connecter votre carte SIM à Internet, vous devez disposer des détails APN de votre fournisseur de forfait téléphonique. Vous avez besoin du nom de domaine, du nom d’utilisateur et du mot de passe.

Dans mon cas, j’utilise Vodafone Portugal. Si vous recherchez les paramètres GPRS APN suivis du nom de votre fournisseur de forfait téléphonique (dans mon cas, c’est: « GPRS APN Vodafone Portugal »), vous pouvez généralement trouver dans un forum ou sur leur site Web toutes les informations dont vous avez besoin.

Il peut être un peu difficile de trouver les détails si vous n’utilisez pas un fournisseur bien connu. Ainsi, vous devrez peut-être les contacter directement.

Commandes AT

Les commandes AT sont utilisées pour contrôler les MODEM, comme c’est le cas du SIM7000G. Dans le cas de l’ESP32, vous envoyez les commandes AT via le protocole de communication série. Ensuite, le modem répond également via une communication série.

Il existe quatre types de commandes AT : test ; lire; ensemble; exécution. Vous pouvez trouver la liste complète des commandes AT pour le SIM7000G sur le lien suivant :

Voici quelques-unes des commandes AT les plus courantes :

  • vérifier la communication avec le module : AT
  • vérifiez si la carte SIM est prête : AT+CPIN ?
  • vérifier l’état d’enregistrement de l’appareil : AT+CGREG ?
  • envoyer un SMS à un numéro : AT+CMGS=PHONE_NUMBER(au format international)

Bibliothèques

Comme nous l’avons expliqué précédemment, l’ESP32 communique avec la puce SIM7000G en envoyant des commandes AT via une communication série. Vous n’avez pas besoin d’une bibliothèque, vous pouvez simplement établir une communication série avec le module et commencer à envoyer des commandes AT.

Cependant, il pourrait être plus pratique d’utiliser une bibliothèque. Par exemple, le TinyGSM La bibliothèque sait quelles commandes envoyer et comment gérer les réponses AT, et intègre cela dans l’interface standard du client Arduino – c’est la bibliothèque que nous utiliserons dans ce didacticiel.

Installation de la bibliothèque TinyGSM

Ouvrez votre IDE Arduino et accédez à Sketch> Inclure la bibliothèque> Gérer les bibliothèques. Le gestionnaire de bibliothèque devrait s’ouvrir. Recherchez TinyGSM. Sélectionnez la bibliothèque TinyGSM de Volodymyr Shymanskyy.

Installer la bibliothèque TinyGSM Arduino IDE

Vous devez également installer la bibliothèque StreamDebugger. Accédez à Sketch > Inclure la bibliothèque > Gérer les bibliothèques, recherchez StreamDebugger et installez-le.

installer la bibliothèque de débogage de flux

Préparation de la carte LILYGO T-SIM7000G ESP32

Avant de tester votre carte, vous devez suivre les étapes suivantes :

1) Insérez une carte nano SIM ;

Carte Nano SIM vodafone

2) Connectez l’antenne Full Band LTE (SIM);

3) Connectez l’antenne GPS.

Antennes ESP32 T-SIM7000G

Si vous souhaitez tester les fonctionnalités de la carte microSD, vous ne devez connecter une carte microSD qu’après avoir téléchargé le code.

Test réseau LILYGO T-SIM7000G ESP32

Le premier croquis que vous devez exécuter sur votre carte est le test réseau. Cela vous indiquera les paramètres de sélection de réseau que vous devez utiliser – cela dépend de la carte SIM, du modem (SIM7000G) et de l’opérateur de réseau mobile qu’il utilise.

  1. Copiez le code suivant dans votre IDE Arduino (le code a été adapté de cet exemple).
/*
  Rui Santos
  Complete project details at https://Raspberryme.com/lilygo-t-sim7000g-esp32-lte-gprs-gps/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

// Original code: https://github.com/Xinyuan-LilyGO/LilyGO-T-SIM7000G/blob/master/examples/Arduino_NetworkTest/Arduino_NetworkTest.ino

#define TINY_GSM_MODEM_SIM7000
#define TINY_GSM_RX_BUFFER 1024 // Set RX buffer to 1Kb

#define SerialAT Serial1
// Set serial for debug console (to the Serial Monitor, default speed 115200)
#define SerialMon Serial

// See all AT commands, if wanted
// #define DUMP_AT_COMMANDS

// set GSM PIN, if any
#define GSM_PIN ""

// Your GPRS credentials, if any
const char apn[]  = "";     //SET TO YOUR APN
const char gprsUser[] = "";
const char gprsPass[] = "";

#include <TinyGsmClient.h>
#include <SPI.h>
#include <SD.h>
#include <Ticker.h>

#ifdef DUMP_AT_COMMANDS
  #include <StreamDebugger.h>
  StreamDebugger debugger(SerialAT, SerialMon);
  TinyGsm modem(debugger);
#else
  TinyGsm modem(SerialAT);
#endif

// LilyGO T-SIM7000G Pinout
#define UART_BAUD           115200
#define PIN_DTR             25
#define PIN_TX              27
#define PIN_RX              26
#define PWR_PIN             4

#define SD_MISO             2
#define SD_MOSI             15
#define SD_SCLK             14
#define SD_CS               13
#define LED_PIN             12


void modemPowerOn(){
  pinMode(PWR_PIN, OUTPUT);
  digitalWrite(PWR_PIN, LOW);
  delay(1000);
  digitalWrite(PWR_PIN, HIGH);
}

void modemPowerOff(){
  pinMode(PWR_PIN, OUTPUT);
  digitalWrite(PWR_PIN, LOW);
  delay(1500);
  digitalWrite(PWR_PIN, HIGH);
}


void modemRestart(){
  modemPowerOff();
  delay(1000);
  modemPowerOn();
}

void setup(){
  // Set console baud rate
  SerialMon.begin(115200);

  delay(10);

  // Set LED OFF
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, HIGH);

  modemPowerOn();

  Serial.println("========SDCard Detect.======");
  SPI.begin(SD_SCLK, SD_MISO, SD_MOSI);
  if (!SD.begin(SD_CS)) {
      Serial.println("SDCard MOUNT FAIL");
  } else {
    uint32_t cardSize = SD.cardSize() / (1024 * 1024);
    String str = "SDCard Size: " + String(cardSize) + "MB";
    Serial.println(str);
  }
  Serial.println("===========================");

  SerialAT.begin(UART_BAUD, SERIAL_8N1, PIN_RX, PIN_TX);


  Serial.println("/**********************************************************/");
  Serial.println("To initialize the network test, please make sure your LTE ");
  Serial.println("antenna has been connected to the SIM interface on the board.");
  Serial.println("/**********************************************************/\n\n");

  delay(10000);
}

void loop(){
  String res;

  Serial.println("========INIT========");

  if (!modem.init()) {
    modemRestart();
    delay(2000);
    Serial.println("Failed to restart modem, attempting to continue without restarting");
    return;
  }

  Serial.println("========SIMCOMATI======");
  modem.sendAT("+SIMCOMATI");
  modem.waitResponse(1000L, res);
  res.replace(GSM_NL "OK" GSM_NL, "");
  Serial.println(res);
  res = "";
  Serial.println("=======================");

  Serial.println("=====Preferred mode selection=====");
  modem.sendAT("+CNMP?");
  if (modem.waitResponse(1000L, res) == 1) {
    res.replace(GSM_NL "OK" GSM_NL, "");
    Serial.println(res);
  }
  res = "";
  Serial.println("=======================");


  Serial.println("=====Preferred selection between CAT-M and NB-IoT=====");
  modem.sendAT("+CMNB?");
  if (modem.waitResponse(1000L, res) == 1) {
    res.replace(GSM_NL "OK" GSM_NL, "");
    Serial.println(res);
  }
  res = "";
  Serial.println("=======================");


  String name = modem.getModemName();
  Serial.println("Modem Name: " + name);

  String modemInfo = modem.getModemInfo();
  Serial.println("Modem Info: " + modemInfo);

  // Unlock your SIM card with a PIN if needed
  if ( GSM_PIN && modem.getSimStatus() != 3 ) {
    modem.simUnlock(GSM_PIN);
  }

  for (int i = 0; i <= 4; i++) {
    uint8_t network[] = {
        2,  /*Automatic*/
        13, /*GSM only*/
        38, /*LTE only*/
        51  /*GSM and LTE only*/
    };
    Serial.printf("Try %d method\n", network[i]);
    modem.setNetworkMode(network[i]);
    delay(3000);
    bool isConnected = false;
    int tryCount = 60;
    while (tryCount--) {
      int16_t signal =  modem.getSignalQuality();
      Serial.print("Signal: ");
      Serial.print(signal);
      Serial.print(" ");
      Serial.print("isNetworkConnected: ");
      isConnected = modem.isNetworkConnected();
      Serial.println( isConnected ? "CONNECT" : "NO CONNECT");
      if (isConnected) {
        break;
      }
      delay(1000);
      digitalWrite(LED_PIN, !digitalRead(LED_PIN));
    }
    if (isConnected) {
        break;
    }
  }
  digitalWrite(LED_PIN, HIGH);

  Serial.println();
  Serial.println("Device is connected .");
  Serial.println();

  Serial.println("=====Inquiring UE system information=====");
  modem.sendAT("+CPSI?");
  if (modem.waitResponse(1000L, res) == 1) {
    res.replace(GSM_NL "OK" GSM_NL, "");
    Serial.println(res);
  }

  Serial.println("/**********************************************************/");
  Serial.println("After the network test is complete, please enter the  ");
  Serial.println("AT command in the serial terminal.");
  Serial.println("/**********************************************************/\n\n");

  while (1) {
    while (SerialAT.available()) {
      SerialMon.write(SerialAT.read());
    }
    while (SerialMon.available()) {
      SerialAT.write(SerialMon.read());
    }
  }
}

Afficher le code brut

  1. Insérez le code PIN de votre carte SIM, si vous l’avez. Dans mon cas, j’ai désactivé la broche.
#define GSM_PIN ""
  1. Insérez vos détails apn sur les lignes suivantes :
const char apn[]  = "";     //SET TO YOUR APN
const char gprsUser[] = "";
const char gprsPass[] = "";

Par exemple, dans mon cas :

const char apn[]  = "net2.vodafone.pt";     //SET TO YOUR APN
const char gprsUser[] = "vodafone";
const char gprsPass[] = "vodafone";
  1. Accédez à Outils > Carte et sélectionnez Module de développement ESP32.
  1. Enfin, téléchargez le code sur votre tableau.
Bouton de téléchargement Arduino 2.0

Maintenant, vous pouvez insérer une carte microSD, si vous souhaitez tester les fonctionnalités de la carte microSD.

Carte microSD ESP32 T-SIM7000G

Ensuite, ouvrez le moniteur série à un débit en bauds de 115200. Appuyez sur le bouton RST intégré pour redémarrer la carte.

Attendez un peu que la carte se connecte au réseau (dans mon cas, cela peut prendre jusqu’à 2 minutes).

Vous devriez obtenir quelque chose de similaire dans le Serial Monitor.

Moniteur série de test réseau ESP32 SIM7000G

Vous pouvez voir qu’il identifie la carte microSD et se connecte au réseau avec succès.

Vérifiez la sélection du mode préféré et la sélection préférée entre CAT-M et NB-IoT. Vous aurez besoin de ces paramètres plus tard, et ils diffèrent selon votre carte SIM et votre fournisseur.

LILYGO T-SIM7000G ESP32 : connectez-vous à Internet, envoyez des SMS et obtenez des données GPS

Si tout s’est déroulé comme prévu, vous êtes maintenant prêt à tester d’autres fonctions telles que la connexion à Internet, l’envoi de SMS et l’obtention de données GPS.

Copiez le code suivant dans votre IDE Arduino. Ce code a été adapté de cet exemple.

/*
  Rui Santos
  Complete project details at https://Raspberryme.com/lilygo-t-sim7000g-esp32-lte-gprs-gps/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

// Based on the following example: https://github.com/Xinyuan-LilyGO/LilyGO-T-SIM7000G/blob/master/examples/Arduino_TinyGSM/AllFunctions/AllFunctions.ino

#define TINY_GSM_MODEM_SIM7000
#define TINY_GSM_RX_BUFFER 1024 // Set RX buffer to 1Kb
#define SerialAT Serial1

// See all AT commands, if wanted
#define DUMP_AT_COMMANDS

// set GSM PIN, if any
#define GSM_PIN ""

// Your GPRS credentials, if any
const char apn[]  = "";     //SET TO YOUR APN
const char gprsUser[] = "";
const char gprsPass[] = "";

// Set phone number, if you want to test SMS
// Set a recipient phone number to test sending SMS (it must be in international format including the "+" sign)
#define SMS_TARGET  ""

#include <TinyGsmClient.h>
#include <SPI.h>
#include <SD.h>
#include <Ticker.h>

#ifdef DUMP_AT_COMMANDS  // if enabled it requires the streamDebugger lib
  #include <StreamDebugger.h>
  StreamDebugger debugger(SerialAT, Serial);
  TinyGsm modem(debugger);
#else
  TinyGsm modem(SerialAT);
#endif

#define uS_TO_S_FACTOR 1000000ULL  // Conversion factor for micro seconds to seconds
#define TIME_TO_SLEEP  60          // Time ESP32 will go to sleep (in seconds)

#define UART_BAUD   115200
#define PIN_DTR     25
#define PIN_TX      27
#define PIN_RX      26
#define PWR_PIN     4

#define SD_MISO     2
#define SD_MOSI     15
#define SD_SCLK     14
#define SD_CS       13
#define LED_PIN     12

int counter, lastIndex, numberOfPieces = 24;
String pieces[24], input;

void setup(){
  // Set console baud rate
  Serial.begin(115200);
  delay(10);

  // Set LED OFF
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, HIGH);

  pinMode(PWR_PIN, OUTPUT);
  digitalWrite(PWR_PIN, HIGH);
  delay(300);
  digitalWrite(PWR_PIN, LOW);

  SPI.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS);
  if (!SD.begin(SD_CS)) {
    Serial.println("SDCard MOUNT FAIL");
  } else {
    uint32_t cardSize = SD.cardSize() / (1024 * 1024);
    String str = "SDCard Size: " + String(cardSize) + "MB";
    Serial.println(str);
  }

  Serial.println("\nWait...");

  delay(1000);

  SerialAT.begin(UART_BAUD, SERIAL_8N1, PIN_RX, PIN_TX);

  // Restart takes quite some time
  // To skip it, call init() instead of restart()
  Serial.println("Initializing modem...");
  if (!modem.restart()) {
    Serial.println("Failed to restart modem, attempting to continue without restarting");
  }
}

void loop(){
  // Restart takes quite some time
  // To skip it, call init() instead of restart()
  Serial.println("Initializing modem...");
  if (!modem.init()) {
    Serial.println("Failed to restart modem, attempting to continue without restarting");
  }

  String name = modem.getModemName();
  delay(500);
  Serial.println("Modem Name: " + name);

  String modemInfo = modem.getModemInfo();
  delay(500);
  Serial.println("Modem Info: " + modemInfo);
  

  // Unlock your SIM card with a PIN if needed
  if ( GSM_PIN && modem.getSimStatus() != 3 ) {
      modem.simUnlock(GSM_PIN);
  }
  modem.sendAT("+CFUN=0 ");
  if (modem.waitResponse(10000L) != 1) {
    DBG(" +CFUN=0  false ");
  }
  delay(200);

  /*
    2 Automatic
    13 GSM only
    38 LTE only
    51 GSM and LTE only
  * * * */
  String res;
  // CHANGE NETWORK MODE, IF NEEDED
  res = modem.setNetworkMode(2);
  if (res != "1") {
    DBG("setNetworkMode  false ");
    return ;
  }
  delay(200);

  /*
    1 CAT-M
    2 NB-Iot
    3 CAT-M and NB-IoT
  * * */
  // CHANGE PREFERRED MODE, IF NEEDED
  res = modem.setPreferredMode(1);
  if (res != "1") {
    DBG("setPreferredMode  false ");
    return ;
  }
  delay(200);

  /*AT+CBANDCFG=<mode>,<band>[,<band>…]
   * <mode> "CAT-M"   "NB-IOT"
   * <band>  The value of <band> must is in the band list of getting from  AT+CBANDCFG=?
   * For example, my SIM card carrier "NB-iot" supports B8.  I will configure +CBANDCFG= "Nb-iot ",8
   */
  /* modem.sendAT("+CBANDCFG=\"NB-IOT\",8 ");*/
  
  /* if (modem.waitResponse(10000L) != 1) {
       DBG(" +CBANDCFG=\"NB-IOT\" ");
   }*/
   delay(200);

  modem.sendAT("+CFUN=1 ");
  if (modem.waitResponse(10000L) != 1) {
    DBG(" +CFUN=1  false ");
  }
  delay(200);

  SerialAT.println("AT+CGDCONT?");
  delay(500);
  if (SerialAT.available()) {
    input = SerialAT.readString();
    for (int i = 0; i < input.length(); i++) {
      if (input.substring(i, i + 1) == "\n") {
        pieces[counter] = input.substring(lastIndex, i);
        lastIndex = i + 1;
        counter++;
       }
        if (i == input.length() - 1) {
          pieces[counter] = input.substring(lastIndex, i);
        }
      }
      // Reset for reuse
      input = "";
      counter = 0;
      lastIndex = 0;

      for ( int y = 0; y < numberOfPieces; y++) {
        for ( int x = 0; x < pieces[y].length(); x++) {
          char c = pieces[y][x];  //gets one byte from buffer
          if (c == ',') {
            if (input.indexOf(": ") >= 0) {
              String data = input.substring((input.indexOf(": ") + 1));
              if ( data.toInt() > 0 && data.toInt() < 25) {
                modem.sendAT("+CGDCONT=" + String(data.toInt()) + ",\"IP\",\"" + String(apn) + "\",\"0.0.0.0\",0,0,0,0");
              }
              input = "";
              break;
            }
          // Reset for reuse
          input = "";
         } else {
          input += c;
         }
      }
    }
  } else {
    Serial.println("Failed to get PDP!");
  }

  Serial.println("\n\n\nWaiting for network...");
  if (!modem.waitForNetwork()) {
    delay(10000);
    return;
  }

  if (modem.isNetworkConnected()) {
    Serial.println("Network connected");
  }
  
  // --------TESTING GPRS--------
  Serial.println("\n---Starting GPRS TEST---\n");
  Serial.println("Connecting to: " + String(apn));
  if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
    delay(10000);
    return;
  }

  Serial.print("GPRS status: ");
  if (modem.isGprsConnected()) {
    Serial.println("connected");
  } else {
    Serial.println("not connected");
  }

  String ccid = modem.getSimCCID();
  Serial.println("CCID: " + ccid);

  String imei = modem.getIMEI();
  Serial.println("IMEI: " + imei);

  String cop = modem.getOperator();
  Serial.println("Operator: " + cop);

  IPAddress local = modem.localIP();
  Serial.println("Local IP: " + String(local));

  int csq = modem.getSignalQuality();
  Serial.println("Signal quality: " + String(csq));

  SerialAT.println("AT+CPSI?");     //Get connection type and band
  delay(500);
  if (SerialAT.available()) {
    String r = SerialAT.readString();
    Serial.println(r);
  }

  Serial.println("\n---End of GPRS TEST---\n");

  modem.gprsDisconnect();
  if (!modem.isGprsConnected()) {
    Serial.println("GPRS disconnected");
  } else {
    Serial.println("GPRS disconnect: Failed.");
  }

  // --------TESTING GPS--------
  
  Serial.println("\n---Starting GPS TEST---\n");
  // Set SIM7000G GPIO4 HIGH ,turn on GPS power
  // CMD:AT+SGPIO=0,4,1,1
  // Only in version 20200415 is there a function to control GPS power
  modem.sendAT("+SGPIO=0,4,1,1");
  if (modem.waitResponse(10000L) != 1) {
    DBG(" SGPIO=0,4,1,1 false ");
  }
  modem.enableGPS();
  float lat,  lon;
  while (1) {
    if (modem.getGPS(&lat, &lon)) {
      Serial.printf("lat:%f lon:%f\n", lat, lon);
      break;
    } else {
      Serial.print("getGPS ");
      Serial.println(millis());
    }
    delay(2000);
  }
  modem.disableGPS();

  // Set SIM7000G GPIO4 LOW ,turn off GPS power
  // CMD:AT+SGPIO=0,4,1,0
  // Only in version 20200415 is there a function to control GPS power
  modem.sendAT("+SGPIO=0,4,1,0");
  if (modem.waitResponse(10000L) != 1) {
    DBG(" SGPIO=0,4,1,0 false ");
  }
  Serial.println("\n---End of GPRS TEST---\n");


  // --------TESTING SENDING SMS--------
  res = modem.sendSMS(SMS_TARGET, String("Hello from ") + imei);
  DBG("SMS:", res ? "OK" : "fail");


  // --------TESTING POWER DONW--------

  // Try to power-off (modem may decide to restart automatically)
  // To turn off modem completely, please use Reset/Enable pins
  modem.sendAT("+CPOWD=1");
  if (modem.waitResponse(10000L) != 1) {
    DBG("+CPOWD=1");
  }
  // The following command does the same as the previous lines
  modem.poweroff();
  Serial.println("Poweroff.");

  // GO TO SLEEP
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  delay(200);
  esp_deep_sleep_start();

  // Do nothing forevermore
  while (true) {
      modem.maintain();
  }
}

Afficher le code brut

Insérez le pin de votre carte SIM sur la ligne suivante :

#define GSM_PIN ""

Remplissez vos détails APN :

const char apn[]  = "net2.vodafone.pt";     //SET TO YOUR APN
const char gprsUser[] = "vodafone";
const char gprsPass[] = "vodafone";

Définissez un numéro de téléphone destinataire pour tester l’envoi de SMS (il doit être au format international avec le signe « + ») :

// Set phone number, if you want to test SMS
#define SMS_TARGET  "+XXXXXXXXXXXXXXXX"

Définissez le mode réseau avec la valeur que vous avez obtenue de l’exemple précédent.

/*
  2 Automatic
  13 GSM only
  38 LTE only
  51 GSM and LTE only
* * * */
String res;
// CHANGE NETWORK MODE, IF NEEDED
res = modem.setNetworkMode(2);
if (res != "1") {
  DBG("setNetworkMode  false ");
  return ;
}
delay(200);

Modifiez le mode préféré avec la valeur que vous avez obtenue de l’exemple précédent.

/*
  1 CAT-M
  2 NB-Iot
  3 CAT-M and NB-IoT
* * */
// CHANGE PREFERRED MODE, IF NEEDED
res = modem.setPreferredMode(1);
if (res != "1") {
  DBG("setPreferredMode  false ");
  return ;
}
delay(200);

Après cela, vous pouvez télécharger le code sur votre tableau. N’oubliez pas de sélectionner ESP32 Dev Module dans Tools > Board. Vous devez également retirer la carte microSD chaque fois que vous souhaitez télécharger un nouveau dessin.

Après le téléchargement, vous pouvez insérer la carte microSD. Ouvrez le moniteur série à un débit en bauds de 115200 et appuyez sur le bouton RST intégré pour le redémarrer.

La carte peut prendre un certain temps pour obtenir les données GPS pour la première fois. Votre carte doit être placée à l’extérieur pour pouvoir capter un signal satellite. J’ai placé le mien à côté de la fenêtre et il a pu obtenir avec précision la position GPS.

Vous devriez obtenir quelque chose de similaire.

Wait...
Initializing modem...
ATE0
AT+CFUN=0
Failed to restart modem, attempting to continue without restarting
Initializing modem...
AT
AT
AT
OK
ATE0
ATE0
OK
AT+CMEE=0

OK
AT+CLTS=1

OK
AT+CBATCHK=1

OK
AT+CPIN?

+CPIN: READY

OK
AT+GMM

SIMCOM_SIM7000G

OK
Modem Name: SIMCOM SIM7000G
ATI

SIM7000G R1529

OK
Modem Info: SIM7000G R1529
AT+SGPIO=0,4,1,0

OK
AT+CPIN?

+CPIN: READY

OK
AT+CFUN=0 

+CPIN: NOT READY

OK
AT+CNMP=2

OK
AT+CMNB=1

OK
AT+CFUN=1 

OK
AT+CGDCONT=1,"IP","net2.vodafone.pt","0.0.0.0",0,0,0,0
AT+CGDCONT=13,"IP","net2.vodafone.pt","0.0.0.0",0,0,0,0



Waiting for network...
AT+CEREG?

OK
AT+CGREG?

+CGREG: 0,2

OK
AT+CEREG?

+CEREG: 0,0

OK
AT+CGREG?

+CGREG: 0,2

OK
AT+CEREG?

+CEREG: 0,0

OK
AT+CGREG?

+CGREG: 0,2

OK
AT+CEREG?

+CEREG: 0,0

OK
AT+CGREG?

+CGREG: 0,2

OK
AT+CEREG?

+CEREG: 0,0

OK
AT+CGREG?

+CGREG: 0,2

OK
AT+CEREG?

+CEREG: 0,0

OK
AT+CGREG?

+CGREG: 0,2

OK
AT+CEREG?

DST: 1

*PSUTTZ: 22/08/07,13:45:17","+04",1

+CEREG: 0,0

OK
AT+CGREG?

+CGREG: 0,1

OK
AT+CEREG?

+CEREG: 0,0

OK
AT+CGREG?

+CGREG: 0,1

OK
Network connected

---Starting GPRS TEST---

Connecting to: net2.vodafone.pt
AT+CIPSHUT

SHUT OK
AT+CGATT=0

OK
AT+SAPBR=3,1,"Contype","GPRS"

OK
AT+SAPBR=3,1,"APN","net2.vodafone.pt"

OK
AT+SAPBR=3,1,"USER","vodafone"

OK
AT+SAPBR=3,1,"PWD","vodafone"

OK
AT+CGDCONT=1,"IP","net2.vodafone.pt"

OK
AT+CGATT=1

OK
AT+CGACT=1,1

DST: 1

*PSUTTZ: 22/08/07,13:45:19","+04",1

OK
AT+SAPBR=1,1

OK
AT+SAPBR=2,1

+SAPBR: 1,1,"10.196.118.208"

OK
AT+CIPMUX=1

OK
AT+CIPQSEND=1

OK
AT+CIPRXGET=1

OK
AT+CSTT="net2.vodafone.pt","vodafone","vodafone"

OK
AT+CIICR

OK
AT+CIFSR;E0

10.196.118.208

OK
GPRS status: AT+CGATT?

+CGATT: 1

OK
AT+CIFSR;E0

10.196.118.208

OK
connected
AT+CCID

8935101211825295132f

OK
CCID: 8935101211825295132f
AT+GSN

869951031125929

OK
IMEI: 869951031125929
AT+COPS?

+COPS: 0,0,"vodafone P",3

OK
Operator: vodafone P
AT+CIFSR;E0

10.196.118.208

OK
Local IP: 3497444362
AT+CSQ

+CSQ: 22,0

OK
Signal quality: 22

+CPSI: GSM,Online,268-01,0x000e,63308,15 EGSM 900,-73,0,38-38

OK


---End of GPRS TEST---

AT+CIPSHUT

SHUT OK
AT+CGATT=0

+SAPBR 1: DEACT

OK
AT+CGATT?

+CGATT: 0

OK
GPRS disconnected

---Starting GPS TEST---

AT+SGPIO=0,4,1,1

OK
AT+CGNSPWR=1

OK
AT+CGNSINF

+CGNSINF: 0,,,,,,,,,,,,,,,,,,,,

OK
getGPS 26839
AT+CGNSINF

+CGNSINF: 1,0,,,,,,,0,,,,,,12,,,,50,,

OK
getGPS 28844
AT+CGNSINF

+CGNSINF: 1,0,,,,,,,0,,,,,,12,,,,51,,

OK
getGPS 30850
AT+CGNSINF

+CGNSINF: 1,0,,,,,,,0,,,,,,13,,,,51,,

OK
getGPS 32856
AT+CGNSINF

+CGNSINF: 1,0,,,,,,,0,,,,,,12,,,,51,,

OK
getGPS 34862
AT+CGNSINF

+CGNSINF: 1,0,,,,,,,0,,,,,,12,,,,51,,

OK
getGPS 36868
AT+CGNSINF

+CGNSINF: 1,1,20220807134533.000,41.12XXXX,-8.530XXXX,116.200,0.00,0.0,1,,4.2,,,,13,4,,,51,,

OK
lat:41.12XXXX lon:-8.530XXXX
AT+CGNSPWR=0

OK
AT+SGPIO=0,4,1,0

OK

---End of GPRS TEST---

AT+CMGF=1

OK
AT+CSCS="GSM"

OK
AT+CMGS="+351916XXXXXXXX"

>Hello from 86995103XXXXXXXXX 
+CMGS: 228

OK
AT+CPOWD=1

NORMAL POWER DOWN
AT+CPOWD=1
Poweroff.

Comment fonctionne le code

Examinons rapidement les parties de code pertinentes.

Tout d’abord, vous devez définir le module que vous utilisez. La bibliothèque est compatible avec de nombreux modules différents. Pour utiliser le SIM7000G, incluez la ligne suivante :

#define TINY_GSM_MODEM_SIM7000

Insérez le code PIN de la carte SIM, les détails APN et le destinataire du SMS :

// set GSM PIN, if any
#define GSM_PIN ""

// Your GPRS credentials, if any
const char apn[]  = "net2.vodafone.pt";     //SET TO YOUR APN
const char gprsUser[] = "vodafone";
const char gprsPass[] = "vodafone";

// Set phone numbers, if you want to test SMS
#define SMS_TARGET  "+351916301581"

Incluez les bibliothèques TinyGSM et SPI. Vous devez également inclure la bibliothèque SD si vous souhaitez utiliser la carte microSD.

#include <TinyGsmClient.h>
#include <SPI.h>
#include <SD.h>
#include <Ticker.h>

Créez une instance TinyGsmClient :

#ifdef DUMP_AT_COMMANDS  // if enabled it requires the streamDebugger lib
  #include <StreamDebugger.h>
  StreamDebugger debugger(SerialAT, Serial);
  TinyGsm modem(debugger);
#else
  TinyGsm modem(SerialAT);
#endif

Brochage SIM7000G

Les lignes suivantes définissent le débit en bauds et le brochage du module :

#define UART_BAUD   115200
#define PIN_DTR     25
#define PIN_TX      27
#define PIN_RX      26
#define PWR_PIN     4

#define SD_MISO     2
#define SD_MOSI     15
#define SD_SCLK     14
#define SD_CS       13
#define LED_PIN     12

Alimenter le modem

Dans le setup(), vous devez toujours inclure les instructions suivantes pour allumer le modem :

pinMode(PWR_PIN, OUTPUT);
digitalWrite(PWR_PIN, HIGH);
delay(300);
digitalWrite(PWR_PIN, LOW);

Initialiser la carte microSD

Les lignes suivantes initialisent la carte microSD sur les broches que nous avons définies précédemment.

SPI.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS);
if (!SD.begin(SD_CS)) {
  Serial.println("SDCard MOUNT FAIL");
} else {
  uint32_t cardSize = SD.cardSize() / (1024 * 1024);
  String str = "SDCard Size: " + String(cardSize) + "MB";
  Serial.println(str);
}

Pour en savoir plus sur l’utilisation de la carte microSD avec l’ESP32, vous pouvez lire le guide suivant : ESP32 : Guide pour le module de carte MicroSD utilisant l’IDE Arduino.

Démarrer la communication série

Démarrez une communication série avec le modem :

 SerialAT.begin(UART_BAUD, SERIAL_8N1, PIN_RX, PIN_TX);

Redémarrez et initialisez le modem

Appelez les lignes suivantes pour redémarrer le modem :

// Restart takes quite some time
// To skip it, call init() instead of restart()
Serial.println("Initializing modem...");
if (!modem.restart()) {
  Serial.println("Failed to restart modem, attempting to continue without restarting");
}

Soit les lignes suivantes pour initialiser :

// To skip it, call init() instead of restart()
Serial.println("Initializing modem...");
if (!modem.init()) {
  Serial.println("Failed to restart modem, attempting to continue without restarting");
}

Différence entre restart() et init() selon la documentation : « restart() prend généralement plus de temps que init() mais garantit que le module n’a pas de connexions persistantes ».

Obtenir le nom et les informations du modem

Vous pouvez utiliser getModemName() et getModemInfo() pour obtenir des informations sur le modem.

String name = modem.getModemName();
delay(500);
Serial.println("Modem Name: " + name);

String modemInfo = modem.getModemInfo();
delay(500);
Serial.println("Modem Info: " + modemInfo);

Connecter le GPRS

Pour se connecter GPRS en utilisant les détails APN :

if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
  delay(10000);
  return;
}

Pour vérifier s’il est connecté, vous pouvez utiliser la méthode isGprsConnected() :

if (modem.isGprsConnected()) {
  Serial.println("connected");
} else {
  Serial.println("not connected");
}

Démarrer le GPS et obtenir la position

Comme mentionné précédemment, il existe deux versions de la carte LILYGO SIM7000G ESP32. Le dernier est livré avec un contrôle actif de l’alimentation de l’antenne GPS – lorsque le module GPIO 4 n’est pas allumé, l’antenne ne consomme que le courant statique du LDO. Cela signifie que nous devons activer GPIO 4 avant d’obtenir des données GPS pour alimenter l’antenne. C’est ce que font les lignes suivantes :

// Set SIM7000G GPIO4 HIGH ,turn on GPS power
// CMD:AT+SGPIO=0,4,1,1
// Only in version 20200415 is there a function to control GPS power
modem.sendAT("+SGPIO=0,4,1,1");
if (modem.waitResponse(10000L) != 1) {
  DBG(" SGPIO=0,4,1,1 false ");
}

Si vous avez la version la plus ancienne, vous n’avez pas besoin de ces lignes de code.

Vous pouvez démarrer le GPS en utilisant la méthode enableGPS().

modem.enableGPS();

Obtenez la latitude et la longitude à l’aide de la méthode getGPS().

float lat,  lon;
while (1) {
  if (modem.getGPS(&lat, &lon)) {
    Serial.printf("lat:%f lon:%f\n", lat, lon);
    break;
  } else {
    Serial.print("getGPS ");
    Serial.println(millis());
  }
  delay(2000);
}

Lorsque vous avez fini d’utiliser le GPS, vous pouvez le désactiver à l’aide de la méthode disableGPS() :

modem.disableGPS();

Et enfin, coupez l’alimentation de l’antenne en désactivant le GPIO 4 :

// Set SIM7000G GPIO4 LOW ,turn off GPS power
// CMD:AT+SGPIO=0,4,1,0
// Only in version 20200415 is there a function to control GPS power
modem.sendAT("+SGPIO=0,4,1,0");
if (modem.waitResponse(10000L) != 1) {
  DBG(" SGPIO=0,4,1,0 false ");
}

Envoi de SMS

Pour envoyer un SMS, vous pouvez simplement utiliser la méthode sendSMS() et passer en arguments le numéro du destinataire et le message.

res = modem.sendSMS(SMS_TARGET, String("Hello from ") + imei);
DBG("SMS:", res ? "OK" : "fail");

Mise hors tension du module

Le LILYGO est censé fonctionner sur une batterie 18650 et un panneau solaire, nous devons donc couper l’alimentation chaque fois que ce n’est pas nécessaire. Il est donc utile d’avoir une fonction pour éteindre complètement le modem. Vous pouvez utiliser la méthode poweroff() ou envoyer la commande +CPOWD=1 AT.

modem.sendAT("+CPOWD=1");
if (modem.waitResponse(10000L) != 1) {
  DBG("+CPOWD=1");
}
// The following command does the same as the previous lines
modem.poweroff();
Serial.println("Poweroff.");

Et c’est tout pour les parties de code les plus pertinentes.

Conclusion

Dans ce tutoriel, vous avez appris à utiliser la carte LILYGO T-SIM7000G ESP32. Ce tutoriel peut également être appliqué si vous utilisez un ESP32 « normal » connecté à un module SIM7000G externe. Ce module prend en charge LTE, GPRS et GPS, ce qui peut être très utile pour les projets IoT et domotique.

Vous avez appris à connecter le GPRS, à envoyer des SMS et à obtenir des données GPS. L’idée est d’inclure les extraits de code dont vous avez besoin dans vos propres projets.

La carte LILYGO T-SIM7000G ESP32 est également livrée avec un emplacement pour carte microSD qui peut être utile pour les projets d’enregistrement de données ou pour enregistrer les paramètres de configuration. De plus, il est livré avec un support de batterie et un circuit de charge de batterie à utiliser avec des panneaux solaires. Il convient donc à une utilisation dans des endroits éloignés. Cependant, je n’ai pas encore expérimenté le circuit de la batterie.

Pour plus d’exemples, vous pouvez explorer le Référentiel de la bibliothèque TinyGSM ou l’officiel LILYGO T-SIM7000G Page Github.

Avez-vous une de ces planches? Qu’en penses-tu? Faites-le nous savoir dans les commentaires ci-dessous.

Vous aimerez peut-être aussi les tutoriels suivants (qui, avec des modifications mineures, peuvent être utilisés avec la carte SIM7000G) :

En savoir plus sur l’ESP32 avec nos ressources :

Merci d’avoir lu.

Cette vidéo vous emmène dans l’histoire de Raspberry Pi :

YouTube video

  • LILYGO T-SIM7000G ESP32-WROVER-B Antenne GPS SIM charge solaire CH9102F 16MB 2G/NB TTGO Carte de développement
    Flash 16 Mo et PSRAM 8 M Remarque : le SIM7000G ne prend pas en charge le réseau 4G. Veuillez vous assurer que la carte USIM que vous utilisez prend en charge l'accès 2G (GSM)/NB-IOT Interfaces périphériques : I2C, SPI, UART, SDIO, I2S, CAN Plus d'informations: github.com/Xinyuan-LilyGO/LilyGO-T-SIM7000G Si vous avez des questions sur nos produits, n'hésitez pas à nous contacter