Self-updating ( from WEB server HTTP ) OTA firmware for ESP8266 AND ESP32!

It’s better with 2 files …

Current firmware version: 2020051502
Available firmware version: 2020051503
Preparing to update
HTTP_UPDATE_FAILD Error (-102): File Not Found (404)

2020-05-15_185415

Be careful to have the .bin file in the number of your ESP MAC ADDRESS that is from your writings:
807D3A592CC7.bin

1 Like

Oh , thank you, now it’s ok

Current firmware version: 2020051502
Available firmware version: 2020051503
Preparing to update

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 3456, room 16 
tail 0
chksum 0x84
csum 0x84
va5432625
@cp:0
ld
Booting...
Connecting to Wifi AP...
it is connected after 5 seconds
connected...yesss! :)
connected...yesss! :)
1 Like

@mikekgr @PeteKnight
now I have to understand how to upload file.tft to nextion over HTTP using ESPNexUpload :rofl:

Video_2020-05-15_192606

14 posts were split to a new topic: Need help with HTTP OTA

Hi everybody.
It’s since about a week that I’m trying to work wih OTA update, blynk and my esp32 devkit… as You can imagine… without success…
I tried so many sketches and way around… any kind of OTA I tried really worked well… until I try to implement Blynk in my sketches. So I convinced myself that the only way to let it work was to follow this post and relative sketch, by Mike Kranidis, and by usefull adds from Pete Knight.
The basic sketch just work, but when I try to implement the same code lines in my original sketch (way too complicated)… here we go again, it doesn’t work and I just obtain in my terminal:

WiFi MACADDRESS: 4C:11:AE:8B:C2:9C
Connecting to Wifi AP...
it is connected after 0 seconds
connected...yesss! :)
connected...yesss! :)
Ready
IP address: 192.168.1.40
Trying to connected to Blynk... 
Enter millis is: 342
Blynk is connected !!! ... 
Break millis is: 5751
Exit millis is: 5751
Blynk is connected!!! ... 
21040301
Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC      : 0x4014b04e  PS      : 0x00060c30  A0      : 0x800d2a70  A1      : 0x3ffb1ee0  
A2      : 0x3ffc1d00  A3      : 0x00000019  A4      : 0x3ffc1e50  A5      : 0x00000000  
A6      : 0x00000063  A7      : 0x00000000  A8      : 0x00000000  A9      : 0x3ffb1ec0  
A10     : 0x00000000  A11     : 0x00000000  A12     : 0x0000473d  A13     : 0x00005ec0  
A14     : 0x00060c20  A15     : 0x00000000  SAR     : 0x0000000a  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x00000000  LBEG    : 0x400887c4  LEND    : 0x400887d3  LCOUNT  : 0x00000000  

ELF file SHA256: 0000000000000000

Backtrace: 0x4014b04e:0x3ffb1ee0 0x400d2a6d:0x3ffb1f00 0x400d30fd:0x3ffb1f20 0x400d3fbf:0x3ffb1f60 0x400dade5:0x3ffb1fb0 0x40089d7a:0x3ffb1fd0

Rebooting...
ets Jun  8 2016 00:22:57

I hope someone of You can help me, I swear I have read tons of posts but without luck.
My webserver just worksfine and the mac.version and mac.bin files are in their position.

Thank You so much and please excuse me for my bad englis language,

Paolo

Most likely the cause is an illegal variable operation, such as defining an array with x elements then attempting to write x+1 elements in to it.

Post your full code, exactly as you uploaded it to create the error above, except for WiFi passwords.
Include your current Blynk auth token exactly as you are using it in the sketch, you can change it later once the issue is resolved.
Also, provide information about any connections to your ESP32, other than the USB cable, and what widget types you have set-up in your app and what pins they connect to.

Pete.

Pete You’re so kind, thanks so much.
I’ll post my code (that as said is so long…), just let me know if also need other tabs of the sketch (that just contain functions…).
Please also consider that, until I don’t try to combine Blynk and Ota togheter, the sketch just works fine.
Only connection is by usb cable and wifi. Widgets used are terminal to V14, led to V21 as in mikekgr sketch.

