ESP32 Publish Data to Cloud without Wi-Fi (TTGO T-Call ESP32 SIM800L)

This project shows how to connect the TTGO T-Call ESP32 SIM800L board to the Internet using a SIM card data plan and publish data to the cloud without using Wi-Fi. We’ll program this board with Arduino IDE.

TTGO T-Call ESP32 SIM800L: Publish Data to Cloud without Wi-Fi

Watch the Video Tutorial

You can watch the video tutorial or continue reading for the complete project instructions.

Introducing the TTGO T-Call ESP32 SIM800L

The TTGO T-Call is a new ESP32 development board that combines a SIM800L GSM/GPRS module. You can get if for approximately $11.

TTGO T-Call ESP32 SIM800L GPS GPRS Board

Besides Wi-Fi and Bluetooth, you can communicate with this ESP32 board using SMS or phone calls and you can connect it to the internet using your SIM card data plan. This is great for IoT projects that don’t have access to a nearby router.

Important: the SIM800L works on 2G networks, so it will only work in your country, if 2G networks are available. Check if you have 2G network in your country, otherwise it won’t work.

To use the capabilities of this board you need to have a nano SIM card with data plan and a USB-C cable to upload code to the board.

ESP32 SIM800L Board USB-C cable for charging and data

The package includes some header pins, a battery connector, and an external antenna that you should connect to your board.

ESP32 SIM800L Board Package

However, we had some issues with that antenna, so we decided to switch to another type of antenna and all the problems were solved. The following figure shows the new antenna.

ESP32 SIM800L Board alternative antenna

Project Overview

The idea of this project is to publish sensor data from anywhere to any cloud service that you want. The ESP32 doesn’t need to have access to a router via Wi-Fi, because we’ll connect to the internet using a SIM card data plan.

TTGO T-Call ESP32 SIM800L: Publish Data to Cloud without Wi-Fi diagram

In a previous project, we’ve created our own server domain with a database to plot sensor readings in charts that you can access from anywhere in the world.

In this project, we’ll publish sensor readings to that server. You can publish your sensor readings to any other service, like ThingSpeak, IFTTT, etc…

If you want to follow this exact project, you should follow that previous tutorial first to prepare your own server domain. Then, upload the code provided in this project to your ESP32 board.

In summary, here’s how the project works:

  1. The T-Call ESP32 SIM800L board is in deep sleep mode.
  2. It wakes up and connects to the internet using your SIM card data plan.
  3. It publishes the sensor readings to the server and goes back to sleep.

In our example, the sleep time is 60 minutes, but you can easily change it in the code.

We’ll be using a BME280 sensor, but you should be able to use any other sensor that best suits your needs.

Hosting Provider

If you don’t have a hosting account, I recommend signing up for Bluehost, because they can handle all the project requirements. If you don’t have a hosting account, I would appreciate if you sign up for Bluehost using my link. Which doesn’t cost you anything extra and helps support our work.

Get Hosting and Domain Name with Bluehost »

Prerequisites

1. ESP32 add-on Arduino IDE

We’ll program the ESP32 using Arduino IDE. So, you need to have the ESP32 add-on installed in your Arduino IDE. Follow the next tutorial, if you haven’t already.

2. Preparing your Server Domain

In this project we’ll show you how to publish data to any cloud service. We’ll be using our own server domain with a database to publish all the data, but you can use any other service like ThingSpeak, IFTTT, etc…

If you want to follow this exact project, you should follow the next tutorial to prepare your own server domain.

3. SIM Card with data plan

To use the TTGO T-Call ESP32 SIM800L board, you need a nano SIM card with a data plan. We recommend using a SIM card with a prepaid or monthly plan, so that you know exactly how much you’ll spend.

4. APN Details

To connect your SIM card to the internet, you need to have your phone plan provider APN details. You need the domain name, username and a password.

In my case, I’m using vodafone Portugal. If you search for GPRS APN settings followed by your phone plan provider name, (in my case its: “GPRS APN vodafone Portugal”), you can usually find in a forum or in their website all the information that you need.

I’ve found this website that can be very useful to find all the information you need.

It might be a bit tricky to find the details if you don’t use a well known provider. So, you might need to contact them directly.

5. Libraries

You need to install these libraries to proceed with this project: Adafruit_BME280, Adafruit_Sensor and TinyGSM. Follow the next instructions to install these libraries.

Installing the Adafruit BME280 Library

Open your Arduino IDE and go to Sketch Include Library > Manage Libraries. The Library Manager should open.

Search for “adafruit bme280 ” on the Search box and install the library.

Installing BME280 library in Arduino IDE

Installing the Adafruit Sensor Library

To use the BME280 library, you also need to install the Adafruit_Sensor library. Follow the next steps to install the library in your Arduino IDE:

Go to Sketch Include Library > Manage Libraries and type “Adafruit Unified Sensor” in the search box. Scroll all the way down to find the library and install it.

Installing Adafruit Unified Sensor Driver library

Installing the TinyGSM Library

In the Arduino IDE Library Manager search for TinyGSM. Select the TinyGSM library by Volodymyr Shymanskyy.

Installing TinyGSM library

After installing the libraries, restart your Arduino IDE.

Parts Required

To build this project, you need the following parts:

You can use the preceding links or go directly to MakerAdvisor.com/tools to find all the parts for your projects at the best price!

Schematic Diagram

Wire the BME280 to the T-Call ESP32 SIM800L board as shown in the following schematic diagram.

TTGO T-Call ESP32 SIM800L with BME280 schematic diagram

We’re connecting the SDA pin to GPIO 18 and the SCL pin to GPIO 19. We’re not using the default I2C GPIOs because they are being used by the battery power management IC of the T-Call ESP32 SIM800L board.

Code

Copy the following code to your Arduino IDE but don’t upload it yet. First, you need to make some modifications to make it work.

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp32-sim800l-publish-data-to-cloud/
  
  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.
*/

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

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

// Server details
// The server variable can be just a domain name or it can have a subdomain. It depends on the service you are using
const char server[] = "example.com"; // domain name: example.com, maker.ifttt.com, etc
const char resource[] = "/post-data.php";         // resource path, for example: /post-data.php
const int  port = 80;                             // server port number

// Keep this API Key value to be compatible with the PHP code provided in the project page. 
// If you change the apiKeyValue value, the PHP file /post-data.php also needs to have the same key 
String apiKeyValue = "tPmAT5Ab3j7F9";

// 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

// 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

// Configure TinyGSM library
#define TINY_GSM_MODEM_SIM800      // Modem is SIM800
#define TINY_GSM_RX_BUFFER   1024  // Set RX buffer to 1Kb

// 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 <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

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

// I2C for BME280 sensor
TwoWire I2CBME = TwoWire(1);
Adafruit_BME280 bme; 

// TinyGSM Client for Internet connection
TinyGsmClient client(modem);

#define uS_TO_S_FACTOR 1000000UL   /* Conversion factor for micro seconds to seconds */
#define TIME_TO_SLEEP  3600        /* Time ESP32 will go to sleep (in seconds) 3600 seconds = 1 hour */

#define IP5306_ADDR          0x75
#define IP5306_REG_SYS_CTL0  0x00

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 setup() {
  // Set serial monitor debugging window baud rate to 115200
  SerialMon.begin(115200);

  // 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);

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

  // Restart SIM800 module, it takes quite some time
  // To skip it, call init() instead of restart()
  SerialMon.println("Initializing modem...");
  modem.restart();
  // use modem.init() if you don't need the complete restart

  // Unlock your SIM card with a PIN if needed
  if (strlen(simPIN) && modem.getSimStatus() != 3 ) {
    modem.simUnlock(simPIN);
  }
  
  // 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);
  }

  // Configure the wake up source as timer wake up  
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
}

void loop() {
  SerialMon.print("Connecting to APN: ");
  SerialMon.print(apn);
  if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
    SerialMon.println(" fail");
  }
  else {
    SerialMon.println(" OK");
    
    SerialMon.print("Connecting to ");
    SerialMon.print(server);
    if (!client.connect(server, port)) {
      SerialMon.println(" fail");
    }
    else {
      SerialMon.println(" OK");
    
      // Making an HTTP POST request
      SerialMon.println("Performing HTTP POST request...");
      // Prepare your HTTP POST request data (Temperature in Celsius degrees)
      String httpRequestData = "api_key=" + apiKeyValue + "&value1=" + String(bme.readTemperature())
                             + "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + "";
      // Prepare your HTTP POST request data (Temperature in Fahrenheit degrees)
      //String httpRequestData = "api_key=" + apiKeyValue + "&value1=" + String(1.8 * bme.readTemperature() + 32)
      //                       + "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + "";
          
      // You can comment the httpRequestData variable above
      // then, use the httpRequestData variable below (for testing purposes without the BME280 sensor)
      //String httpRequestData = "api_key=tPmAT5Ab3j7F9&value1=24.75&value2=49.54&value3=1005.14";
    
      client.print(String("POST ") + resource + " HTTP/1.1\r\n");
      client.print(String("Host: ") + server + "\r\n");
      client.println("Connection: close");
      client.println("Content-Type: application/x-www-form-urlencoded");
      client.print("Content-Length: ");
      client.println(httpRequestData.length());
      client.println();
      client.println(httpRequestData);

      unsigned long timeout = millis();
      while (client.connected() && millis() - timeout < 10000L) {
        // Print available data (HTTP response from server)
        while (client.available()) {
          char c = client.read();
          SerialMon.print(c);
          timeout = millis();
        }
      }
      SerialMon.println();
    
      // Close client and disconnect
      client.stop();
      SerialMon.println(F("Server disconnected"));
      modem.gprsDisconnect();
      SerialMon.println(F("GPRS disconnected"));
    }
  }
  // Put ESP32 into deep sleep mode (with timer wake up)
  esp_deep_sleep_start();
}

View raw code

Before uploading the code, you need to insert your APN details, SIM card PIN (if applicable) and your server domain.

Important: Most hosting services require you to make HTTPS requests. This code is not compatible with HTTPS. So, to make it work, you need to disable the HTTPS on your server or enable both HTTP and HTTPS(contact your hosting provider). Even though this board supports HTTPS requests, we couldn’t make it work. Nonetheless, you can try out this example sketch and see if it works for your board to make HTTPS requests: SIM800L HTTPS Client.

How the Code Works

Insert your GPRS APN credentials in the following variables:

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

In our case, the APN is internet.vodafone.pt. Yours should be different. We’ve explained previous in this tutorial how to get your APN details.

Enter your SIM card PIN if applicable:

const char simPIN[] = ""; 

You also need to type the server details in the following variables. It can be your own server domain or any other server that you want to publish data to.

const char server[] = "example.com"; // domain name: example.com, maker.ifttt.com, etc
const char resource[] = "/post-data.php";   // resource path, for example: /post-data.php
const int port = 80;                        // server port number

If you’re using your own server domain as we’re doing in this tutorial, you also need an API key. In this case, the apiKeyValue is just a random string that you can modify. It’s used for security reasons, so only anyone that knows your API key can publish data to your database.

The code is heavily commented so that you understand the purpose of each line of code.

The following lines define the pins used by the SIM800L module:

#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

Define the BME280 I2C pins. In this example we’re not using the default pins because they are already being used by the battery power management IC of the T-Call ESP32 SIM800L board. So, we’re using GPIO 18 and GPIO 19.

#define I2C_SDA_2            18
#define I2C_SCL_2            19

Define a serial communication for the Serial Monitor and another to communicate with the SIM800L module:

// 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

Configure the TinyGSM library to work with the SIM800L module.

// Configure TinyGSM library
#define TINY_GSM_MODEM_SIM800      // Modem is SIM800
#define TINY_GSM_RX_BUFFER 1024    // Set RX buffer to 1Kb

Include the following libraries to communicate with the SIM800L.

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

And these libraries to use the BME280 sensor:

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

Instantiate an I2C communication for the SIM800L.

TwoWire I2CPower = TwoWire(0);

And another I2C communication for the BME280 sensor.

TwoWire I2CBME = TwoWire(1);
Adafruit_BME280 bme; 

Initialize a TinyGSMClient for internet connection.

TinyGsmClient client(modem);

Define the deep sleep time in the TIME_TO_SLEEP variable in seconds.

#define uS_TO_S_FACTOR 1000000     /* Conversion factor for micro seconds to seconds */
#define TIME_TO_SLEEP  3600        /* Time ESP32 will go to sleep (in seconds) 3600 seconds = 1 hour */

In the setup(), initialize the Serial Monitor at a baud rate of 115200:

SerialMon.begin(115200);

Start the I2C communication for the SIM800L module and for the BME280 sensor module:

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

Setup the SIM800L pins in a proper state to operate:

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);

Initialize a serial communication with the SIM800L module

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

Initialize the SIM800L module and unlock the SIM card PIN if needed

SerialMon.println("Initializing modem...");
modem.restart();
// use modem.init() if you don't need the complete restart

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

Initialize the BME280 sensor module:

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

Configure deep sleep as a wake up source:

esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);

Recommended reading: ESP32 Deep Sleep and Wake Up Sources

In the loop() is where we’ll actually connect to the internet and make the HTTP POST request to publish sensor data. Because the ESP32 will go into deep sleep mode at the end of the loop(), it will only run once.

The following lines connect the module to the internet:

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

Prepare the message data to be sent by HTTP POST Request

String httpRequestData = "api_key=" + apiKeyValue + "&value1=" + String(bme.readTemperature())
+ "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + "";

Basically, we create a string with the API key value and all the sensor readings. You should modify this string depending on the data you want to send.

The following lines make the POST request.

client.print(String("POST ") + resource + " HTTP/1.1\r\n");
client.print(String("Host: ") + server + "\r\n");
client.println("Connection: close");
client.println("Content-Type: application/x-www-form-urlencoded");
client.print("Content-Length: ");
client.println(httpRequestData.length());
client.println();
client.println(httpRequestData);

unsigned long timeout = millis();
while (client.connected() && millis() - timeout < 10000L) {
  // Print available data (HTTP response from server)
  while (client.available()) {
    char c = client.read();
    SerialMon.print(c);
    timeout = millis();
  }
}

Finally, close the connection, and disconnect from the internet.

client.stop();
SerialMon.println(F("Server disconnected"));
modem.gprsDisconnect();
SerialMon.println(F("GPRS disconnected"));

In the end, put the ESP32 in deep sleep mode.

esp_deep_sleep_start();

Upload the Code

After inserting all the necessary details, you can upload the code to your board.

To upload code to your board, go to Tools > Board and select ESP32 Dev module. Go to Tools > Port and select the COM port your board is connected to. Finally, press the upload button to upload the code to your board.

Upload Code to Arduino IDE

Note: at the moment, there isn’t a board for the T-Call ESP32 SIM800L, but we’ve selected the ESP32 Dev Module and it’s been working fine.

Demonstration

Open the Serial Monitor at baud rate of 115200 and press the board RST button.

First, the module initializes and then it tries to connect to the internet. Please note that this can take some time (in some cases it took almost 1 minute to complete the request).

After connecting to the internet, it will connect to your server to make the HTTP POST request.

Finally, it disconnects from the server, disconnects the internet and goes to sleep.

ESP32 SIM800L connect to the internet using SIM card data plan demonstration

In this example, it publishes new sensor readings every 60 minutes, but for testing purposes you can use a shorter delay.

Then, open a browser and type your server domain on the /esp-chart.php URL. You should see the charts with the latest sensor readings.

TTGO T-Call ESP32 SIM800L: Publish Data to Cloud without Wi-Fi BME280 charts demonstration

Troubleshooting

If at this point, you can’t make your module connect to the internet, it can be caused by one of the following reasons:

  • The APN credentials might not be correct;
  • The antenna might not be working properly. In our case, we had to replace the antenna;
  • You might need to go outside to get a better signal coverage;
  • Or you might not be supplying enough current to the module. If you’re connecting the module to your computer using a USB hub without external power supply, it might not provide enough current to operate.

Wrapping Up

We hope you liked this project. In our opinion, the T-Call SIM800 ESP32 board can be very useful for IoT projects that don’t have access to a nearby router via Wi-Fi. You can connect your board to the internet quite easily using a SIM card data plan.

We’ll be publishing more projects about this board soon (like sending SMS notifications, request data via SMS, etc.) so, stay tuned!

You may also like:

Learn more about the ESP32 with our resources:

Thanks for reading.



Learn how to build a home automation system and we’ll cover the following main subjects: Node-RED, Node-RED Dashboard, Raspberry Pi, ESP32, ESP8266, MQTT, and InfluxDB database DOWNLOAD »
Learn how to build a home automation system and we’ll cover the following main subjects: Node-RED, Node-RED Dashboard, Raspberry Pi, ESP32, ESP8266, MQTT, and InfluxDB database DOWNLOAD »

Enjoyed this project? Stay updated by subscribing our newsletter!

