BLYNK
HOME       📲 GETTING STARTED       📗 DOCS       ❓HELP CENTER       👉 SKETCH BUILDER

[BlynkGsmManager] - Cannot send sensor value to blynk while connected to GPRS

I use the SHT30 sensor to measure the temperature and humidity but having trouble connecting to the GPRS, the ESP does not send value to Blynk. Wifi is stable.

/****************************************************************************************************************************
     TTGO-TCALL.ino
     For ESP32 TTGO-TCALL boards to run GSM/GPRS and WiFi simultaneously, using config portal feature

     Library to enable GSM/GPRS and WiFi running simultaneously , with WiFi config portal.
     Forked from Blynk library v0.6.1 https://github.com/blynkkk/blynk-library/releases
     Built by Khoi Hoang https://github.com/khoih-prog/BlynkGSM_ESPManager
     Licensed under MIT license
     Version: 1.0.9

     Version Modified By   Date      Comments
     ------- -----------  ---------- -----------
  1.0.0   K Hoang      17/01/2020 Initial coding. Add config portal similar to Blynk_WM library.
  1.0.1   K Hoang      27/01/2020 Change Synch XMLHttpRequest to Async (https://xhr.spec.whatwg.org/). Reduce code size
  1.0.2   K Hoang      08/02/2020 Enable GSM/GPRS and WiFi running simultaneously
  1.0.3   K Hoang      18/02/2020 Add checksum. Add clearConfigData()
  1.0.4   K Hoang      14/03/2020 Enhance Config Portal GUI. Reduce code size.
  1.0.5   K Hoang      20/03/2020 Add more modem supports. See the list in README.md
  1.0.6   K Hoang      07/04/2020 Enable adding dynamic custom parameters from sketch
  1.0.7   K Hoang      09/04/2020 SSID password maxlen is 63 now. Permit special chars # and % in input data.
  1.0.8   K Hoang      14/04/2020 Fix bug.
  1.0.9   K Hoang      31/05/2020 Update to use LittleFS for ESP8266 core 2.7.1+. Add Configurable Config Portal Title,
                                  Default Config Data and DRD. Add MultiWiFi/Blynk features for WiFi and GPRS/GSM
   *****************************************************************************************************************************/

  #include "defines.h"
  #include "Credentials.h"
  #include "dynamicParams.h"
  #include <SHT3x.h>
  SHT3x Sensor;
  void heartBeatPrint(void)
  {
    static int num = 1;

    if (Blynk_WF.connected())
    {
  Serial.print(F("B"));
    }
    else
    {
  Serial.print(F("F"));
    }

    if (Blynk_GSM.connected())
    {
  Serial.print(F("G"));
    }
    else
    {
  Serial.print(F("F"));
    }

    if (num == 40)
    {
  Serial.println();
  num = 1;
    }
    else if (num++ % 10 == 0)
    {
  Serial.print(F(" "));
    }
  }

  void check_status()
  {
    static unsigned long checkstatus_timeout = 0;

  #define STATUS_CHECK_INTERVAL     60000L

    // Send status report every STATUS_REPORT_INTERVAL (60) seconds: we don't need to send updates frequently if there is no status change.
    if ((millis() > checkstatus_timeout) || (checkstatus_timeout == 0))
    {
  // report status to Blynk
  heartBeatPrint();

  checkstatus_timeout = millis() + STATUS_CHECK_INTERVAL;
    }
  }

  bool valid_apn = false;
  bool GSM_CONNECT_OK = false;

  void setup()
  {
    // Set console baud rate
    SerialMon.begin(115200);
     Sensor.Begin();
    while (!SerialMon);
    
    SerialMon.print(F("\nStart TTGO-TCALL-GSM using "));
    SerialMon.println(CurrentFileFS);

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

    SerialMon.println(F("Set GSM module baud rate"));

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

    Serial.println(F("Use WiFi to connect Blynk"));

  #if USE_BLYNK_WM
    // Use configurable AP IP, instead of default IP 192.168.4.1
    Blynk_WF.setConfigPortalIP(IPAddress(192, 168, 100, 1));
    // Use channel = 0 => random Config Portal WiFi channel to avoid conflict
    Blynk_WF.setConfigPortalChannel(0);
    // Set personalized Hostname
    Blynk_WF.begin("TTGO-TCALL-GSM");
  #else
    Blynk_WF.begin(wifi_blynk_tok, ssid, pass, blynk_server, BLYNK_HARDWARE_PORT);

    Blynk_GSM.config(modem, gsm_blynk_tok, blynk_server, BLYNK_HARDWARE_PORT);
    GSM_CONNECT_OK = Blynk_GSM.connectNetwork(apn, gprsUser, gprsPass);

    if (GSM_CONNECT_OK)
  Blynk_GSM.connect();
  #endif

  #if USE_BLYNK_WM
    Blynk_WF_Configuration localBlynkGSM_ESP32_config;

    Blynk_WF.getFullConfigData(&localBlynkGSM_ESP32_config);

    Serial.print(F("gprs apn = "));
    Serial.println(localBlynkGSM_ESP32_config.apn);

    if (String(localBlynkGSM_ESP32_config.apn) == NO_CONFIG)
    {
  Serial.println(F("No valid stored apn. Must run WiFi to Open config portal"));
  valid_apn = false;
    }
    else
    {
  valid_apn = true;

  for (int index = 0; index < NUM_BLYNK_CREDENTIALS; index++)
  {
    Blynk_GSM.config(modem, localBlynkGSM_ESP32_config.Blynk_Creds[index].gsm_blynk_token,
                     localBlynkGSM_ESP32_config.Blynk_Creds[index].blynk_server, localBlynkGSM_ESP32_config.blynk_port);

    GSM_CONNECT_OK = Blynk_GSM.connectNetwork(localBlynkGSM_ESP32_config.apn, localBlynkGSM_ESP32_config.gprsUser,
                     localBlynkGSM_ESP32_config.gprsPass);

    if (GSM_CONNECT_OK)
    {
      if ( Blynk_GSM.connect() == true )
        break;
    }
  }
    }
  #endif
  }

  #if (USE_BLYNK_WM && USE_DYNAMIC_PARAMETERS)
  void displayCredentials(void)
  {
    Serial.println("\nYour stored Credentials :");

    for (int i = 0; i < NUM_MENU_ITEMS; i++)
    {
  Serial.println(String(myMenuItems[i].displayName) + " = " + myMenuItems[i].pdata);
    }
  }
  #endif

  void cambien()
  {
    Sensor.UpdateData();
    Blynk.virtualWrite(V1, Sensor.GetTemperature());
    Blynk.virtualWrite(V2, Sensor.GetRelHumidity());
    Blynk.syncVirtual(V1, V2);
    delay(333); 
  }



  void loop()
  {
    cambien();
    Blynk_WF.run();

  #if USE_BLYNK_WM
    if (valid_apn)
  Blynk_GSM.run();
  #else
    Blynk_GSM.run();
  #endif

    check_status();

  #if (USE_BLYNK_WM && USE_DYNAMIC_PARAMETERS)
    static bool displayedCredentials = false;

    if (!displayedCredentials)
    {
  for (int i = 0; i < NUM_MENU_ITEMS; i++)
  {
    if (!strlen(myMenuItems[i].pdata))
    {
      break;
    }

    if ( i == (NUM_MENU_ITEMS - 1) )
    {
      displayedCredentials = true;
      displayCredentials();
    }
  }
    }
  #endif
  }