#include <FastLED.h>
#include <WiFi.h>   // rihiesto anche da esp32fota
#include <HTTPClient.h> /// FOR ESP32 HTTP FOTA UPDATE ///
#include <HTTPUpdate.h> /// FOR ESP32 HTTP FOTA UPDATE ///
#include <WiFiClient.h>   // richiesto da Blynk
WiFiClient client;  /// FOR ESP32 HTTP FOTA UPDATE ///
#include <BlynkSimpleEsp32.h>   // libreria Blynk
#include <NTPtimeESP.h> //  La libreria NTPtimeESP.h (e .cpp) è stata da me modificata
#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#define DEBUG_ON
#define uS_TO_S_FACTOR 1000000  // Conversion factor for micro seconds to seconds
#define LED_PIN     4
#define NUM_LEDS    114
#define BRIGHTNESS luce
#define HARDWARE_LED 22 /// GPIO05 /// sparkfun ESP32 thing LED
CRGB leds[NUM_LEDS];
const char* fwUrlBase = "http://xx.xx.xx.xx/fota/"; /// put your server URL where the *.bin & *.version files are saved in your http ( Apache? ) server
const int FW_VERSION = 21040301 ; /// year_month_day_counternumber 2019 is the year, 04 is the month, 17 is the day 01 is the in day release
#define Version "0.5"  /// sketch version ///
NTPtime NTPch("it.pool.ntp.org");   // Choose server pool as required
char auth[] = "Gg0TL_jylOGvsU6B8G3jgte-Nmhq5OUf";  // codice di attivazione dell'app di Blynk
const char ssid[] = "Alice-62790001";
const char password[] = "......................................";
WidgetTerminal terminal(V14);
WidgetLED led0(V21);
BlynkTimer timer; // SimpleTimer timer;
/// switch value to control if the WeMos internal led will be blinking if HIGH or not if LOW ///
boolean ledBlink = true;

/// timestamp variable to keep track of millis() unsigned long ticks = millis() / 1000;  That is for debugging printings ///
unsigned long timestamp;

/// for HTTP based file OTA update ///
bool HTTP_OTA = false; /// we control this boolean variable through V26 switch that is in push button mode 

/// START routine for manual (on demand) requesting HTTP file OTA. Virtual Button SW V26 is used ///
  BLYNK_WRITE(V26)
  {
    if (param.asInt()) {
    HTTP_OTA = true;
    } 
    else {
    HTTP_OTA = false;
    }
  }
/// END routine for manual (on demend) requesting HTTP file OTA. Virtual Button SW V15 is used ///

/// START of SimpleTimer timer activating function blinkLedWidget ///
void blinkLedWidget()
{
  if (led0.getValue()) {
    led0.off();
    ///BLYNK_LOG("LED0: off");
  } else {
    led0.on();
    ///BLYNK_LOG("LED0: on");
  }
/// END of SimpleTimer timer activating function blinkLedWidget ///

/// put the routine here to blink WeMos LED (D4) each ? second(s), using the "control software switch" ledBlink ///
  if (ledBlink) 
  {int test = digitalRead(HARDWARE_LED); /// Could also be : pinMode(BUILTIN_LED, OUTPUT); OR digitalRead(BUILTIN_LED);  /// onboard LED as output
  digitalWrite(HARDWARE_LED, !test); 
  }
}

