ESP 32 RESETTING ON ArduinoCloud.update();

Hi y'all!!
I've been working for about 5hrs on a ESP32 project involving a BH1750 lightmeter, a barometric pressure sensor BMP280 and an OLED display. Everything works fine... but when I've integrated the code for the Arduino IoT Cloud the board (ESP32 Dev Board) suddenly resets when the ArduinoCloud.update(); function is called.
I've triple checked password, SSID etc. I just don't know why It keep resetting
Here's the full code of my project:

#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include <BMx280I2C.h>
#include <BH1750.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SD.h>
#include <FS.h>
#include "thingProperties.h"


#define SCREEN_WIDTH  128
#define SCREEN_HEIGHT  64
#define OLED_RESET      4
#define SD_CS           5

//float Temp, lum;
//int Pr;
//bool BMP_INIT = 0, BH_INIT = 0;

void SetWiFi();
void SetBMP(bool bmp_init);
void SetBH(bool bh1750_init);
void displayInit();
void displayOled(float t, float lu, int pr, bool bm_init, bool bh_init);
void SDinit();
void toSD(float t, float lu, int pr);
void appendFile(fs::FS &fs, const char * path, const char * message);

BMx280I2C bmp(0x76);
BH1750 lightMeter;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
File logFile;

void setup() {
  Serial.begin(921600);
  Wire.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();
  delay(5000);
  display.clearDisplay();
  display.display();

  Serial.println("-------------------------------------------------------------");
  Serial.println("BENVENUTO NEL SISTEMA METEO CLOUD BASED DI MONTORIO AL VOMANO");
  Serial.println("Inizio configurazione sistemi:");

  displayInit();
  delay(5000);

  SetWiFi();
  delay(2000);
  SetBMP(BMP_INIT); //0x76
  ArduinoCloud.update();
  delay(2000);
  SetBH(BH_INIT);//0x23
  ArduinoCloud.update();
                  //128x64 60y48b
  delay(3000);
  SDinit();
  delay(3000);

  Serial.println("-------------------------------------------------------------");
}

void loop() {
  bmp.measure();
  do{
    delay(100);
  } while (!bmp.hasValue());
   
  Pr   = bmp.getPressure();
  Temp = bmp.getTemperature();
  lum = lightMeter.readLightLevel();

  Serial.print("Temperatura: ");
  Serial.print(Temp);
  Serial.println(" C");

  Serial.print("Pressione Atmosferica: ");
  Serial.print(Pr);
  Serial.println(" Pa");

  Serial.print("Luminosita': ");
  Serial.print(lum);
  Serial.println(" lux");

  toSD(Temp, lum, Pr);

  Serial.println("-------------------------------------------------------------");

  displayOled(Temp, lum, Pr, BMP_INIT, BH_INIT);
  ArduinoCloud.update();
  delay(5000); 
}

//----------------------------------------------------------------------------

void SetWiFi()
{
  initProperties();
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
  Serial.print("\t-WiFi: ");
  Serial.println("Settato correttamente;");
}

void SetBMP(bool bmp_init)
{
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);

  display.setCursor(0,0);
  display.print("STAZIONE METEO");

  display.setCursor(0,9);
  display.print("MONTORIO AL VOMANO");

  display.setCursor(0,18);
  display.print("INIZIO CONFIGURAZIONE");

  display.setCursor(0,27);
  display.print("-BMP280:");

  Serial.print("\t-BMP280: ");
  if (!bmp.begin()) {
  display.setCursor (48, 27);
  display.print("Err");
  display.display();
  Serial.println(F("Connessione fallita"));
  display.display();
  Serial.println(F("Connessione fallita"));
  while (1);
  }
  Serial.println("Connesso con successo");
  display.setCursor (48, 27);
  display.print("Conn avvenuta");
  display.display();

  bmp.resetToDefaults();
  bmp.writeOversamplingPressure(BMx280I2C::OSRS_P_x16);
  bmp.writeOversamplingTemperature(BMx280I2C::OSRS_T_x16);
  bmp.writeOversamplingHumidity(BMx280I2C::OSRS_H_x16);
  bmp_init = 1;
  delay(1000); 
}

void SetBH(bool bh1750_init)
{
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);

  display.setCursor(0,0);
  display.print("STAZIONE METEO");

  display.setCursor(0,9);
  display.print("MONTORIO AL VOMANO");

  display.setCursor(0,18);
  display.print("INIZIO CONFIGURAZIONE");

  display.setCursor(0,27);
  display.print("-BMP280:Conn avvenuta");

  display.setCursor(0,36);
  display.print("-BH1750:");

  Serial.print("\t-BH1750:");
  if(!lightMeter.begin())
  {
    display.setCursor (48, 36);
    display.print("Err");
    display.display();
    Serial.println(F("Connessione fallita"));
    display.display();
    while (1);
  } else
  {
    Serial.println(F("Connesso con successo"));
    display.setCursor (48, 36);
    display.print("Conn avvenuta");
    display.display();
    bh1750_init = 1;
  }
}

