Connectez ESP32 SIM800L au courtier Cloud MQTT

Connectez ESP32 SIM800L au courtier Cloud MQTT

Ce guide montre comment connecter la carte TTGO T-Call ESP32 SIM800L à Internet à l’aide d’un plan de données de carte SIM et publier/s’abonner à un courtier cloud MQTT sans utiliser le Wi-Fi. Le courtier cloud MQTT Mosquitto sera installé sur un serveur Digital Ocean. Nous utiliserons également Node-RED pour visualiser les lectures et contrôler les sorties de n’importe où. La carte sera programmée à l’aide de l’IDE Arduino.

Connectez ESP32 au Cloud MQTT Broker TTGO T-Call ESP32 SIM800L

Avec cette configuration, vous pouvez surveiller et contrôler votre ESP32 de n’importe où dans le monde, et l’ESP32 n’a pas besoin d’être connecté à un routeur sans fil car il se connecte à Internet à l’aide d’un plan de données de carte SIM.

Présentation du TTGO T-Call ESP32 SIM800L

Le TTGO T-Call est une carte de développement ESP32 qui combine un module SIM800L GSM/GPRS. Vous pouvez l’obtenir pour environ 11 $.

Carte GPS GPRS TTGO t-call ESP32 SIM800L

Outre le Wi-Fi et le Bluetooth, vous pouvez communiquer avec cette carte ESP32 par SMS ou appels téléphoniques et vous pouvez la connecter à Internet en utilisant le plan de données de votre carte SIM. C’est idéal pour les projets IoT qui n’ont pas accès à un routeur à proximité.

Important: le SIM800L fonctionne sur les réseaux 2G, il ne fonctionnera donc que dans votre pays, si les réseaux 2G sont disponibles. Vérifiez si vous avez un réseau 2G dans votre pays, sinon cela ne fonctionnera pas.

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

Câble USB-C ESP32 SIM800L Board pour le chargement et les données

Le package comprend des broches d’en-tête, un connecteur de batterie et une antenne externe que vous devez connecter à votre carte.

Paquet de carte ESP32 SIM800L

Cependant, nous avons eu quelques problèmes avec cette antenne, nous avons donc décidé de passer à un autre type d’antenne et tous les problèmes ont été résolus. La figure suivante montre la nouvelle antenne.

Antenne alternative ESP32 SIM800L Board

Aperçu du projet

L’idée de ce projet est de connecter votre ESP32 à un courtier Cloud MQTT pour vous abonner à un sujet MQTT et publier des données de capteur sur des sujets MQTT. L’ESP32 n’a pas besoin d’avoir accès à un routeur via Wi-Fi, car il se connecte à Internet à l’aide d’un plan de données de carte SIM.

Connectez ESP32 au Cloud MQTT Broker TTGO T-Call ESP32 SIM800L Aperçu du projet et son fonctionnement

Dans un projet précédent, nous avons créé notre propre serveur avec une base de données pour tracer les lectures des capteurs dans des graphiques auxquels vous pouvez accéder de n’importe où dans le monde.

Dans ce projet, nous publierons les lectures de capteurs sur un serveur via MQTT et nous utiliserons le courtier Mosquitto. Vous pouvez publier les lectures de vos capteurs sur n’importe quel autre courtier cloud.

En résumé, voici comment fonctionne le projet :

  1. La carte T-Call ESP32 SIM800L est connectée à Internet à l’aide d’un plan de données de carte SIM.
  2. La carte T-Call ESP32 SIM800L publie les lectures des capteurs via MQTT et les lectures sont affichées dans le tableau de bord Node-RED.
  3. Grâce au tableau de bord Node-RED, vous pouvez appuyer sur des boutons pour envoyer des commandes d’activation et de désactivation afin de contrôler les GPIO ESP32.

Nous utiliserons un capteur BME280, mais vous pouvez utiliser n’importe quel autre capteur qui répond le mieux à vos besoins.

Courtier Cloud MQTT

Vous pouvez rechercher un courtier cloud MQTT gratuit, mais nous utiliserons notre propre courtier cloud MQTT. Nous vous recommandons d’utiliser Digital Ocean avec MQTT Mosquitto Broker, car il peut gérer toutes les exigences du projet. Nous utiliserons également le logiciel Node-RED pour visualiser les lectures dans les jauges et publier des messages MQTT sur l’ESP32.

