I2C display and SD module doesn't work together.

Hello!
I have an I2C display and SD module. They work ok separately, but when connected together the monitor doesn't work.

Here is my code:

#include <Encoder.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <SPI.h>
#include <SD.h>
File myFile;
const int chipSelect = 4;


#define OLED_ADDR   0x3C
#define BUTTON_PIN 7

Adafruit_SSD1306 display(-1);
#if (SSD1306_LCDHEIGHT != 64)
//#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// Change these pin numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability

Encoder knobRight(3, 2);
//   avoid using pins with LEDs attached

boolean ButtonWasUp = true;
boolean displayOn = false;
boolean setting = false;
boolean showSettings = false;
boolean settingNow = false;
long  encoder;
long oldEncoder = 0;
String textMenu;
String textUpperMenu;
int minTakenFocus;
int maxTakenFocus;
int minAnamorphicFocus;
int maxAnamorphicFocus;
//Sd2Card card;

int menu = 0;

void setup() {
  Serial.begin(115200);

  
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  
  // Open serial communications and wait for port to open:
  //Serial.begin(115200);
  Serial.print("Initializing SD card...");

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
  display.clearDisplay();
  display.display();
}



void loop() {
  if (displayOn == false) {
    boolean ButtonIsUp = digitalRead(BUTTON_PIN);
    if (ButtonWasUp && !ButtonIsUp) {
      delay(2000);
      ButtonIsUp = digitalRead(BUTTON_PIN);
      if (!ButtonIsUp) {
        if (displayOn == false) {
          displayOn = true;
        }


      }

    }

    ButtonWasUp = ButtonIsUp;

    myFile = SD.open("focuses.txt");
    if (myFile) {

      Serial.println("Reading");
      minTakenFocus = myFile.parseInt();
      maxTakenFocus = myFile.parseInt();
      minAnamorphicFocus = myFile.parseInt();
      maxAnamorphicFocus = myFile.parseInt();
      // close the file:
      myFile.close();
    } 
    else {
      // if the file didn't open, print an error:
      Serial.println("error opening focuses.txt");

    }
  }
  if (displayOn) {


    encoder = knobRight.read();

    int difference = oldEncoder - encoder;

    if (difference > 2) {

      menu = menu + 1;



    }
    else if (difference < -2) {

      menu = menu - 1;

    }
    else {

    }
    oldEncoder = encoder;

    if (menu == 0) {
      buttonPress();

      if (setting) {
        textUpperMenu = "SET TAKEN LENS MIN";
        textMenu = analogRead(1);
        minTakenFocus = analogRead(1);
      }

      else {

        textMenu = "MIN focus";
        textUpperMenu = "SET TAKEN LENS";

      }
     

    }
    else if (menu == 1) {
      buttonPress();
      if (setting) {
        textUpperMenu = "SET TAKEN LENS MAX";
        textMenu = analogRead(1);
        maxTakenFocus = analogRead(1);

      }

      else {
        textMenu = "MAX focus";
        textUpperMenu = "SET TAKEN LENS";

      }
      
    }
    else if (menu == 2) {
      buttonPress();
      if (setting) {
        textUpperMenu = "SET ANAMORPHIC MIN";
        textMenu = analogRead(1);
        minAnamorphicFocus = analogRead(1);

      }

      else {
        textMenu = "MIN focus";
        textUpperMenu = "SET ANAMORPHIC";

      }
      

    }
    else if (menu == 3) {
      buttonPress();
      if (setting) {
        textUpperMenu = "SET ANAMORPHIC MAX";
        textMenu = analogRead(1);
        maxAnamorphicFocus = analogRead(1);

      }

      else {
        textMenu = "MAX focus";
        textUpperMenu = "SET ANAMORPHIC";

      }
      

    }
    else if (menu == 4) {
      textMenu = "EXIT";
      //set = false;
      setting = false;
      boolean ButtonIsUp = digitalRead(BUTTON_PIN);
      if (ButtonWasUp && !ButtonIsUp) {
        delay(10);
        ButtonIsUp = digitalRead(BUTTON_PIN);
        if (!ButtonIsUp) {

          displayOn = false;
          showSettings = true;

        }

      }
      ButtonWasUp = ButtonIsUp;
    }
    else if (menu > 4) {
      menu = 0;
    }
    else if (menu < 0) {
      menu = 4;
    }

    
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(10, 12);
    display.print(textMenu);
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(10, 0);
    display.print(textUpperMenu);
    display.display();

  }
  else {


    if (showSettings) {

      showSettingsFunc();
      delay(2000);
      display.clearDisplay();
      display.display();
      delay(100);

      showSettingsFunc();
      delay(400);
      display.clearDisplay();
      display.display();
      delay(100);

      showSettingsFunc();
      delay(400);
      display.clearDisplay();
      display.display();
      delay(100);

      showSettingsFunc();
      delay(400);
      display.clearDisplay();
      display.display();



      showSettings = false;
    }
    else {
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(25, 0);
      display.print("FOCUS");
      int focus = analogRead(1) / 5;
      String focusString = String(focus);
      if (focus >= 190) {
        for (int t = 0; t <= 1000; t++) {


          float scale = 2 / (3 - cos(2 * t));
          int x = 25 * scale * cos(t);
          int y = 18 * scale * sin(2 * t) / 2;
          display.drawPixel(x + 50, y + 18, WHITE);
          display.drawPixel(x + 51, y + 19, WHITE);

        }
      }
      else {
        display.setTextSize(2);
        display.setCursor(25, 12);
        display.print(focusString);
        display.print(" m");

      }

      display.display();
    }




  }
  // if a character is sent from the serial monitor,
  // reset both back to zero.
  Serial.print("show settings ");
  Serial.println(showSettings);
  //  Serial.print("set ");
  //  Serial.println(set);
}

