Code review - Zu hoher Speicherverbrauch... Bitte um Optimierungsvorschläge.

Hallo.

Ich habe ein Projekt, das ich nun endlich mal fertig stellen will :slight_smile: Soweit jetzt alles beisammen und nachdem die ‘letzten’ Zeilen Code geschrieben waren, hatte ich ein Speicherproblem. Jetzt läuft das System instabil. Deswegen würde ich euch bitten euch mal den Code anzusehen und zu schauen wo noch Speicher verschwendet wird. Da geht bestimmt noch was zu optimieren… was ich nicht sehe oder kenne.

Das Projekt ist ein Wählscheibentelefon. Die ‘Innereien’ habe ich entfernt und nur die Wählscheibe und der Schalter zum Hörer auflegen ist noch drin. Neu hinzugekommen ist ein Arduino Nano (ein größerer passt nicht ins Gehäuse… falls jemand sagen möchte "Bau doch einen größeren Arduino ein), ein Sim800L Modul, SD Karte (zum Speichern der Einstellungen), ein DFPlayer mini Modul (zum Abspielen der ‘Bimmel’), ein RGB LED Streifen und ein Buzzer (der aktuell nicht mehr in Benutzung ist).

Aktuell verbraucht der Sketch 88% Programmspeicherplatz und 71% (1470 Byte) dynamischen Speicherplatz. Ich denke der dynamische ist das Problem. Wenn man da noch 5-10% freischafeln könnte, das würde das Problem lösen, hoffe ich.

rotary_phone.ino (22.6 KB)

Verwende nicht die Klasse String. Sie fragmentiert Deinen RAM. Nutze statt dessen char-Arrays. (Ansonsten plane zur Not sehr akribisch und nutze reserve() - ohne Gewähr).

Prüfe bei Deinen globalen Variablen, was davon wirklich int sein muss und wo byte/char genügt.
Prüfe auch, was wirklich zur Laufzeit geändert wird und was konstant ist. Das als const deklarieren.
Als Kandidaten sehe ich da z.B. Pins.

Prüfe, was wirklich als globale Variablen gebraucht wird und was evtl. als lokale Variablen in Funktionen genutzt werden kann.

Gruß Tommy

Hallo,

hab mal einen kurzen Blick in Deinen sketch geworfen, klar kannst Du noch versuchen die Strings gegen Char auszutauschen. Dennoch würde ich vorschlagen auf eine andere Hardware zu setzten. Schau dir mal einen Wemos D1 mini an, damit kannst du komplett auf die SD Karten Modul verzichten und das mit dem internen Filesystem machen.
Platz benötigt er nicht viel mehr, denke ich. Von den E/A´s her sollte das gehen. wo ich mir nicht ganz sicher bin ist das Thema mit den 3 seriellen Schnittstellen. Du brauchst dann also noch eine Softserial für das GSM Modul. Der Wemos hat eigendlich zwei Hardware Schnittstellen , wobei man die Serielle1 allerdings nur zum senden nutzen kann. Ich hab da aber bereits schon mehrfach das DF Modul angeschlossen und auf die RXD verzichtet.

Heinz

das gibts noch

Serial.println("Command: "+command);

die Pins auf const byte (aber ich glaube das bringt nichts)

das wird gesetzt aber nie verändert --> const byte
int dialHasFinishedRotatingAfterMs = 100;

das soll besser ein unsigned long werden: lastStateChangeTime

was kannst da noch zu einem byte machen?
int cfg_ring = 1;
int cfg_led = 1;
int cfg_ledintensitiy = 100;
int cfg_ledcolor = 1;
int cfg_status_led = 1;
int cfg_bell_volume = 25; // 0 - 30

vieleicht kann man noch die vielen command.startsWith optimieren.

wie schon erwähnt, weg von String.
Ein Esp8266 ist kleiner als ein Nano :wink: