«Ошибка выделения SSD1306» при #include SD.h

ssd1306 sd.h

Я использую файл примера ssd1306_128x64_i2c из библиотеки 1306.

Он работает отлично, пока я не добавляю строку #include SD.h, после чего выдает ошибку сбоя выделения.

Пожалуйста, сообщите.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SD.h>

Adafruit_SSD1306 display(128, 64, &Wire, 4);

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

  // SSD1306_SWITCHCAPVCC = генерировать напряжение дисплея от 3,3 В внутри
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println(F("SSD1306 allocation failed"));
  }

  display.clearDisplay();
  display.display();
  testdrawchar();      
}

void loop() {
}

void testdrawchar(void) {
  display.clearDisplay();
  display.setTextSize(1);      
  display.setTextColor(WHITE); 
  display.setCursor(0, 0);     
  display.cp437(true);         

  for(int16_t i=0; i<256; i++) {
    if(i == '\n') display.write(' ');
    else          display.write(i);
  }
  display.display();
}

, 👍1

Обсуждение

У меня была точно такая же проблема, и я был рад видеть, что кто-то уже задал этот вопрос. Удивительно, что вы не можете использовать SD.h и oled-библиотеку adafruit одновременно., @raddevus


2 ответа


1

И библиотеке SD, и библиотекам SSD1306 нужны большие буферы. Это означает много памяти. У вас мало памяти.

  • SD требует не менее 512 байт для секторного буфера (который выделяется во время компиляции).
  • SSD1306 требует не менее 1 КБ для буфера дисплея (который выделяется во время выполнения).
  • Последовательному интерфейсу требуется не менее 128 байт для буферов TX и RX (которые выделяются во время компиляции).
  • Библиотеке Wire требуется 32 байта для буфера TX.

Это 1696 байт из общего числа 2048, и это без учета других переменных и вещей, которые нужны вашей программе, различным библиотекам и самому ядру Arduino, а также стек (и заданный для него минимальный размер зоны безопасности). ).

Вы ничего не можете с этим поделать, кроме как обновить Arduino до версии с большим объемом памяти или разделить проект на несколько плат Arduino.

,

Есть ли способ точно узнать, сколько памяти у меня осталось во время выполнения?, @cds333

Не на самом деле нет. Все, что вы знаете, это то, что попытка выделить память не удалась., @Majenko

Однако где-то есть пример/библиотека «свободной памяти», которая может сказать вам, сколько свободной памяти имеется, что может помочь., @Majenko


2

Мне удалось уместить все это с помощью текстовой библиотеки для OLED.

Библиотека SSD1306Ascii

Огромное спасибо Маженко за объяснение проблемы и Грейману за написание библиотеки!

,