Conditions préalables

1. Complément ESP32 Arduino IDE

Nous allons programmer l’ESP32 à l’aide de l’IDE Arduino. Vous devez donc installer le module complémentaire ESP32 dans votre IDE Arduino. Suivez le tutoriel suivant, si vous ne l’avez pas déjà fait.

2. Préparer votre courtier Cloud MQTT

Dans ce projet, nous allons vous montrer comment échanger des données via MQTT à l’aide d’un courtier cloud MQTT.

Nous utiliserons notre propre courtier cloud MQTT. Cependant, si vous trouvez un courtier MQTT gratuit avec toutes les fonctionnalités souhaitées, cela fonctionnera également…

Si vous souhaitez suivre ce projet précis, vous devez suivre les deux tutoriels suivants pour préparer votre propre serveur et le logiciel Node-RED.

L’ESP32 publie des lectures de température toutes les 30 secondes sur le esp/température et esp/humidité les sujets. Il est abonné à ces deux sujets esp/sortie1 et esp/sortie2 pour mettre à jour l’état des LED de sortie.

Avec Node-RED en cours d’exécution, accédez à l’adresse IP de votre serveur suivie de :1880.

http://cloud-mqtt-broker-ip-address:1880

Câblez vos nœuds comme indiqué ci-dessous :

ESP32 SIM800L GPRS GSM Cloud MQTT Broker Node-RED Arduino

Enfin, déployez votre flux (appuyez sur le bouton dans le coin supérieur droit).

Déployer le bouton Node-RED

Alternativement, vous pouvez aller à Menu > Importer et copiez ce qui suit dans votre Presse-papiers pour créer votre flux Node-RED.