void buttonPress() {
  boolean ButtonIsUp = digitalRead(BUTTON_PIN);
  if (ButtonWasUp && !ButtonIsUp) {
    delay(10);
    ButtonIsUp = digitalRead(BUTTON_PIN);
    if (!ButtonIsUp) {

      if (setting) {
        setting = false;

      }
      else {
        setting = true;

      }
      if (displayOn == false) {
        displayOn = true;
      }

    }

  }
  ButtonWasUp = ButtonIsUp;
}
void showSettingsFunc() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(10, 0);
  display.print("Lens min: ");
  display.print(minTakenFocus);
  display.setCursor(10, 8);
  display.print("Lens max: ");
  display.print(maxTakenFocus);
  display.setCursor(10, 16);
  display.print("Anamorph min: ");
  display.print(minAnamorphicFocus);
  display.setCursor(10, 24);
  display.print("Anamorph max: ");
  display.print(maxAnamorphicFocus);
  display.display();
}

Seems there are conflicts between these two devices. I've read somewhere that it could be because of CS. Someone suggests to connect it directly to GND.

Someone suggests to connect it directly to GND.

As opposed to . . . what?

to d4
I use a connection suggested here.

I've also tried this one

SD

GND>GND
VCC > 5V
MISO> D12
MOSI > D11
SCK >D13
CS >D4

Display
GND>GND
VIN > 5V
SCL> A5
SDA> A4

Doesn't work

Also it looks like it is continuously resetting. Here is what I have from the Serial Monitor:

Initializing SD card...initialization done.
Reading
Initializing SD card...initialization done.
Reading
Initializing SD card...initialization done.
Reading
Initializing SD card...initialization done.
Reading
Initializing SD card...initialization done.
Reading
Initializing SD card...initialization done.
Reading
Initializing SD card...initialization done.
Reading

It continues over and over again.

Dynamic RAM allocation?
What are you trying to run this on?

Arduino Nano

Seems like the SD library uses too much of ram. What can be done?

It depends what compromises you are willing to make.

For example?

Do you need the OLED for graphics, or just text?
What sort of screen update rate can you tolerate?

it draws an infinity symbol - that's all graphics I have. I may use it just for text. I prefer to have rather fast update rate.

seems like SdFat.h instead of SD.h has solved the problem of restarting, but the display still doesn't work

Can anybody help?