/// Start of main function that performs HTTP OTA /// 
void checkForUpdates() {
  uint8_t mac[6];
  char macAddr[14];
  WiFi.macAddress( mac );
  ///sprintf(macAddr,"%02x%02x%02x%02x%02x%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); /// small letters at MAC address
  sprintf(macAddr, "%02X%02X%02X%02X%02X%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); /// capital letters at MAC address
  ///terminal.println(macAddr);
  Blynk.virtualWrite(V14, macAddr);
  String fwURL = String( fwUrlBase );
  fwURL.concat( macAddr );
  String fwVersionURL = fwURL;
  fwVersionURL.concat( ".version" );
  Serial.println( "Checking for firmware updates." );
  Serial.print( "MAC address: " );
  Serial.println( macAddr );
  Blynk.virtualWrite(V14, "\nChecking for firmware updates.\nMAC address: ");
  Blynk.virtualWrite(V14, macAddr);
  Serial.print( "Firmware version URL: " );
  Serial.println( fwVersionURL );
  Blynk.virtualWrite(V14, "\nFirmware version URL: ");
  Blynk.virtualWrite(V14, fwVersionURL);
  HTTPClient httpClient;
  httpClient.begin( client, fwVersionURL );
  int httpCode = httpClient.GET();
  if( httpCode == 200 ) {
    String newFWVersion = httpClient.getString();
    Serial.print( "Current firmware version: " );
    Serial.println( FW_VERSION );
    Serial.print( "Available firmware version: " );
    Serial.println( newFWVersion );
    Blynk.virtualWrite(V14, "\nCurrent firmware version: ");
    Blynk.virtualWrite(V14, FW_VERSION);  
    Blynk.virtualWrite(V14, "\nAvailable firmware version: ");
    Blynk.virtualWrite(V14, newFWVersion);
    int newVersion = newFWVersion.toInt();
    if( newVersion > FW_VERSION ) {
      Serial.println( "Preparing to update" );
    Blynk.virtualWrite(V14, "\nPreparing to update"); 
      String fwImageURL = fwURL;
      fwImageURL.concat( ".bin" );
      t_httpUpdate_return ret = httpUpdate.update( client, fwImageURL ); /// FOR ESP32 HTTP FOTA
      switch(ret) {
        case HTTP_UPDATE_FAILED:
          Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s", httpUpdate.getLastError(), httpUpdate.getLastErrorString().c_str()); /// FOR ESP32
          char currentString[64];
          sprintf(currentString, "\nHTTP_UPDATE_FAILD Error (%d): %s\n", httpUpdate.getLastError(), httpUpdate.getLastErrorString().c_str()); /// FOR ESP32
          Blynk.virtualWrite(V14, currentString);
          break;

        case HTTP_UPDATE_NO_UPDATES:
          Serial.println("HTTP_UPDATE_NO_UPDATES");
          Blynk.virtualWrite(V14, "\nHTTP_UPDATE_NO_UPDATES\n");
          break;
      }
    }
    else {
      Serial.println( "Already on latest version" );
      Blynk.virtualWrite(V14, "\nAlready on latest version\n");
    }
  }
  else {
    Serial.print( "Firmware version check failed, got HTTP response code " );
    Serial.println( httpCode );
    char currentString[64];
    sprintf(currentString, "\nFirmware version check failed, got HTTP response code : %d\n",httpCode);
    Blynk.virtualWrite(V14, currentString);
  }
  httpClient.end();
}
/// End of main function that performs HTTP OTA /// 
uint8_t hue = 0;
bool first = 0;
bool count = 0;
bool count_min = 0;
bool luce_auto;
bool sonor = 1;
bool c_min = 1;
bool c_5min = 1;
bool c_ore = 1;
bool ntptime;
byte last_5min = 65;
byte last_min = 62;
byte secondi;
byte minuti;
byte ore;
byte orel;
byte last_sec;
byte randsec;
byte last_randsec;
byte cont_cont = 0;
byte popula[113];
byte min5[] = {5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55};
byte mini[] = {101, 113, 0, 12};

unsigned long count_sec = millis();
int count_5min;
int i;
int x;
int count_fori = 0;
int val_luce = 0;
int luce = 0;
const int fotoPin = 39;
int pinbutton1 = 16;
int pinbutton2 = 18;
int pinbutton3 = 19;
int pinbutton4 = 21;
int counter1 = 0;
int counter2 = 0;
int counter3 = 0;
unsigned long counter4 = 0;
strDateTime dateTime;

byte matrix[][13] = {
  {0,  11, 102, 103, 104, 105, 107, 108, 110, 111, 112, 112, 112},
  {1,  5,  100, 98,  97,  96,  95,  95,  95,  95,  95,  95,  95 },
  {2,  3,  93,  92,  91,  91,  91,  91,  91,  91,  91,  91,  91 },
  {3,  3,  79,  80,  81,  81,  81,  81,  81,  81,  81,  81,  81 },
  {4,  7,  56,  55,  54,  53,  52,  51,  50,  50,  50,  50,  50 },
  {5,  6,  35,  36,  37,  38,  39,  40,  40,  40,  40,  40,  40 },
  {6,  3,  48,  47,  46,  46,  46,  46,  46,  46,  46,  46,  46 },
  {7,  5,  63,  64,  65,  66,  67,  67,  67,  67,  67,  67,  67 },
  {8,  4,  82,  83,  84,  85,  85,  85,  85,  85,  85,  85,  85 },
  {9,  4,  86,  87,  88,  89,  89,  89,  89,  89,  89,  89,  89 },
  {10, 5,  78,  77,  76,  75,  74,  74,  74,  74,  74,  74,  74 },
  {11, 6,  73,  72,  71,  70,  69,  68,  68,  68,  68,  68,  68 },
  {12, 6,  57,  58,  59,  60,  61,  62,  62,  62,  62,  62,  62 },
  {13, 4,  42,  43,  44,  45,  45,  45,  45,  45,  45,  45,  45 },
  {14, 8,  32,  31,  29,  28,  27,  26,  25,  24,  24,  24,  24 },
  {15, 5,  13,  14,  15,  16,  17,  17,  17,  17,  17,  17,  17 },
  {16, 11, 13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23 },
  {17, 5,  5,   4,   3,   2,   1,   1,   1,   1,   1,   1,   1  },
  {18, 6,  18,  19,  20,  21,  22,  23,  23,  23,  23,  23,  23 },
  {19, 5,  11,  10,  9,   8,   7,   7,   7,   7,   7,   7,   7  }
};
byte e5e10[][12] = {
  {76, 6, 91, 6,  34, 91, 40, 34, 40, 6, 9, 40},
  {76, 6, 89, 6,  34, 89, 40, 34, 40, 6, 9, 40},
  {64, 6, 89, 64, 34, 89, 40, 34, 40, 6, 9, 40},
  {14, 6, 43, 14, 34, 43, 40, 34, 40, 6, 9, 40},
  {14, 6, 23, 14, 34, 23, 43, 34, 43, 6, 9, 43},
  {14, 6, 23, 14, 34, 23, 40, 34, 40, 6, 9, 40},
  {14, 6, 40, 14, 34, 40, 40, 34, 40, 6, 9, 40},
  {64, 6, 89, 64, 34, 89, 40, 34, 40, 6, 9, 40},
  {76, 6, 40, 76, 34, 40, 40, 34, 40, 6, 9, 40},
  {64, 6, 40, 64, 34, 40, 40, 34, 40, 6, 9, 40},
  {47, 6, 40, 47, 34, 40, 40, 34, 40, 6, 9, 40},
  {47, 6, 40, 47, 34, 40, 40, 34, 40, 6, 9, 40},
};
// esp32FOTA esp32FOTA("esp32-fota-http", 1); // rihiesto da esp32fota

void setup() {
    Serial.begin(115200);
  Serial.println("Booting...");
  
  /// on board LED ///
  pinMode(HARDWARE_LED, OUTPUT);
  
  WiFi.mode(WIFI_STA);
  Serial.print("WiFi MACADDRESS: ");
  Serial.println(WiFi.macAddress()); /// PRINT MAC ADDRESS TO SERIAL ... use this in order to see the MAC Address that is used for the http FOTA update 

  WiFi.begin(ssid, password);
  if (WiFi.status() != WL_CONNECTED) {
  Serial.println("Connecting to Wifi AP...");
  for ( int i = 0; i < 300; i++) {                  ///       try to connect to WiFi for max 30s
      if (WiFi.status() == WL_CONNECTED) {
        Serial.printf("it is connected after %d seconds",(i/10));
        break; }
      yield();
      delay(100);
    }
  }
  if(WiFi.status() == WL_CONNECTED) { 
    //if you get here you have connected to the WiFi
    Serial.println("\nconnected...yesss! :)");
  } else {
    Serial.println("TimeOut! Not Connected even after 10 Seconds trying...\n *** Something wrong happened. It did not connected... *** ");
  }  

/// Blynk.begin(auth, ssid, password);
  //if you get here you have connected to the WiFi
  Serial.println("connected...yesss! :)");
  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  unsigned long maxMillis=millis() + 50000;
  Blynk.config(auth);
    Serial.println(" Trying to connected to Blynk... ");
    Serial.printf(" Enter millis is: %d\n",millis());
    do {
        // Wait until connected or 10 seconds passed without connection ( maxMillis )
      if(Blynk.connect() == true) {
        Serial.println(" Blynk is connected !!! ... ");
        Serial.printf(" Break millis is: %d\n",millis());
        break;
        }
    yield();
    delay(200);
    } while ((Blynk.connect() == false) && ( millis() < maxMillis));
    Serial.printf(" Exit millis is: %d\n",millis());
    if(Blynk.connect() == false) Serial.println(" Not Connected to Blynk. Something wrong happens... ");
    if(Blynk.connect() == true) Serial.println(" Blynk is connected!!! ... ");
  
  pinMode(HARDWARE_LED, OUTPUT);  // initialize onboard LED as output  
  digitalWrite(HARDWARE_LED, HIGH); // dim the LED 
  Serial.println(FW_VERSION);
  Blynk.virtualWrite(V14, FW_VERSION);
 
/// start of SimpleTimer timer Functions 
  /// This blink LED function be called every 2 seconds
  timer.setInterval(2000L, blinkLedWidget);
  /// end of SimpleTimer timer Functions 

  pinMode(pinbutton1, INPUT_PULLUP);
  pinMode(pinbutton2, INPUT_PULLUP);
  pinMode(pinbutton3, INPUT_PULLUP);
  pinMode(pinbutton4, INPUT_PULLUP);

  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
  for (i = 0; i <= NUM_LEDS; i++) {
    leds[i] = CRGB::Black;
    FastLED.show();
  }
  for (i = 0; i <= NUM_LEDS; i++) {
    leds[i] = CRGB::Blue;
    FastLED.show();
  }
  delay (30);
  for (i = 0; i <= NUM_LEDS; i++) {
    leds[i] = CRGB::Black;
    FastLED.show();
  }
  for (i = 0; i <= 112; i++) {
    popula[i] = i;
  }

  /*  ore = 8;                    // setter: mettere commento da qui per ora automatica
    minuti = 40;
    last_min = 65;
    secondi = 0;
    c_min = 1;
    c_5min = 1;
    c_ore = 1;
    Serial.println ("");
    Serial.print (ore);
    Serial.print (":");
    Serial.print (minuti);
    Serial.print (":");
    Serial.println (secondi);
    delay (1000);             // interrompere commento qui per ora automatica */
}
  BLYNK_WRITE(V1)
  { char currentMillis[64];
    if (param.asInt()) {
      sprintf(currentMillis, "\n\n Enter millis()= %d",millis());
      Blynk.virtualWrite(V14, currentMillis);
      ledBlink = true;
      digitalWrite(HARDWARE_LED, HIGH); /// switch off the internal LED
    } 
    else {
      sprintf(currentMillis, "\n\n Exit  millis()= %d",millis());
      Blynk.virtualWrite(V14, currentMillis);
      ledBlink = false;
      digitalWrite(HARDWARE_LED, HIGH); /// switch on the internal LED
      }
  }
/// end of routine for V1 controlling ledBlink boolean global variable ///

/// start routine for manual (on demand) requesting OTA The Virtual Button SW V20 is used ///
  BLYNK_WRITE(V20)
  {
    if (param.asInt()) {
   // ArduinoOTA.handle(); /// ESP8266 OTA
    }
  }
/// end of routine for manual (on demand) requesting OTA The Virtual Button SW V20 is used ///

// This function will run every time Blynk connection is established
BLYNK_CONNECTED() {
  ///   if (isFirstConnect) {
    //     Request Blynk server to re-send latest values for all pins
    /// }
    Blynk.syncAll();
}
void loop() {
if(HTTP_OTA) {
    /// shall I stop timers and Blynk related in order to ensure succesful WEB OTA ??? ///
    checkForUpdates();
    } /// We need this in order to do WEB file OTA update ///
 
  Blynk.run();
  timer.run();
  dateTime = NTPch.getNTPtime(1.0, 1);  // mettere commento da qui per ora impostata
  // Use "setSendInterval" or "setRecvTimeout" if required
  if (dateTime.valid) {
    NTPch.printDateTime(dateTime);
    Serial.println(" dateTime valid nel loop");
    NTPch.setSendInterval(86400);
    if (dateTime.ore >= 13)
      dateTime.ore = dateTime.ore - 12;
    ore = dateTime.ore;
    minuti = dateTime.minute;
    secondi = dateTime.sec;
    last_min = 65;
    c_min = 1;
    c_5min = 1;
    c_ore = 1;
    first = 1;
    delay (3000);
  } // interrompere commento qui per ora impostata */

  FastLED.setBrightness(luce);
  buttons();                     // controlla l'attivazione dei pulsanti

  if (first == 1) {
    if (millis() - count_sec >= 1000) {         // speed
      secondi = secondi + 1;
      Serial.print ("sec.:");
      Serial.println (secondi);
      count_sec = millis();
    }
    if (secondi >= 60) {
      minuti = minuti + 1;
      count_min = count_min + 1;
      c_min = 1;
      Serial.print (" incremento minuti: ");
      Serial.println (minuti);
      secondi = 0;
    }
    if (minuti % 5 == 0 && minuti != last_5min ) {
      c_5min = 1;
      last_5min = minuti;
      Serial.print (" incremento 5 minuti: ");
      Serial.println (last_5min);
      if (minuti == 35)
        c_ore = 1;
    }
    if (minuti >= 60) {
      ore = ore + 1;
      minuti = 0;
      Serial.print ("incremento ore: ");
      Serial.println (ore);
    }
    if (ore == 13) {
      ore = 1;
    }
    //*******************************************************************************
    //***** REGOLA DELL'ORA  ********************************************************
    //*******************************************************************************
    if (c_ore == 1) {
      regole_ore();
      c_ore = 0;
    }
    //***************************************************
    //***********REGOLE DEI 5 MINUTI*********************
    //***************************************************
    if (c_5min == 1) {
      regole_5min();
      c_5min = 0;
    }
    //*************************************************************************************
    //********************************    CONTROLLO 1 MINUTO    ***************************
    //*************************************************************************************
    if (minuti != last_min && c_min == 1) {
      regola_1min();
      c_min = 0;
   }
    //*************************************************************************************
    //*********************    CONTROLLO SECONDI RANDOM    ********************************
    //*************************************************************************************
    if (secondi != last_sec) {
      regola_sec_random();
    }
  }
  }

Thanks for your precious help,

Paolo

I can’t compile and run the code if it’s not complete, but there’s no point in even trying with the code as it is. You should read this and re-structure your code accordingly…

Also, you should use the Blynk RTC function to obtain the time rather than making constant NTP calls (which is totally unnecessary anyway, time only needs to be synchronised at start-up and every few days after that).

When it comes to debugging, you need to simplify things down to the bare minimum, then add code back in stages until you identify the issue.

Pete.

2 Likes

Thanks so much for the time you spent for me, Pete. I had read the warning about the loop stage… but I had the idea of implement Blynk when the sketch was ready…
Now I understand that the solution is just to start again from zero.
The NTP sync the time each 48 hours, I imposed this in the NTP library but sure, it’s better to call the sync from setup at interval or from a push pin just when needed.
Debugging in the arduino ide it’s so long… having to work with serial print and monitoring everything but I understand what you said is the only way trying to solve.
That’s what happen when a 1971 structural engineer discover the passion for electronic !!!

Thanks so much Pete, the error was just there… exactly an array of 113 where I were trying to write 114 elements. Now everything just works great (even if my Easter was on PC…)
BTW I’ll try to simplify my code and have a “free” loop.
Thanks again for Your precious help and all the best,

Paolo

1 Like

Hi Pgran
Could you explain what you changed to make it work with GSM? Thank you very much!

Are you wanting to do this on an ESP8266 or ESP32?

Pete.

HI Pete. Thank you very much for your fast answer. I am working with esp32 (exactly with LilyGo-T-Call-SIM800).

I’m working on a project using the same hardware. It’s tricky, because the HTTP client library doesn’t work with TinyGSM when compiled with the latest version of the ESP32 core, and I don’t want to downgrade the ESP32 core for just this project.
I have a working system, but it’s messy at the moment and needs quite a bit more time spending on it. I have another project on the go at the moment too, so I’m not sure when I’ll get the project finished.

Pete.

Thank you very much for your time and your explanation.