[{"id":"a2c394d8.1544e8","type":"mqtt in","z":"537cca59.c4a014","name":"","topic":"esp/temperature","qos":"2","datatype":"auto","broker":"18f874c0.4a464b","x":140,"y":1020,"wires":[["6907217e.f39bf"]]},{"id":"b83c2ecf.8ab94","type":"mqtt in","z":"537cca59.c4a014","name":"","topic":"esp/humidity","qos":"2","datatype":"auto","broker":"18f874c0.4a464b","x":130,"y":1100,"wires":[["c92e354e.a27d48"]]},{"id":"ee844c66.3eda2","type":"mqtt out","z":"537cca59.c4a014","name":"","topic":"esp/output1","qos":"1","retain":"","broker":"18f874c0.4a464b","x":330,"y":1180,"wires":[]},{"id":"54540fba.e5877","type":"mqtt out","z":"537cca59.c4a014","name":"","topic":"esp/output2","qos":"1","retain":"","broker":"18f874c0.4a464b","x":330,"y":1260,"wires":[]},{"id":"56080a9a.c7bba4","type":"ui_switch","z":"537cca59.c4a014","name":"","label":"Output 1","tooltip":"","group":"1539f836.ed9378","order":0,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":120,"y":1180,"wires":[["ee844c66.3eda2"]]},{"id":"417bd6d1.1d1468","type":"ui_switch","z":"537cca59.c4a014","name":"","label":"Output 2","tooltip":"","group":"1539f836.ed9378","order":0,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":120,"y":1260,"wires":[["54540fba.e5877"]]},{"id":"6907217e.f39bf","type":"ui_gauge","z":"537cca59.c4a014","name":"","group":"1539f836.ed9378","order":2,"width":0,"height":0,"gtype":"gage","title":"Temperature","label":"Celsius Degrees","format":"{{value}}","min":"-10","max":"40","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":350,"y":1020,"wires":[]},{"id":"c92e354e.a27d48","type":"ui_gauge","z":"537cca59.c4a014","name":"","group":"1539f836.ed9378","order":2,"width":0,"height":0,"gtype":"gage","title":"Humidity","label":"%","format":"{{value}}","min":"0","max":"100","colors":["#93dae6","#0074cc","#002561"],"seg1":"","seg2":"","x":340,"y":1100,"wires":[]},{"id":"18f874c0.4a464b","type":"mqtt-broker","z":"","name":"","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"1539f836.ed9378","type":"ui_group","z":"","name":"Dashboard","tab":"38becbd0.c13714","order":1,"disp":true,"width":"6","collapse":false},{"id":"38becbd0.c13714","type":"ui_tab","z":"","name":"Home","icon":"dashboard","disabled":false,"hidden":false}]

Afficher le code brut

3. Carte SIM avec forfait de données

Pour utiliser la carte TTGO T-Call ESP32 SIM800L, vous avez besoin d’une carte nano SIM avec un forfait data. 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.

4. 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 Paramètres APN GPRS suivi du nom de votre fournisseur de forfait téléphonique (dans mon cas, c’est : « GPRS APN vodafone France”), vous pouvez généralement trouver dans un forum ou sur leur site Web toutes les informations dont vous avez besoin.

J’ai trouvé ce site cela peut être très utile pour trouver 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. Vous devrez donc peut-être contacter directement votre fournisseur.

5. Bibliothèques

Vous devez installer ces bibliothèques dans votre IDE Arduino pour poursuivre ce projet : Adafruit_BME280, Adafruit_Sensor, TinyGSM, et PubSubClient. Suivez les instructions suivantes pour installer ces bibliothèques.

Installation de la bibliothèque Adafruit BME280

Ouvrez votre IDE Arduino et accédez à Esquisser > Inclure la bibliothèque > Gérer les bibliothèques. Le gestionnaire de bibliothèque devrait s’ouvrir.

Rechercher « adafruit bme280 ” dans la zone de recherche et installez la bibliothèque.

Installation de la bibliothèque BME280 dans l'IDE Arduino

Installation de la bibliothèque de capteurs Adafruit

Pour utiliser la bibliothèque BME280, vous devez également installer le Bibliothèque Adafruit_Sensor. Suivez les étapes suivantes pour installer la bibliothèque dans votre IDE Arduino :

Aller à Esquisser > Inclure la bibliothèque > Gérer les bibliothèques et tapez « Capteur unifié Adafruit” dans le champ de recherche. Faites défiler vers le bas pour trouver la bibliothèque et installez-la.

Installation de la bibliothèque Adafruit Unified Sensor Driver

Installation de la bibliothèque TinyGSM

Dans le gestionnaire de bibliothèque Arduino IDE, recherchez TinyGSM. Sélectionnez la bibliothèque TinyGSM de Volodymyr Shymanskyy.

Installation de la bibliothèque TinyGSM

Installation de la bibliothèque PubSubClient

Rechercher PubSubClient et faites défiler vers le bas. Sélectionnez la bibliothèque PubSubClient de Nick O’Leary.

Installation de la bibliothèque PubSubClient dans l'IDE Arduino

Après avoir installé les bibliothèques, redémarrez votre IDE Arduino.

Pièces requises

Pour construire ce projet, vous avez besoin des pièces suivantes :

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 !

1643050812 465 Connectez ESP32 SIM800L au courtier Cloud MQTT

Diagramme schématique

Câblez le capteur BME280 et deux LED à la carte T-Call ESP32 SIM800L comme indiqué dans le schéma suivant.

TTGO t-call ESP32 SIM800L avec schéma de câblage des sorties de capteur BME280

Nous connectons la broche SDA du BME280 à GPIO 18 et la broche SCL à GPIO 19.

Code

Copiez le code suivant dans votre IDE Arduino mais ne le téléchargez pas encore. Tout d’abord, vous devez apporter quelques modifications pour que cela fonctionne.

/*
  Rui Santos
  Complete project details at https://Raspberryme.com/esp32-cloud-mqtt-broker-sim800l/
  
  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.
*/

// Select your modem:
#define TINY_GSM_MODEM_SIM800 // Modem is SIM800L

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

// Define the serial console for debug prints, if needed
#define TINY_GSM_DEBUG SerialMon

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

// Your GPRS credentials, if any
const char apn[] = ""; // APN (example: internet.vodafone.pt) use https://wiki.apnchanger.org
const char gprsUser[] = "";
const char gprsPass[] = "";

// SIM card PIN (leave empty, if not defined)
const char simPIN[]   = ""; 

// MQTT details
const char* broker = "XXX.XXX.XXX.XXX";                    // Public IP address or domain name
const char* mqttUsername = "REPLACE_WITH_YOUR_MQTT_USER";  // MQTT username
const char* mqttPassword = "REPLACE_WITH_YOUR_MQTT_PASS";  // MQTT password

const char* topicOutput1 = "esp/output1";
const char* topicOutput2 = "esp/output2";
const char* topicTemperature = "esp/temperature";
const char* topicHumidity = "esp/humidity";

// Define the serial console for debug prints, if needed
//#define DUMP_AT_COMMANDS

#include <Wire.h>
#include <TinyGsmClient.h>

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

#include <PubSubClient.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

TinyGsmClient client(modem);
PubSubClient mqtt(client);

// TTGO T-Call pins
#define MODEM_RST            5
#define MODEM_PWKEY          4
#define MODEM_POWER_ON       23
#define MODEM_TX             27
#define MODEM_RX             26
#define I2C_SDA              21
#define I2C_SCL              22

// BME280 pins
#define I2C_SDA_2            18
#define I2C_SCL_2            19

#define OUTPUT_1             2
#define OUTPUT_2             15

uint32_t lastReconnectAttempt = 0;

// I2C for SIM800 (to keep it running when powered from battery)
TwoWire I2CPower = TwoWire(0);

TwoWire I2CBME = TwoWire(1);
Adafruit_BME280 bme;

#define IP5306_ADDR          0x75
#define IP5306_REG_SYS_CTL0  0x00

float temperature = 0;
float humidity = 0;
long lastMsg = 0;

bool setPowerBoostKeepOn(int en){
  I2CPower.beginTransmission(IP5306_ADDR);
  I2CPower.write(IP5306_REG_SYS_CTL0);
  if (en) {
    I2CPower.write(0x37); // Set bit1: 1 enable 0 disable boost keep on
  } else {
    I2CPower.write(0x35); // 0x37 is default reg value
  }
  return I2CPower.endTransmission() == 0;
}

void mqttCallback(char* topic, byte* message, unsigned int len) {
  Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  String messageTemp;
  
  for (int i = 0; i < len; i++) {
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  Serial.println();

  // Feel free to add more if statements to control more GPIOs with MQTT

  // If a message is received on the topic esp/output1, you check if the message is either "true" or "false". 
  // Changes the output state according to the message
  if (String(topic) == "esp/output1") {
    Serial.print("Changing output to ");
    if(messageTemp == "true"){
      Serial.println("true");
      digitalWrite(OUTPUT_1, HIGH);
    }
    else if(messageTemp == "false"){
      Serial.println("false");
      digitalWrite(OUTPUT_1, LOW);
    }
  }
  else if (String(topic) == "esp/output2") {
    Serial.print("Changing output to ");
    if(messageTemp == "true"){
      Serial.println("true");
      digitalWrite(OUTPUT_2, HIGH);
    }
    else if(messageTemp == "false"){
      Serial.println("false");
      digitalWrite(OUTPUT_2, LOW);
    }
  }
}

boolean mqttConnect() {
  SerialMon.print("Connecting to ");
  SerialMon.print(broker);

  // Connect to MQTT Broker without username and password
  //boolean status = mqtt.connect("GsmClientN");

  // Or, if you want to authenticate MQTT:
  boolean status = mqtt.connect("GsmClientN", mqttUsername, mqttPassword);

  if (status == false) {
    SerialMon.println(" fail");
    ESP.restart();
    return false;
  }
  SerialMon.println(" success");
  mqtt.subscribe(topicOutput1);
  mqtt.subscribe(topicOutput2);

  return mqtt.connected();
}


void setup() {
  // Set console baud rate
  SerialMon.begin(115200);
  delay(10);
  
  // Start I2C communication
  I2CPower.begin(I2C_SDA, I2C_SCL, 400000);
  I2CBME.begin(I2C_SDA_2, I2C_SCL_2, 400000);
  
  // Keep power when running from battery
  bool isOk = setPowerBoostKeepOn(1);
  SerialMon.println(String("IP5306 KeepOn ") + (isOk ? "OK" : "FAIL"));

  // Set modem reset, enable, power pins
  pinMode(MODEM_PWKEY, OUTPUT);
  pinMode(MODEM_RST, OUTPUT);
  pinMode(MODEM_POWER_ON, OUTPUT);
  digitalWrite(MODEM_PWKEY, LOW);
  digitalWrite(MODEM_RST, HIGH);
  digitalWrite(MODEM_POWER_ON, HIGH);
  
  pinMode(OUTPUT_1, OUTPUT);
  pinMode(OUTPUT_2, OUTPUT);
  
  SerialMon.println("Wait...");

  // Set GSM module baud rate and UART pins
  SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
  delay(6000);

  // Restart takes quite some time
  // To skip it, call init() instead of restart()
  SerialMon.println("Initializing modem...");
  modem.restart();
  // modem.init();

  String modemInfo = modem.getModemInfo();
  SerialMon.print("Modem Info: ");
  SerialMon.println(modemInfo);

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

  // You might need to change the BME280 I2C address, in our case it's 0x76
  if (!bme.begin(0x76, &I2CBME)) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }

  SerialMon.print("Connecting to APN: ");
  SerialMon.print(apn);
  if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
    SerialMon.println(" fail");
    ESP.restart();
  }
  else {
    SerialMon.println(" OK");
  }
  
  if (modem.isGprsConnected()) {
    SerialMon.println("GPRS connected");
  }

  // MQTT Broker setup
  mqtt.setServer(broker, 1883);
  mqtt.setCallback(mqttCallback);
}

void loop() {
  if (!mqtt.connected()) {
    SerialMon.println("=== MQTT NOT CONNECTED ===");
    // Reconnect every 10 seconds
    uint32_t t = millis();
    if (t - lastReconnectAttempt > 10000L) {
      lastReconnectAttempt = t;
      if (mqttConnect()) {
        lastReconnectAttempt = 0;
      }
    }
    delay(100);
    return;
  }

  long now = millis();
  if (now - lastMsg > 30000) {
    lastMsg = now;
    
    // Temperature in Celsius
    temperature = bme.readTemperature();   
    // Uncomment the next line to set temperature in Fahrenheit 
    // (and comment the previous temperature line)
    //temperature = 1.8 * bme.readTemperature() + 32; // Temperature in Fahrenheit
    
    // Convert the value to a char array
    char tempString[8];
    dtostrf(temperature, 1, 2, tempString);
    Serial.print("Temperature: ");
    Serial.println(tempString);
    mqtt.publish(topicTemperature, tempString);

    humidity = bme.readHumidity();
    
    // Convert the value to a char array
    char humString[8];
    dtostrf(humidity, 1, 2, humString);
    Serial.print("Humidity: ");
    Serial.println(humString);
    mqtt.publish(topicHumidity, humString);
  }

  mqtt.loop();
}

Afficher le code brut

Avant de télécharger le code, vous devez insérer vos détails APN, le code PIN de la carte SIM (le cas échéant) et les détails de votre serveur cloud MQTT.

Comment fonctionne le code

Insérez vos identifiants GPRS APN dans les variables suivantes :

const char apn[]      = ""; // APN (example: internet.vodafone.pt) use https://wiki.apnchanger.org
const char gprsUser[] = ""; // GPRS User
const char gprsPass[] = ""; // GPRS Password

Dans notre cas, l’APN est internet.vodafone.pt. Le vôtre devrait être différent. Nous avons expliqué précédemment comment obtenir vos détails APN.

Saisissez le code PIN de votre carte SIM, le cas échéant :

const char simPIN[] = "";

Vous devez également saisir les détails du serveur cloud MQTT dans les variables suivantes. Il peut s’agir de votre propre domaine cloud MQTT ou de tout autre serveur MQTT que vous souhaitez utiliser.

const char* broker = "178.XXX.XXX.XXX";  // Public IP address or domain name
const char* mqttUsername = "REPLACE_WITH_YOUR_MQTT_USERNAME";
const char* mqttPassword = "REPLACE_WITH_YOUR_MQTT_PASSWORD";

L’ESP32 est abonné au esp/sortie1 et esp/sortie2 sujets pour mettre à jour les sorties avec la dernière valeur :

const char* topicOutput1 = "esp/output1";
const char* topicOutput2 = "esp/output2";

L’ESP32 publie les lectures de température et d’humidité sur ces sujets esp/température et esp/humidité toutes les 30 secondes :

const char* topicTemperature = "esp/temperature";
const char* topicHumidity = "esp/humidity";

Le code est fortement commenté afin que vous compreniez le but de chaque ligne de code.

Les lignes suivantes définissent les broches utilisées par le module SIM800L :

#define MODEM_RST       5
#define MODEM_PWKEY     4
#define MODEM_POWER_ON  23
#define MODEM_TX        27
#define MODEM_RX        26
#define I2C_SDA         21
#define I2C_SCL         22

Définissez les broches BME280 I2C. Dans cet exemple, nous utilisons GPIO 18 et GPIO 19.

#define I2C_SDA_2  18
#define I2C_SCL_2  19

Définissez une communication série pour le Serial Monitor et une autre pour communiquer avec le module SIM800L :

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

Configurez le TinyGSM bibliothèque pour fonctionner avec le module SIM800L.

#define TINY_GSM_MODEM_SIM800

Incluez les bibliothèques suivantes pour communiquer avec le SIM800L.

#include <Wire.h>
#include <TinyGsmClient.h>

Et la bibliothèque MQTT et les bibliothèques de capteurs BME280 :

#include <PubSubClient.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

Instanciez une communication I2C pour le SIM800L (IC de gestion de l’alimentation de la batterie).

TwoWire I2CPower = TwoWire(0);

Et une autre communication I2C pour le capteur BME280.

TwoWire I2CBME = TwoWire(1);
Adafruit_BME280 bme;

Initialiser un TinyGsmClient pour la connexion internet.

TinyGsmClient client(modem);

mettre en place()

Dans le mettre en place(), initialisez le moniteur série à un débit en bauds de 115 200 :

SerialMon.begin(115200);

Démarrez la communication I2C pour le module SIM800L et pour le module capteur BME280 :

I2CPower.begin(I2C_SDA, I2C_SCL, 400000);
I2CBME.begin(I2C_SDA_2, I2C_SCL_2, 400000);

Configurez les broches SIM800L dans un état approprié pour fonctionner :

pinMode(MODEM_PWKEY, OUTPUT);
pinMode(MODEM_RST, OUTPUT);
pinMode(MODEM_POWER_ON, OUTPUT);
digitalWrite(MODEM_PWKEY, LOW);
digitalWrite(MODEM_RST, HIGH);
digitalWrite(MODEM_POWER_ON, HIGH);

Initialiser une communication série avec le module SIM800L.

SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);