void displayInit()
{
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);

  display.setCursor(0,0);
  display.print("STAZIONE METEO");

  display.setCursor(0,9);
  display.print("MONTORIO AL VOMANO");

  display.setTextSize(0.5);
  display.setCursor(0,18);
  display.print("INIZIO CONFIGURAZIONE ");
  display.display();
}

void displayOled(float t, float lu, int pr, bool bm_init, bool bh_init)
{
  String Temperatura = "Temperatura: " + String(t) + " C";
  String Pressione   = "Pressione: " + String(pr) + " Pa";
  String Luminosita  = "Luce: " + String(lu) + " Lux"; 
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);

  display.setCursor(0,0);
  display.print("STAZIONE METEO");

  display.setCursor(0,9);
  display.print("MONTORIO AL VOMANO");

  display.setCursor(0,27);
  display.print(Temperatura);

  display.setCursor(0,36);
  display.print(Pressione);

  display.setCursor(0,45);
  display.print(Luminosita);

  display.display();

}

void toSD(float t, float lu, int pr)
{
  String msg = String(t) + "," + String(lu) + "," + String(pr) + "\r\n";  
  appendFile(SD, "/METEO.txt", msg.c_str());
}

void SDinit()
{
  Serial.print("\t-SDcard: ");

  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);

  display.setCursor(0,0);
  display.print("STAZIONE METEO");

  display.setCursor(0,9);
  display.print("MONTORIO AL VOMANO");

  display.setCursor(0,18);
  display.print("INIZIO CONFIGURAZIONE");

  display.setCursor(0,27);
  display.print("-BMP280:Conn avvenuta");

  display.setCursor(0,36);
  display.print("-BH1750:Conn avvenuta");

  display.setCursor(0,45);
  display.print("-MicroSD:");
  display.display();
  delay(1000);

  if(!SD.begin(SD_CS))
  {
    Serial.println("Connessione fallita");
    display.setCursor(48,45);
    display.print("-Conn fallita");
    display.display();
  } else{
    Serial.println("Connesso con successo");
    display.setCursor(48,45);
    display.print("Conn avvenuta");
    display.display();
  }

  if(SD.exists("/METEO.txt"))
  {
    SD.remove("/METEO.txt");
    Serial.println("File duplicato trovato ed eliminato");
    display.setCursor(10,54);
    display.print("File dupl eliminato");
    display.display();

  }
}

void writeFile(fs::FS &fs, const char * path, const char * message) {
  Serial.printf("Scrittura file: %s\n", "/METEO.txt");
  File file = fs.open("METEO.txt", FILE_WRITE);
  if(!file) {
    Serial.println("Fallimento nell'aprire il file");
    return;
  }
  if(file.print(message)) {
    Serial.println("File Scritto");
  } else {
    Serial.println("Scrittura fallita");
  }
  file.close();
}
// Append data to the SD card (DON'T MODIFY THIS FUNCTION)
void appendFile(fs::FS &fs, const char * path, const char * message) {
  Serial.printf("Appending to file: %s\n", path);
  File file = fs.open("/METEO.txt", FILE_APPEND);
  if(!file) {
    Serial.println("Failed to open file for appending");
    return;
  }
  if(file.print(message)) {
    Serial.println("Message appended");
  } else {
    Serial.println("Append failed");
  }
  file.close();
}

Here's the header file

// Code generated by Arduino IoT Cloud, DO NOT EDIT.

#include <ArduinoIoTCloud.h>
#include <Arduino_ConnectionHandler.h>

const char DEVICE_LOGIN_NAME[]  = "++++";

const char SSID[]               = "++++";    // Network SSID (name)
const char PASS[]               = "++++";    // Network password (use for WPA, or use as key for WEP)
const char DEVICE_KEY[]  = "++++";    // Secret device password


CloudIlluminance lum;
CloudPressure Pr;
bool BH_INIT;
bool BMP_INIT;
CloudTemperature Temp;

void initProperties(){

  ArduinoCloud.setBoardId(DEVICE_LOGIN_NAME);
  ArduinoCloud.setSecretDeviceKey(DEVICE_KEY);
  ArduinoCloud.addProperty(lum, READ, ON_CHANGE, NULL);
  ArduinoCloud.addProperty(Pr, READ, ON_CHANGE, NULL);
  ArduinoCloud.addProperty(BH_INIT, READ, ON_CHANGE, NULL);
  ArduinoCloud.addProperty(BMP_INIT, READ, ON_CHANGE, NULL);
  ArduinoCloud.addProperty(Temp, READ, ON_CHANGE, NULL);

}

WiFiConnectionHandler ArduinoIoTPreferredConnection(SSID, PASS);

Hi @dilox_21. Does the problem still occur if you remove the long blocking delay from your code?:

Arduino IoT Cloud sketches are intended to call ArduinoCloud.update(); very frequently so you are better off to allow your loop function to return quickly, using millis in order to trigger actions on specific intervals. You can see a simple demonstration of that technique in this tutorial: