Leonardo froze after connecting BMP180 and DHT22 to LCD

Hello,
I have a successful configuration of DHT22 and ST7565R display using u8glib. It prints the desired data (temp and humidity) with no problem.

I added a BMP180 in a GY-68 configuration (with voltage regulator onboard). VIN to 5V (IOREF) GND to GND, I2C signals to marked pins on Arduino. No pull-up resistors because I read they are built in the ATmega.

Connecting BMP180 alone and monitoring it on serial monitor - everything works like charm.

That's why I connected BMP180 to the rest of my sketch, with a following code:

#include <dht.h>
#include "U8glib.h"
// Include the Wire library for I2C access.
#include <Wire.h>
// Include the Love Electronics BMP180 library.
#include <BMP180.h>

BMP180 barometer;
int indicatorLed = 13; 
// Store the current sea level pressure at your location in Pascals.
float seaLevelPressure = 102900;
dht DHT;
U8GLIB_DOGM128 u8g(3, 2, U8G_PIN_NONE); //U8GLIB_DOGM128(cs, a0 [, reset]) 

#define DHT22_PIN 8

long currentPressure = barometer.GetPressure();
float altitude = barometer.GetAltitude(seaLevelPressure);

void setup()
{
    u8g.setContrast(55);
    u8g.setRot270();
    // assign default color value
    if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
      u8g.setColorIndex(255);     // white
    }
    else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
      u8g.setColorIndex(3);         // max intensity
    }
    else if ( u8g.getMode() == U8G_MODE_BW ) {
      u8g.setColorIndex(1);         // pixel on
    }
    else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
      u8g.setHiColorByRGB(255,255,255);
    }
    // We start the I2C on the Arduino for communication with the BMP180 sensor.
    Wire.begin();
    // Set up the Indicator LED.
    pinMode(indicatorLed, OUTPUT);
    // We create an instance of our BMP180 sensor.
    barometer = BMP180();
     // When we have connected, we reset the device to ensure a clean start.
    barometer.SoftReset();
    // Now we initialize the sensor and pull the calibration data.
    barometer.Initialize();
}
void loop()
{
    // READ DATA
    int chk = DHT.read22(DHT22_PIN);
    

    u8g.firstPage();  
    do {
      draw();
    } while( u8g.nextPage() );
    
    // rebuild the picture after some delay
    delay(2000);
}

void draw(void) {
    // graphic commands to redraw the complete screen should be placed here  
    u8g.setFont(u8g_font_6x12);
    
    u8g.setPrintPos(0, 10);
    u8g.print("DHT Test");
    
    u8g.setPrintPos(0, 30);
    u8g.print("Temp.");
    
    u8g.setPrintPos(30, 30);
    u8g.print(DHT.temperature, 1);
    u8g.print("*C");
    
    u8g.setPrintPos(0, 50);
    u8g.print("Hum.:");
    
    u8g.setPrintPos(30, 50);
    u8g.print(DHT.humidity, 1);
    u8g.print("%");
    
    u8g.setPrintPos(0, 70);
    u8g.print("Press. ");
    
    u8g.setPrintPos(30, 70);
    u8g.print(currentPressure/100);
    u8g.print(" Pa");
    
    u8g.setPrintPos(0, 90);
    u8g.print("Alt: ");
    
    u8g.setPrintPos(30, 90);
    u8g.print(altitude, 0);
    u8g.print(" m");  
}

It compiled with no errors. However, after uploading that - my Arduino and everything was dead. I couldn't do anything. I tried uploading another program, but the serial port was grayed out and Arduino was not recognized. Somehow I managed to load blink LED on another computer and I returned to the last working configuration, without BMP180.

My first thought - I ran out of RAM. I pasted following code:

int freeRam (void) {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

to check the amount of RAM used.
I think it gives complete rubbish, since in ATmega32u4 I have 2,5 KB memory, but with 1KB taken by ST7565R, maximum I should have got would be 1,5KB.
But my result was 2178 bytes...

So apparently, RAM is not the problem.

Does anybody know what may have caused that freeze? Is there some memory overflow in my program that was not seen by the compiler?

    // We create an instance of our BMP180 sensor.
    barometer = BMP180();

Nonsense. You created the instance here:

BMP180 barometer;

You never actually read the barometer in your sketch.

Ditch the nonsense code, and move:

long currentPressure = barometer.GetPressure();
float altitude = barometer.GetAltitude(seaLevelPressure);

into loop so you actually read from the barometer.