Initialisez le module SIM800L et déverrouillez le code PIN de la carte SIM si nécessaire.

SerialMon.println("Initializing modem...");
modem.restart();

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

Initialisez le capteur BME280.

if (!bme.begin(0x76, &I2CBME)) {
  Serial.println("Could not find a valid BME280 sensor, check wiring!");
  while (1);
}

Enfin, dans le mettre en place() est l’endroit où nous allons réellement nous connecter à Internet. Les lignes suivantes connectent le module à Internet :

SerialMon.print("Connecting to APN: ");
SerialMon.print(apn);
if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
  SerialMon.println(" fail");
  ESP.restart();
}
else {
  SerialMon.println(" OK");
}

mqttConnect()

le mqttConnect() La fonction est chargée de connecter votre carte au courtier MQTT en utilisant un nom d’utilisateur et un mot de passe. Il abonne également l’ESP32 au esp/sortie1 et esp/sortie2 Sujets MQTT.

boolean mqttConnect() {
  SerialMon.print("Connecting to ");
  SerialMon.print(broker);

  // Connect to MQTT Broker without username and password
  //boolean status = mqtt.connect("GsmClientN");

  // Or, if you want to authenticate MQTT:
  boolean status = mqtt.connect("GsmClientN", mqttUsername, mqttPassword);

  if (status == false) {
    SerialMon.println(" fail");
    ESP.restart();
    return false;
  }
  SerialMon.println(" success");
  mqtt.subscribe(topicOutput1);
  mqtt.subscribe(topicOutput2);

  return mqtt.connected();
}