195 thoughts on “ESP32 Publish Data to Cloud without Wi-Fi (TTGO T-Call ESP32 SIM800L)”

  1. Muito Obligado Rui, thanks very much, can we see in a video how do you insert the SIM card in the board?

    Also an idea, what about a simple app using app.inventor to send an SMS to this board and according to the SMS it checks a specific sensor and then it sends an SMS back, so the board gets the message and the phone number that sends the request to know the status of a sensor, for example someone wants to know the humidity or the temperature of a far away garden, or send a command to open a valve for 5 seconds for water, and with this we can send commands without the need of a router, which is GREAT !!!! THANKS AGAIN

    Reply
    • Hi Tomas.
      We’ll post more tutorials about this board: show how to make things happen by sending SMS and request data via SMS.
      So, stay tuned.
      Thank you for following our work.
      Regads,
      Sara

      Reply
      • Olá Sara e Rui,

        Estou usando a TTGO TCall a algum tempo sem usar a biblioteca TinyGSM que vem apresentando problemas, contudo venho fazendo requisicoes HTTP GET com sucesso, contudo, preciso fazer POST em vez de GET e não estou tendo exito com os comandos:

        dados=”fname=John&lname=Doe”;
        url=”ttgo.requestcatcher.com”;
        AT+SAPBR=1,1
        AT+SAPBR=2,1
        AT+HTTPINIT
        AT+HTTPPARA=CID,1
        “AT+HTTPPARA=URL,\”” + url+”\””
        “AT+HTTPPARA=\”USERDATA\”,\””+dados+”\””
        “AT+HTTPPARA=\”CONTENT\”,\”application/x-www-form-urlencoded\””
        “AT+HTTPDATA=” + String(dados.length()) + “,5000”
        AT+HTTPACTION=1

        A requisição chega em branco no servidor. alguma ideia?

        Reply
  2. Excellent as usual
    Congratulations.
    I was thinking on doing something very similar but with yur tutorial, things will be much easier and fast.
    Great saved me hours and hours.
    carlos Frondizi

    Reply
    • Thanks for the very good tutorial. I recently purchased a t-call and was a bit fazed by the documentation. This has spelled it out perfectly. One thought I have had is, if it takes up to one minute to connect to the internet, the esp32 could be awake for up to 50% of the time. Depending on the currency of the data required, it could simply take a reading once a minute, for say 10 minutes and then connect to upload all 10 data points.

      This would require keeping a counter of where in the cycle of 10 readings it is. EEPROM I guess would be the best place to keep that variable.

      This way uptime would be reduced to about 12%.

      Thanks for the great resource.

      Reply
  3. Ótimo tutorial Sara e Rui,

    Voces podem nos informar qual o tamanho do pacote de dados, em bytes, enviado em um dia ?
    ———————————————————————————————
    Great Tutorial Sara and Rui,
    Can you tell us the data packet size send in one day ?

    Reply
  4. Hi, the SIM800L only support 2G right? Any possibilities we can the same code for GSM module with 3G/4G connection for improve speed. Thanks.
    By the way, great tutorial as always!!

    Reply
    • Hi Umar.
      That’s right.
      The code should be compatible with other modules with just a few changes for proper initialization.
      See the TinyGSM library documentation: github.com/vshymanskyy/TinyGSM
      Regards,
      Sara

      Reply
  5. Hello Sara and Rui!

    A big thanks for your very informative and well organised instruction videos!
    At present I am working with the TTGO T-Call unit, and sending data works perfect. I am very interested to know how data can be sent using JSON; do you plan an introductory video on that in the (hopefully near) future?

    Regards, Hans

    Reply
  6. As per other comments, this device and the variants of the Sim 900 are 2G devices and this service is no longer available in my country (Australia) and several others so please also include projects that use 3G or 4G as well
    Regards
    Phil

    Reply
    • Hi Phill.
      I’ve added a big note at the beginning of the post about that.
      This board is 2G, that’s why it is so cheap compared with other 3G and 4G modules (tha cost between 25$ and 50$ just the module without ESP32).
      Unfortunately, 2G is not supported in all countries.t
      But, if you want to use a 3G and 4G module, most of the code should be compatible. The TinyGSM library is compatible with a wide variety of modules. You just need to initialize the module with the proper configurations.
      We’ll take a look at some 3G and 4G modules and probably create some tutorials in the future.
      Regards,
      Sara

      Reply
      • Hi Sara – I have only been able to find shields or devices for much more than that, closer to $70-80. Do you have recommendations for any cheaper boards/modules I can use that support LTE (as 3G is on its way out too it seems). Thanks!

        store.arduino.cc/usa/arduino-mkr-nb-1500

        Reply
        • Hi Jeff.
          Unfortunately, 4G Shields are very expensive. Around 60$ to 80$.
          I couldn’t find anything cheaper.
          Regards,
          Sara

          Reply
  7. When the ESP is in deep sleep, are the ancillary devices unit powered down on this device (GSM module, Serial to USB module etc)? Thinking about optimum battery life for in the field devices… Thanks.

    Reply
  8. Olá, acabou de chegar minha TTGO T-Call ESP32 SIM800L, carregar este firmware o ESP32 fica eternamente dando a seguinte mensagem de erro, em que essa mensagem vai se repetindo sem parar:

    Rebooting…
    ets Jun 8 2016 00:22:57

    rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
    configsip: 0, SPIWP:0xee
    clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
    mode:DIO, clock div:1
    load:0x3fff0018,len:4
    load:0x3fff001c,len:956
    load:0x40078000,len:0
    load:0x40078000,len:13076
    entry 0x40078a58
    assertion “false && “item should have been present in cache”” failed: file “/Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/nvs_flash/src/nvs_item_hash_list.cpp”, line 85, function: void nvs::HashList::erase(size_t)
    abort() was called at PC 0x400d1283 on core 0

    Backtrace: 0x4008704c:0x3ffc62c0 0x4008714b:0x3ffc62e0 0x400d1283:0x3ffc6300 0x400e3b20:0x3ffc6330 0x400e3e8e:0x3ffc6350 0x400e41bd:0x3ffc63a0 0x400e3934:0x3ffc6400 0x400e3776:0x3ffc6450 0x400e380f:0x3ffc6470 0x400e385a:0x3ffc6490 0x400e1054:0x3ffc64b0 0x400e1003:0x3ffc64d0 0x400d1b6e:0x3ffc6500

    Você sabe como eu poderia solucionar esse problema?
    Desculpe pelo post no outro tutorial que não era este

    Reply
    • Hi Eduardo.
      Those kind of errors are very difficult to troubleshoot.
      Sometimes the ESP32 keeps rebooting when we don’t provide enough power.
      For example, if you’re using a USB hub, it may not provide enough current. Or try another USB port.
      At the moment, I don’t know what exactly can cause that problem.
      Regards,
      Sara

      Reply
      • Hi Sara and Rui!
        Congratulations for your tuto.
        Im asking about make a mesh network using this module as root node, avoiding to use a router.
        It would be posible?
        Thanks for your Job.👌

        Reply
    • Olá Eduardo, se você não modificou o código, verifique além de onde está sua placa, num hub usb ou na USB do computador, o chip precisa de muita corrente pra funcionar. Pelo log parece que seu programa não pode ser gravado totalmente. Sei que tem um plugin para Arduino que interpretar esse backtrace e indica onde está o erro no código.

      https://github.com/me-no-dev/EspExceptionDecoder

      Reply
  9. Muito Obligado, I am from El Salvador, and I have a couple of ideas, I found today this “GSM Module SIM800L With MIC & 3.5mm Headphone Jack” is it possible to integrate with the ESP32 to create a very simple mobile?

    Here are the ideas:

    – voice to text. Sends a verbal instruction from a mobile to an ESP32

    – text to voice. An ESP32 sends a SMS to another ESP32, like a temperature warning, but you don’t need to check incoming SMS because you will use speakers.

    Reply
  10. Hi Sara & Paul,

    Great project, and well explained.

    Im thinking of using this for my (snail) mailbox , so i can a notification when i receive my newspaper or letters. (my mailbox is far away from my home)

    So i will use a small switch to trigger when the mailbox receives mail
    Question : how do i set it up that it triggers IFTTT, or will you do a tutorial on that ?
    I use Domoticz and that can receive triggers from IFTTT

    keep up the good work

    Reply
  11. Hi,
    The SIM800L module is very power hungry and needs up to 2A (Amperes) when transmitting. The module will reboot and blink 7-8 times when the voltage is dropping due to insuffient Power. This is well described in the datasheet for the SIM800L. Use a Lipo battery charger and Lipo battery to Power this Board. A fully charged Lipo will give 4.1 Volts which is optimal for the SIM800.Max voltage is around 4.3-4.4 volts and it will send out a Message if the voltage is to high.
    I also put a 1000 micro Farad capacitor between + and – Close to the module. Datasheets can be very useful for practical use of all kinds of modules and parts.

    Reply
  12. Many thanks Rui and Sara for another great tutorial, you have taught me a lot about the TTGO T-Call in an easy and understandable manner. My first remote air quality system using this module has been running well and collecting data.
    With my new knowledge I have now successfully migrated over to using a SIM7000G module with NB IoT and an ESP32.
    Eagerly awaiting another project!

    Reply
    • Hi Richard.
      Rui show me your project and it looks great!
      Congratulations!
      It’s very rewarding see what our readers can build with our tutorials.
      Best wishes.
      Sara 😀

      Reply
    • Hey Richard,

      Can you post the differences in the code between the T-call and SIM7000G?

      The T-Call connects to (modem.gprs), does the SIM7000 connect to (modem.lte)?

      Reply
      • Hi Adam,
        It’s been a long time since I did this project and the system is still up and running nicely. The SIM7000G board is connected to an ESP32, here are the relevant bits of code that if I remember correctly are different from the TTGO unit.

        #define TINY_GSM_MODEM_SIM7000
        #define TINY_GSM_RX_BUFFER 1024
        #include <HardwareSerial.h>
        #include <TinyGsmClient.h>

        HardwareSerial SerialAT(1);

        #define modemPwKey 23
        #define modemTx 17
        #define modemRx 16

        TinyGsm modem(SerialAT);
        TinyGsmClient client(modem);

        const char apn[] = “cmnet”; //China Mobile
        const char gprsUser[] = “”; //For China Mobile no user required
        const char gprsPass[] = “”; //For China Mobile no password required

        void setup() {
        Serial.begin(115200);
        pinMode(modemPwKey, OUTPUT);
        digitalWrite(modemPwKey, LOW);
        SerialAT.begin(115200, SERIAL_8N1, modemRx, modemTx);
        delay(3000);
        modemStart();
        }

        If you have any problems or need help just let me know.
        Richard

        Reply
  13. Nice tutorial!
    Can anyone help me out and tell me can the TTgo T-call be powered by the 5 v pin, or that pin is for 5 v input! I’m asking because i ordered an USB C converter from Banggood and my bag was empty, the support was rude, and i lost my money ! So now no usb connection, i must use the rx tx onboard and i must power it somehow! Thanks

    Reply
      • Like Sara said, you can use the 5V pin to power your device. There is one downside to this though. Powering your TTGO ESP32 SIM800L this way does not allow charging of the battery via the on-board battery connector. This feature is only available when powered via USB-C.

        Reply
  14. Hi Sarah, hi Riu,

    i tryed to upload a sketch, but doesn’t work anywell.
    While loading, I keep the button pressed, but it doesn’t work.
    i’d like to connect à 10µF capacitor, but there is’nt EN pin on the board.
    I prefer not to weld directly on the board.
    Have you an idea how to do this?

    Thank you 🙂

    Reply
  15. Hi Sara, Firstly thank you for the amazing tutorials, they have taught me a lot.

    Having said that though, with my limited coding knowledge, I have been trying to replace the HTTP post method above to rather work with a MQTT broker that requires a username and password. Any pointers you can give me here on how to do this to the example above would be greatly appreciated.

    Looking at your other tutorials with MQTT I also could not find an example where the MQTT broker requires a username and password. Thank you in advance for any assistance. Many Thanks

    Reply
  16. Hello again, Sara and Rui, great tutorial as usual even if we might not have 2G for long here in the Philippines. I suppose I can interface an ESP32 with some LTE module to get the same result.

    As an aside, T-Call implies that it can do voice calls. Have you tested that? Can’t find anything in the tech docs, but then I haven’t looked that closely.

    Lastly, what software or app did you use to create that neat Schematic Diagram, which shows up at 3:37 in the video tutorial and again toward the middle of this post?

    Thanks again, and regards

    Reply
  17. Hi Rui, I am trying to connect to Google’s FireBase, but it is impossible, among other things I don’t know how to connect with the API key that they give me. What should i do to connect to the SIM800L? thanks for this tutorial.

    Reply
  18. Hi Sara, I am trying to connect to Google’s FireBase, but it is impossible, among other things I don’t know how to connect with the API key that they give me. What should i do to connect to the SIM800L? thanks for this tutorial.

    Reply
  19. Greetings, thanks for the tutorial.
    Can I connect two 18650 lithium batteries in parallel to the module (TTGO T-Call ESP32 SIM800L)? Can the power manager supply enough current to charge the two batteries in parallel?

    Reply
    • I can’t see why not. The max charge current is limited to 500ma though, so they will just take some time to charge. It will take approximately 1-hour of charge for every 500mAh of battery power consumed.

      Reply
  20. In the examples, you say not to use the default I2C pins as these are used by power management. Why would this pose a problem, seeing as I2C connected devices each have their own unique address? I am asking this because I have run into some strange behaviour trying exactly this, even with external discreet pull-up resistors added on the default SCL and SDA. It is easy enough to create a second I2C interface (thanks to your example!), but I would like to understand what the problem is.

    Reply
  21. Hi Rui, do you know whether can we communicate with an https server using TinyGSM library? According to Github project page, it supports SSL. But I couldn’t find an example code as to how to get it done.

    Reply
  22. Hi Sara and Rui, thanks for this brilliant tutorial.

    I tried this on my ttgo t-call module and it worked like a charm.
    I just wanted to send an image (i.e. a file) instead of sensor data using http request. Can you help me with that?

    Reply
    • Hi.
      At the moment, we don’t have a tutorial about that.
      We’ll publish something like that soon with an ESP32-CAM, that you can adapt to your board.
      Regards,
      Sara

      Reply
  23. Hi Sara,
    Congratulation for your nice project and description.
    You inspired me to use http post method in my project, called “TALMOB”.
    Which is an client-server based temperature logging and monitoring application. Was developed originally with TCP connection and python on server side…
    Thank you for your great description!!!

    Reply
  24. Great writeup!

    ive trying to add second BME sensor. using the adafruits library i cant get the 2nd sensor reading (return 0).

    both address already set (0x77 and 0x76) via ground and vcc

    do you have any other good library that support this?

    Reply
  25. It would be perfect to get version of connecting with cloud based MQTT broker via GPRS on TTGO T-Call ESP32 SIM800L

    Reply
  26. Hello, would you be able to provide a link to the antenna you used? I can’t seem to find one anywhere. Or if you can’t provide a link, what should I search to find one. Thanks!

    Reply
  27. Hey, thank you for this tutorial!

    I learned much. I have same question.

    I want to connect another I2C in Two Wire, BH1750.
    I need to use: Wire.begin(I2C_SDA_2, I2C_SCL_2, 400000);
    to start the module.

    But
    If a use:

    I2CPower.begin(I2C_SDA, I2C_SCL, 400000);
    I2CBME.begin(I2C_SDA_2, I2C_SCL_2, 400000);
    Wire.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”));

    IP5306 always FAIL

    I’m using

    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”));

    Wire.begin(I2C_SDA_2, I2C_SCL_2, 400000);

    IP5306 always OK

    But I think if it can prejudice the I2C Power

    What is the right way to do this integration?

    Thank you in advance for your attention

    Reply
  28. hi Rui, nice tutorial, so basically this 800l only work on 2G, what if in my counry has higher like 4G?
    if run only in 2G I think it will slow sent the data right?

    Reply
  29. HI,

    I follow your excelent tutorial but at the end I just receive 0 in my database.

    Any suggestion what is the possible problem?

    Thank you

    Reply
  30. Ciao Sara, and ciao Santos,
    I hope you are very well.
    I’d like to connect the TTGO T-Call to Telegram using the GSM, rather than the WIFI like in your tutorial for ESP32. Do you think is it possible? A tutorial on it would be very usefull, I’m not been able to find anything about it.

    Reply
      • Thanks for your answer Sara. In the meaning time I tried to modify the code for connecting the TTGO CALL to TELEGRAM, but it doesn’t work. I hope I’m wrong but perhaps the SIM800 modem does not support TLS 1.2
        Merry Christmas.

        Reply
  31. Hi,
    Thanks for another great tutorial…

    This module also contains charting circuit for the connected LiPo battery through USB-C connector. Are there any way to connect e.g. a solar panel directly to the board for charging? Is the USB-C connector the only way to use the charging feature?

    Thanks in advance
    Michael

    Reply
  32. Hello Rui & Sara, Thanks very much for this great tutorial. I was thinking if there is a way how I can set up the data connection credentials (apn, gprs user, gprspass) through smart config instead of pre-programming the details. Do you have a tutorial on this?
    Thanks very much for your support!

    Reply
  33. Sorry, I commented on the wrong article. This is right!

    Hi, could you help me?

    I made a schedule based on this to connect to Wunderground, but I am trying a problem, after a while the message sending stops. If you restart the ESP32 via USB, the sending returns, but by programming it remains locked and without sending messages. I realized that the connection step with the operator is the step that presents the error. Have you seen anything like that?

    Reply
  34. Hello Sara and Rui,

    Thank u very much for your excellent tutorials.

    Actually i’d like to send image captured by esp32 cam to server using simcom 800a
    rather using wifi.

    Can u please help me with this.

    Reply
  35. 2G is pretty old, have you tried LTE on LilyGo Sim7000G?
    I get the following error with 7000G;
    #error “Please define GSM modem model”
    Anyone had a similar issue with the 7000 G board?

    Thanks,
    MoZen

    Reply
  36. Thank you very much for the tutorial,

    I have a problem that I cannot solve. I share it with you to see if you can help me.

    I have gone through all the wiring steps and the board is working fine with some programs, but it failed to detect the sensors. When I test the “I2C Test” it only detects the following:

    19: 46: 24.705 -> Scanning …
    19: 46: 24.740 -> I2C device found at address 0x75!
    19: 46: 24.775 -> done

    But it doesn’t detect any sensor.

    I have gone through the cabling several times and tested with the default pins for SDA and SCL (21 and 22) and others configured ad-hoc (18 and 19, following the example).

    I have also seen the entire tutorial below multiple times:

    https://randomnerdtutorials.com/esp32-i2c-communication-arduino-ide/

    But it only detects 0x75 …

    Does anyone know what may be happening?

    Thanks a lot!

    Reply
  37. Dear Sara,
    dear Ruiz,

    first of all I would like to say Thank you! for your extraordinary work.

    Although o also like “the guy with the swiss accent” a lot, “Great Scott”, Frans Lab, Mr. Carlson from his special “vacuum lab” and the magnificent bright folks that brought the ACG to life again… all of those (except Great Scott and Andreas Spiess), I stick with Randomnerdtutorials.

    Your work leads to results. Real results in the perfect mixture between laziness and keep your nose to the grindstone. All in all wonderful.

    When i want to create a system that gathers a bunch of sensor data in the field, I’m using your tutorials (especially the ones for ESP NOW).

    I also tried your tutorials covering TTGO SIM800L, but with that my setup did not work, when using TINYGSM. That reboots all the time when trying the sketch.

    SIM800-Parser
    On http://www.aeq-web.com two Austrian guys use a low level approach with direct AT-Instructions. However the problem with that is, that it is kind of tricky to grab the results of instructions, such as “Give me the signal strengh.” or “Show me the ‘GPS’ corrordinates”.

    Playful technology created a very interesting project

    https://youtu.be/mbOHl2Cnemk?t=1323

    with a parser to process output of SIM800L. However this is no tutorial. Little chance to pattern after…

    Maybe there is a choice to cover the SIMXX00 again, or one of it`s relatives (with LTE).
    This could be great for citizen data, because the coverage with TTN-LORA still is very low.

    So, SIMXX00 is literally the only way to publish the data. In this respect thank you very much for your advice with the external antenna. It is astonishing how good the board works with the antenna that you mentioned. I was able to transfer data very realiable even from inside conrete basements, when my phone ceased to work.

    Sorry for this far too long post and thank you again very much.

    Reply
    • Hi Tony.
      I think we have a board with LTE, but I didn’t have the time to experiment with it yet.
      Thanks for your comment.
      Regards,
      Sara

      Reply
  38. Hi, may I know how do I send image to google drive using the combination of GSM module and ESP32-CAM? Is it possible to achieve it?

    Reply
  39. Hi, thanks for the nice and detailed tutorial, I have a question, is there any particular reason behind using separate I2C bus for the BME280 sensor?

    Reply
  40. Hi – very useful tutorial, thanks.

    However, I find that a sleep time of 3600 seconds doesn’t give any sleep time at all! My ESP32SIM800L simply wakes up straight after going to sleep.

    I have investigated this and find that a delay of 2147 seconds seems to work; at least the system goes to sleep for a while…I haven’t waited for it to wake up. 2148 seconds reverts to no sleep time. 10,000 seconds gives some sleep, but again I haven’t actually waited for it to wake up to see if it actually sleeps for 10,000 seconds. I doubt that it does.

    I’m guessing that the maximum sleep time would be 2^31 – 1 micro-seconds, i.e. the maximum positive value a long can hold. This evaluates to 2147.483647 seconds.

    Reply
  41. Upon further investigation, I find that the code in the Arduino/ESP32/DeepSleep/TimerWakeUp Example includes the line (line 22)
    #define uS_TO_S_FACTOR 1000000ULL
    In your code you have
    #define uS_TO_S_FACTOR 1000000
    This should be
    #define uS_TO_S_FACTOR 1000000UL
    so that the arithmetic is carried out as an unsigned long variable.
    My code now works for a delay of 3600 seconds.

    Reply
  42. Hi Sara, hi Rui, thank you for the tutorial. I would like to send the data to Thingspeak, unfortunately I always get a Bad Request message. I have made the following adjustments:

    // Server details
    // The server variable can be just a domain name or it can have a subdomain. It depends on the service you are using
    const char server[] = “api.thingspeak.com”; // domain name: example.com, maker.ifttt.com, etc
    const char resource[] = “”; // resource path, for example: /post-data.php
    const int port = 80;

    String apiKey = “MYAPIKEY”;

    String httpRequestData = “api_key=” + apiKey + “&field1=” + String(bme.readTemperature())
    + “&field2=” + String(bme.readHumidity()) + “&field3=” + String(bme.readPressure()/100.0F) + “”;

    I tried to modify your tutorial to HTTP POST, but unfortunately I always get the error message. Can you tell me where the error is?

    Regards, Phillip

    Reply
  43. Hi, very nice tutorial. Do you know if there is a way to detect if the power to the USB is active. I can check the battery voltage through PIN35 but cant find a way to check the USB voltage.

    Reply
  44. hi sara Arduino:
    GPS_Tracker_with_ttgoesp32:26:74: fatal error: BlynkSimpleSIM800.h: No such file or directory
    when i try to upload my coding its showing like this where i have inserted this library in the ide, but still getting this error. do u have this library with u?TQ

    Reply
  45. Thanl you for great tutorial.I have question. According to the schematic Spi pins mosi:gpio23 cs:gpio5 and sim800l uses 5 and 23 ,does it mean I can t use spi and sim800l at the same time?So,I have to remap spi pins ,right?

    Reply
  46. Hi Rui and Sara,

    Great tutorial.
    I am using SIM800L with AT commands. Problem is my vendor APIs are HTTPS instead of HTTP.

    I keep getting 601 or 603 or similar errors (DNS error etc) after sending the data via AT commands.

    As well, the APIs are JSON based and need to post data via FormBody instead of string encoding. This is another headache which I will deal with later on :(.

    May you confirm if SIM800L support HTTPS and if so point to any help locations please?

    Reply
  47. Hello, I used part of the code to send data from other sensors to thingspeak, but I only manage to send integer values and no decimal places, I have the variables in floating type and I also tried to pass them to string type, but I still cannot send numbers with decimals, any solution ? Thanks in advance

    Reply
    • Hi Diego, I’ve been trying the same thing but I haven’t been able. Don’t know connect with thinkspeak.
      Could you share the code .
      Thanks in advance.
      castrojm1 at gmail.com

      Reply
  48. Hello,
    is it possible to set APN settings via SMS? If so, how? I want to use device on several countries with different SIM card, but I do not want to flash code every time.

    Reply
  49. Hi Rui & Sara,

    I use the I2C scanner with UNO and return value of 0x76 for the BME280 but when connected to the ESP32 for this tutorial, it returned “Could not find a valid BME280 sensor, check wiring!
    “.

    please advise.

    Reply
  50. Hi. Very good tutorial.

    I have one problem. When i start the I2C communication for the SIM800L module and for the BME280 sensor module the ID show me the following error: call of overloaded ‘begin(int, int, int)’ is ambiguous
    How can I solve this?

    Thanks

    Reply
  51. Hi thank you for this wonderful project,
    I just have a problem is that I try different sim card and I encounter the same problem with the “APN connection faiI”,
    I don’t know how to solve this

    Reply
  52. Hi there,
    I would like to connect more DS18B20 digital temperature sensors. Can you help me how to extend the code?

    Best regards
    Manfred

    Reply
    • I have the next error

      Wire.h:80:10: note: candidate: ‘bool TwoWire::begin(uint8_t, int, int, uint32_t)’
      bool begin(uint8_t slaveAddr, int sda=-1, int scl=-1, uint32_t frequency=0);
      ^~~~~
      exit status 1
      call of overloaded ‘begin(int, int, int)’ is ambiguous

      Have to be the library right?

      Regards

      Reply
  53. Olá Rui e Sara,
    Desejo-vos bom 2022
    Gostaria de talvez usar o módulo TTGO-Call só que necessito saber quantos pinos de entradas e para saídas estão disponíveis na placa assim existe além das Uarts usadas, se está disponível uma terceira. Paro o meu projeto necessito 5 pinos para saída e 12 pinos para entradas. Caso possam dar essa informação fico grato.

    Obrigado
    João

    Reply
  54. Hey, I am a fan of your YouTube channel and page, I am trying to transfer some data from PC (CodeSys or TIA portal) to nodemcu (ESP8266) using an ethernet module (ENC28J60). I have tried many times and failed. Since you are an expert in these, can you help me out if you have the time? much appreciated. thanks

    Reply
  55. Hello,

    Thank you very much for your excelent work. I would like to ask you about using DHT22 sensor with this module. I have a problem when I start the tcall module by feeding it. Once I feed it, it does not start untill I put away the DHT22 sensor (I mean to unplug the feed of DHT22 sensor which is using the 5V output PIN of the tcall and I did also use the 3.3V PIN with the same results). Once the tcall is on I can connect again the DHT22 and it works perfectly forever. I have a lot of different ideas about how to solve it, but all of them include hardware modifications or power supply modification like powering the module and the sensor from the same power source and do not use the module power PINs.

    Do you have any software solution for this problem? Or any kind of suggestion? I’m feeding it with enough current (tried from 1A to 4A) and 5V. The wiring is as simple as DATA to digital PIN12 and GND to GND PIN and VCC to 5V PIN (or 3.3V PIN).

    Reply
  56. Hi,
    I need to connect to my server using https so, the code “(!client.connect(server, port))” won’t work with 443 as port number.
    Is there a work around?
    Thank you!!

    Reply
  57. Thank you for your wonderful resource, well written and tested!
    I am using the TTGO T-Call ESP32 SIM800L for remote temperature monitoring. The code works perfectly but I wish to get an SMS alarm if the mains power is lost so that I can visit the site and restore power before the battery runs out. I can use a crude method by simply intercepting the 5v from the USB C connector via a breakout box but I guess that the IP5306 must have some sort of flag to say a charger is connected and this would be a more elegant and reliable solution. Are you aware of such a register and a method to read it? I see that the IP5306 register it is written to, (setPowerBoostKeepOn) but I can’t find out how to read the relevant register, if it exists, to tell me that the charger is connected. Any ideas, pointers etc please.

    Reply
  58. Hi Sara and Rui,
    I need understand some issues about TTGO board.

    I made a webserver using TTGO TCall, but I like to server some html pages from GSM to permit i access a html page of the ttgo, like inside WiFi network.
    To use the sim8000L I need use the tinyGSM only?

    I tried send AT commands to serialAT but I have problems to read the serialAT response.

    Reply
    • Hi.
      No.
      You can use the codes for a regular ESP32.
      For example, you can use any web servers we have for the regular ESP32 on this board. Here are examples of web servers: https://randomnerdtutorials.com/?s=web+server
      You just need to make sure you take a look at your board’s pinout which is a bit different from a regular ESP32.
      Regards,
      Sara

      Reply
  59. how to solve this error

    HTTP/1.1 301 Moved Permanently
    Date: Mon, 18 Apr 2022 12:54:25 GMT
    Transfer-Encoding: chunked
    Connection: close
    Cache-Control: max-age=3600
    Expires: Mon, 18 Apr 2022 13:54:25 GMT

    Reply
    • 301 moved,

      Http 301 notification says. Your page is moved to a new address or to inform you that page now is HTTPS…
      Open at web browser the page or try this test a n computer

      Telnet http://www.myurl.com 80

      You will see a prompt.

      Type:

      GET http://www.myurl.com HTTP1.1

      You will see the 301 error and sometimes show the HTTPS URL to access with port 443 ou a new location to open.

      maybe your page is HTTPS only now. Try change to HTTPS. Or use another URL.

      Reply
  60. First, congratulations on the article. It’s excellent.
    Recently, in April 2022, I stayed in Lisbon and did a test with the TTGO T-Call V1.3 with Vodafone SIM, but it was unsuccessfully. TTGO T-Call V1.3 can’t be connected to a cell network with the APN specifications. I bought the Vodafone SIM at the shopping, so it is a common SIM card.
    I did a successfully test on Brasil with Claro SIM card. So, the program and hardware are ok.
    There are new APNs on the Vodafone Network? Can I use Hologram or Things Mobile SIM Cards with the TTGO T-Call V1.3?

    Reply
  61. Hi,
    Im tryign to modify the code to send data at 1Hz, how do I go about makign the piost request repetitively once the connection to the server has been made?

    Reply
  62. Hi!
    I would like to know this program would work with LILYGO® TTGO T-SIM A767SA R2: according to the manufacturer, this card works on the 4G network in South America, among others.
    Thanks.

    Reply
  63. Hi,
    thanks for an amazing tutorial .
    i am trying to read the battery status level with i2c address 0X78
    but i always get 0 as output.
    do you have any tutorial for knowing the battery status ?

    Reply
    • Hi.
      No. Unfortunately, at the moment, we don’t have any tutorials about that subject.
      Check if it can successfully establish an I2C communication and that you’re reading on the right address and pins.
      Regards,
      Sara

      Reply
  64. I’m trying to follow the example here. I’m stuck on a problem !client.connect(server, port) which cannot connect to Server, what should I do?

    15:23:32.655 -> Network connected
    15:23:32.655 -> Connecting to internet
    15:23:41.581 -> GPRS status: connected
    15:23:42.566 -> CCID:
    15:23:42.566 -> IMEI: 862749052048427
    15:23:42.566 -> Operator: Orange
    15:23:42.602 -> Local IP: 10.3.72.157
    15:23:42.602 -> Signal quality: 21
    15:23:42.602 -> Connecting to asia-southeast1-line-alert-f78e1.cloudfunctions.net
    15:23:42.637 -> … failed

    Reply
  65. Hi,
    thank you for your amazing tutorial. I gave question regarding deep sleep. By default 3600 sec. When I change it to 10800 (3 hours) nothing happening. Device still sleep for 3600 (1 hour) or even start glitch and do two readings per hour. I wan to do 3 or 4 hours deep sleep. How I can do that?
    Thank you,
    Aday

    Reply
  66. Hello.

    Excellent tutorial.

    Could you please clarify something for me?

    The power supply is done through the USB cable or the connector placed on the back of the board ?

    Thank you very much.

    Reply
      • Hello Sara
        But why “…just one at a time…”? Is not through the USB cable that is possible to charge the 3.7V lithium battery?

        Reply
        • I don’t think so.
          But, I recommend searching for the board schematic diagram and checking how the circuit is built just to be sure.
          Regards,
          Sara

          Reply
        • if you plug in the usb type C plus a battery, the board will power up by the usb and at the same time charging the battery. once you remove the usb cable, battery will take over.

          Reply
  67. Hi, I follow your guide and built 3 meteo station which works perfectly since almost 2 years with Bluehost. But suddenly, it stops working… The GET commande to the server failed with an error 301 (301 Moved Permanently
    20:18:34.638 ->
    20:18:34.638 ->

    Moved Permanently

    20:18:34.638 ->

    The document has moved here.

    )
    I guess I need to program the esp32 to communicate directly to the port 443 but i’ml not sure, and till now I didn’t manage to do it yet. Any advices ???

    Reply
  68. hello I was wondering how can I use my ESP32 (TTGO T-Call ESP32 SIM800L) to Publish data in the cloud using micropython and also how can I do to connect my esp32 (TTGO T-Call ESP32 SIM800L)Cloud MQTT Broker

    Reply
  69. Good morning,

    Thank you for the project, I followed the course and the project works very well on my side, on the other hand I added a battery on the esp so that it is independent if there is a power cut, that said I would like to know if it is possible to raise the battery level to follow its loading and unloading?
    Amine

    Reply
  70. hi , the tutorial you provide is useful. but i face an issue which is after the project function well for a month, I get a block by the server and get error 400 . The error last for 3 weeks. Do you face the same issue with me and do u have any solution for this ?

    Reply
  71. Hello thanks for instruction,

    I tried your manual , with TTGO T-Call ESP32 SIM800H ( not SIM800L) but I have still issue with my sim card. I added the sim card tracking code and show me that : SIM card status: 1“
    I want to ask for advice, how to fix this issue ?

    I check my sim card – working correctly, data are available, 2G signal is full, also tried another SIM card the same issue, tried another antena – the same issue, PIN code is disabled, APN je správny.

    Can you give me some advice please?

    Reply
  72. Hello! A few years ago I was using this project for my temperature sensors. I have reprogrammed my ESP32 but it gets stuck when connecting with the APN. I have checked that the SIM card works well and that there is 2G coverage. My country is Spain and 2G coverage continues to work. The error it returns is:

    Initializing modem…
    Connecting to APN: orangeworld fail

    Thanks in advance

    Reply
  73. Wow, just what I needed! I’ve been struggling to find an example of how to publish data to the cloud without Wi-Fi using ESP32 and SIM800L. Your tutorial is PERFECT! I finally got it working and it’s saving me from a lot of headaches. Thank you!

    Reply

Leave a Comment

Download Our Free eBooks and Resources

Get instant access to our FREE eBooks, Resources, and Exclusive Electronics Projects by entering your email address below.