The problem is is your loop().

Please do some more research how to keep your loop() clean

Test with the simple code (using Blynk GSM example) to make sure it’s working, before merging into more complicated BlynkGSM_Manager example

You can modify the code as follows and test to see if it’s OK

#include "defines.h"
#include "Credentials.h"
#include "dynamicParams.h"

#include <SHT3x.h>        //https://github.com/Risele/SHT3x
SHT3x Sensor;

void SensorUpdate()
{
  static float temperature;
  static float rHumidity;

  Sensor.UpdateData();

  temperature = Sensor.GetTemperature();
  rHumidity   = Sensor.GetRelHumidity();

  if (!isnan(temperature) && !isnan(rHumidity))
  {
    Blynk.virtualWrite(V1, String(temperature, 1));
    Blynk.virtualWrite(V2, String(rHumidity, 1));

    Serial.println("Temperature   = " + String(temperature, 1));
    Serial.println("Rel. Humidity = " + String(rHumidity, 1));
  }
  else
  {
    Blynk.virtualWrite(V1, "NAN");
    Blynk.virtualWrite(V2, "NAN");
  }
}

void heartBeatPrint(void)
{
  static int num = 1;

  if (Blynk_WF.connected())
  {
    Serial.print(F("B"));
  }
  else
  {
    Serial.print(F("F"));
  }

  if (Blynk_GSM.connected())
  {
    Serial.print(F("G"));
  }
  else
  {
    Serial.print(F("F"));
  }

  if (num == 40)
  {
    Serial.println();
    num = 1;
  }
  else if (num++ % 10 == 0)
  {
    Serial.print(F(" "));
  }
}

void check_status()
{
  static unsigned long checkstatus_timeout = 0;
  static unsigned long checksensor_timeout = 0;

#define SENSOR_CHECK_INTERVAL     10000L
#define STATUS_CHECK_INTERVAL     60000L
  // Read and send Sensor data every SENSOR_CHECK_INTERVAL (10) seconds
  if ((millis() > checksensor_timeout) || (checksensor_timeout == 0))
  {
    // Read and send Sensor to Blynk
    SensorUpdate();

    checksensor_timeout = millis() + SENSOR_CHECK_INTERVAL;

    // Send status report every STATUS_REPORT_INTERVAL (60) seconds: we don't need to send updates frequently if there is no status change.
    if ((millis() > checkstatus_timeout) || (checkstatus_timeout == 0))
    {
      // report status to Blynk
      heartBeatPrint();
  
      checkstatus_timeout = millis() + STATUS_CHECK_INTERVAL;
    }
  }
}

bool valid_apn = false;
bool GSM_CONNECT_OK = false;

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

  SerialMon.print(F("\nStart TTGO-TCALL-GSM using "));
  SerialMon.println(CurrentFileFS);

  Sensor.Begin();
  
  // Set-up 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);

  SerialMon.println(F("Set GSM module baud rate"));

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

  Serial.println(F("Use WiFi to connect Blynk"));

#if USE_BLYNK_WM
  // Use configurable AP IP, instead of default IP 192.168.4.1
  Blynk_WF.setConfigPortalIP(IPAddress(192, 168, 100, 1));
  // Use channel = 0 => random Config Portal WiFi channel to avoid conflict
  Blynk_WF.setConfigPortalChannel(0);
  // Set personalized Hostname
  Blynk_WF.begin("TTGO-TCALL-GSM");
#else
  Blynk_WF.begin(wifi_blynk_tok, ssid, pass, blynk_server, BLYNK_HARDWARE_PORT);

  Blynk_GSM.config(modem, gsm_blynk_tok, blynk_server, BLYNK_HARDWARE_PORT);
  GSM_CONNECT_OK = Blynk_GSM.connectNetwork(apn, gprsUser, gprsPass);

  if (GSM_CONNECT_OK)
    Blynk_GSM.connect();
#endif

