Probleme mit Arbeitsspeicher

Hallo zusammen,

ich brauche leider eure Hilfe, da ich als Arduino-Anfänge allein nicht mehr weitergekommen. Meine ersten Versuche (Sensoren auslesen, SD-Karte schreiben …) haben alle ganze gut geklappt. Jetzt wollte ich mir noch ein OLED-Display dazunehmen und das bringt meinen Arduino Uno über seine Grenzen.

Im Minimalbeispiel binde ich nur die Libraries für die SD-Karte und für das Display ein:

#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>
#define OLED_RESET 4
Adafruit_SH1106 display(OLED_RESET);

#include <SD.h>

void setup()
{
}

void loop()
{
     delay(1000);
}

Das führt zur Fehlermeldung:

"Globale Variablen verwenden 2054 Bytes (100%) des dynamischen Speichers, -6 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes."

Wie kann ich das optimieren??

Danke
Tom

Wenn das schon zu viel ist nichts. 2k RAM sind nicht viel. Die SD Library belegt da schon 512 Bytes für seinen Puffer. Grafik LCD/TFT Libraries sind auch speicherhungrig

Da bleibt dir nur auf einen anderen Prozessor zu wechseln

Oder du verwendest ein anderes Display.
LCD 16x2 oder oder 20 x 4. Die zugehörige "LiquidCrystal.h" verbraucht weniger Ram.

Weitere Alternative: 2 Controller verwenden und mit I2C verbinden.

LCD hatte ich schon, aber ich wollte ja eigentlich auf eine besser Grafik upgraden? ::slight_smile:

@HotSystems: Hab deinen Tipp mit I2C nicht verstanden: Das OLED-Display ist über I2C angeschlossen und für SD-Leser SPI, da hab ich noch nie einen mit I2C gesehen ...

@Serenifly: Anderer Prozessor heißt dann Arduino Mega, oder?

Danke euch schon mal!

tom1992:
@HotSystems: Hab deinen Tipp mit I2C nicht verstanden: Das OLED-Display ist über I2C angeschlossen und für SD-Leser SPI, da hab ich noch nie einen mit I2C gesehen ...

Das war dafür gedacht, wenn du mit einem Atmega328 (Uno o.ä.) nicht auskommst und die Funktionen auf 2 aufteilst. Diese beiden Controller dann per I2C miteinander verbindest.

Er meint den SD-Leser an ein zweites Board anschließen und diesem mit I2C mitteilen was es tun soll.

Der Mega ist eine Option, aber es gibt auch im 32-Bit Bereich kleine Boards die mit der Arduino Software laufen

Serenifly:
Er meint den SD-Leser an ein zweites Board anschließen und diesem mit I2C mitteilen was es tun soll.

Der Mega ist eine Option, aber es gibt auch im 32-Bit Bereich kleine Boards die mit der Arduino Software laufen

Ja stimmt, oder eben Display und Sensor auf den 2. Controller.
Ja, andere Boards wären noch eine weitere Alternative.

ESP?
Dann gibts noch WLAN geschenkt dazu....

Versuch doch mal die u8g2 Library Home · olikraus/u8g2 Wiki · GitHub, die arbeitet ohne Framebuffer.

combie:
ESP?
Dann gibts noch WLAN geschenkt dazu....

Genau und das auf einem Wemos D1 mini, der ist auch mit der IDE direkt zu programmieren.

Was für ein Display nutzt Du denn?
Die Adafruit_SH1106.h Library scheint da gut zuzulangen, kannte ich bisher auch nicht.
Wenn Dein Display nen SSD1306-Treiber hat, nutz mal diese Bibliothek: Adafruit_SSD1306.h
Damit kannst Du Deinen Sketch kompilieren, verschlingt dann "nur" noch 1542 Bytes (75%)....

http://www.firebirduino.com/uu/index.html
hat mehr Speicher

DerLehmi:
Was für ein Display nutzt Du denn?
Die Adafruit_SH1106.h Library scheint da gut zuzulangen, kannte ich bisher auch nicht.
Wenn Dein Display nen SSD1306-Treiber hat, nutz mal diese Bibliothek: Adafruit_SSD1306.h
Damit kannst Du Deinen Sketch kompilieren, verschlingt dann "nur" noch 1542 Bytes (75%)....

Der SH1106-Treiber spart tatsächlich erstmal 500 Byte RAM, das Display hat dann allerdings nur 32 Zeilen (jede zweite bleibt schwarz). Wenn man auf 64 Zeilen hochsetzt, dann hat man wieder den alten RAM-Verbrauch. :-\

Ich würde das ganze auch auf 2 Boards über I2C aufteilen.
Das eine Board als Master und das andere als Display-Board.

Oder einen Teensy mit mehr Speicher