boucler()

Dans le boucler(), il y a une minuterie qui publie les lectures de température et d’humidité à votre courtier MQTT toutes les 30 secondes.

long now = millis();
if (now - lastMsg > 30000) {
  lastMsg = now;
    
  // Temperature in Celsius
  temperature = bme.readTemperature();   
  // Uncomment the next line to set temperature in Fahrenheit 
  // (and comment the previous temperature line)
  //temperature = 1.8 * bme.readTemperature() + 32; // Temperature in Fahrenheit
    
  // Convert the value to a char array
  char tempString[8];
  dtostrf(temperature, 1, 2, tempString);
  Serial.print("Temperature: ");
  Serial.println(tempString);
  mqtt.publish(topicTemperature, tempString);

  humidity = bme.readHumidity();
    
  // Convert the value to a char array
  char humString[8];
  dtostrf(humidity, 1, 2, humString);
  Serial.print("Humidity: ");
  Serial.println(humString);
  mqtt.publish(topicHumidity, humString);
}

mqttCallback()

Dans le mqttCallback() fonction, l’ESP32 reçoit les messages MQTT des sujets souscrits. En fonction du sujet et du message MQTT, il active ou désactive les sorties :

void mqttCallback(char* topic, byte* message, unsigned int len) {
  Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  String messageTemp;
  for (int i = 0; i < len; i++) {
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  Serial.println();

  // Feel free to add more if statements to control more GPIOs with MQTT

  // If a message is received on the topic esp/output1, you check if the message is either "true" or "false". 
  // Changes the output state according to the message
  if (String(topic) == "esp/output1") {
    Serial.print("Changing output to ");
    if(messageTemp == "true"){
      Serial.println("true");
      digitalWrite(OUTPUT_1, HIGH);
    }
    else if(messageTemp == "false"){
      Serial.println("false");
      digitalWrite(OUTPUT_1, LOW);
    }
  }
  else if (String(topic) == "esp/output2") {
    Serial.print("Changing output to ");
    if(messageTemp == "true"){
      Serial.println("true");
      digitalWrite(OUTPUT_2, HIGH);
    }
    else if(messageTemp == "false"){
      Serial.println("false");
      digitalWrite(OUTPUT_2, LOW);
    }
  }
}

Télécharger le code

Après avoir inséré tous les détails nécessaires, vous pouvez télécharger le code sur votre tableau.

Pour télécharger le code sur votre tableau, rendez-vous sur Outils > Conseil et sélectionnez Module de développement ESP32. Aller à Outils > Port et sélectionnez le port COM auquel votre carte est connectée. Enfin, appuyez sur le bouton de téléchargement pour télécharger le code sur votre carte.

Télécharger le code sur l'IDE Arduino

Noter: pour le moment, il n’y a pas de carte pour le T-Call ESP32 SIM800L, mais nous avons sélectionné le Module de développement ESP32 et ça marche bien.

Manifestation

Ouvrez le moniteur série à un débit en bauds de 115200 et appuyez sur le bouton RST de la carte.

Tout d’abord, le module s’initialise puis tente de se connecter à Internet. Veuillez noter que cela peut prendre un certain temps (dans certains cas, il a fallu presque 1 minute pour terminer).

Une fois connecté à Internet, il se connectera à votre courtier MQTT.

ESP32 SIM800L se connecte à Internet à l'aide de la démonstration du plan de données de la carte SIM Courtier Cloud MQTT

Dans cet exemple, il publie de nouvelles lectures de capteur toutes les 30 secondes, mais à des fins de test, vous pouvez utiliser une période de temps plus courte.

Ensuite, ouvrez un navigateur et tapez votre domaine de serveur sur le /ui URL. Vous devriez voir les graphiques avec les dernières lectures de capteur et les interrupteurs à bascule pour contrôler les sorties.

ESP32 SIM800L GPRS GSM Cloud MQTT Broker Node-RED Démonstration du tableau de bord

Dépannage

Si à ce stade, vous ne parvenez pas à connecter votre module à Internet, cela peut être dû à l’une des raisons suivantes :

  • Les informations d’identification APN peuvent ne pas être correctes ;
  • L’antenne ne fonctionne peut-être pas correctement. Dans notre cas, nous avons dû remplacer l’antenne ;
  • Vous devrez peut-être sortir pour obtenir une meilleure couverture du signal ;
  • Ou vous ne fournissez peut-être pas assez de courant au module. Si vous connectez le module à votre ordinateur à l’aide d’un concentrateur USB sans alimentation externe, il se peut qu’il ne fournisse pas suffisamment de courant pour fonctionner.

Conclusion

Nous espérons que ce projet vous a plu. A notre avis, la Carte T-Call SIM800 ESP32 peut être très utile pour les projets IoT qui n’ont pas accès à un routeur à proximité via Wi-Fi. Vous pouvez connecter votre carte à Internet assez facilement en utilisant un forfait de données de carte SIM.

Vous aimerez aussi les projets suivants :

En savoir plus sur l’ESP32 avec nos ressources :

Merci d’avoir lu.