#if USE_BLYNK_WM
  Blynk_WF_Configuration localBlynkGSM_ESP32_config;

  Blynk_WF.getFullConfigData(&localBlynkGSM_ESP32_config);

  Serial.print(F("gprs apn = "));
  Serial.println(localBlynkGSM_ESP32_config.apn);

  if (String(localBlynkGSM_ESP32_config.apn) == NO_CONFIG)
  {
    Serial.println(F("No valid stored apn. Must run WiFi to Open config portal"));
    valid_apn = false;
  }
  else
  {
    valid_apn = true;

    for (int index = 0; index < NUM_BLYNK_CREDENTIALS; index++)
    {
      Blynk_GSM.config(modem, localBlynkGSM_ESP32_config.Blynk_Creds[index].gsm_blynk_token,
                       localBlynkGSM_ESP32_config.Blynk_Creds[index].blynk_server, localBlynkGSM_ESP32_config.blynk_port);

      GSM_CONNECT_OK = Blynk_GSM.connectNetwork(localBlynkGSM_ESP32_config.apn, localBlynkGSM_ESP32_config.gprsUser,
                       localBlynkGSM_ESP32_config.gprsPass);

      if (GSM_CONNECT_OK)
      {
        if ( Blynk_GSM.connect() == true )
          break;
      }
    }
  }
#endif
}

#if (USE_BLYNK_WM && USE_DYNAMIC_PARAMETERS)
void displayCredentials(void)
{
  Serial.println("\nYour stored Credentials :");

  for (int i = 0; i < NUM_MENU_ITEMS; i++)
  {
    Serial.println(String(myMenuItems[i].displayName) + " = " + myMenuItems[i].pdata);
  }
}
#endif

void loop()
{
  Blynk_WF.run();

#if USE_BLYNK_WM
  if (valid_apn)
    Blynk_GSM.run();
#else
  Blynk_GSM.run();
#endif

  check_status();

#if (USE_BLYNK_WM && USE_DYNAMIC_PARAMETERS)
  static bool displayedCredentials = false;

  if (!displayedCredentials)
  {
    for (int i = 0; i < NUM_MENU_ITEMS; i++)
    {
      if (!strlen(myMenuItems[i].pdata))
      {
        break;
      }

      if ( i == (NUM_MENU_ITEMS - 1) )
      {
        displayedCredentials = true;
        displayCredentials();
      }
    }
  }
#endif
}

Thank you for your help, it still doesn’t send value to blynk

It seems you don’t have WiFi connected, only GSM. But it’s still OK as you already have your SHT3x sensor connected correctly.

Change the SensorUpdate() function to

void SensorUpdate()
{
  static float temperature;
  static float rHumidity;

  Sensor.UpdateData();

  temperature = Sensor.GetTemperature();
  rHumidity   = Sensor.GetRelHumidity();

  if (!isnan(temperature) && !isnan(rHumidity))
  {
    if (Blynk_GSM.connected())
    {
      Blynk_GSM.virtualWrite(V1, String(temperature, 1));
      Blynk_GSM.virtualWrite(V2, String(rHumidity, 1));
    }
    
    if (Blynk_WF.connected())
    {
      Blynk_WF.virtualWrite(V1, String(temperature, 1));
      Blynk_WF.virtualWrite(V2, String(rHumidity, 1));
    }
    
    Serial.println("Temperature   = " + String(temperature, 1));
    Serial.println("Rel. Humidity = " + String(rHumidity, 1));
  }
  else
  {
    if (Blynk_GSM.connected())
    {
      Blynk_GSM.virtualWrite(V1, "NAN");
      Blynk_GSM.virtualWrite(V2, "NAN");
    }

    if (Blynk_WF.connected())
    {
      Blynk_WF.virtualWrite(V1, "NAN");
      Blynk_WF.virtualWrite(V2, "NAN");
    }
  }
}

Thanking you. Try me again tonight. :smile_face_with_three_ Feelts:

I am having problems with my pzem module. It seems that T-CALL has used up the Serial on the hardware of T-CALL. How can i connect my PZEM to T-CALL.