SSD1306 Oled Problem

Hallo Leute,

erstmal möchte ich mich Vorstellen. Meine Name ist Felix und ich mache aktuell eine Ausbildung zum Elektroniker für Geräte und Systeme. Der Teil mit dem Strom sollte also für die meisten Anwendungen kein Problem sein :slight_smile: Ich arbeite schon seit Jahren mit Arduino und konnte bisher alle Probleme die Aufgetreten sind lösen, wenn auch oft genug mit Hilfe dieses Forums xD. Jetzt ist es soweit, ich komme absolut nicht weiter.

Ich arbeite aktuell an einer Uhr, die bei uns im Betrieb als kleines Schulungsprojekt/Lötubung genutzt werden soll. Das ganze läuft über einen Nano (328P mit altem Bootloader). Dran hängen tut eine DS1307 sowie ein SSD1306 128x64 OLED in blau.

Der Sketch an sich funktioniert, alles super, doch wenn ich die neueste Version meiner Software hochlade geht irgendwie komisches Zeug ab.
Zum einen Zeigt das Display rechts unten komische "Rauschende Pixel" an, des weiteren funktioniert wenn ich den Speicherbedarf erhöhe, sprich mehr #defines und Variablen rein nehme gar nichts mehr...

Angehängt sind die Verschiedenen Versionen

V3.31 Funktioniert Super
V3.42 macht probleme

V_3_31.ino (21.7 KB)

V_3_42.ino (22 KB)

Es gibt natürlich auch Bilder von dem Projekt

Wenn Du die Sketche ausmistest (Löschen der Massen an unbenutzten defines, Teile die nicht zu einer Uhr gehören, wie Hindernisse für Spiele), würden sie übersichtlicher und man könnte sie sich anschauen.

Mach doch einfach mal ein Diff auf die beiden Versionen (z.B. Winmerge), um zu sehen, was sich geändert hat.

Gruß Tommy

Edit:

  1. Für Tasten braucht man in 99,99% der Fälle keinen Interrupt
  2. Serial.print hat in interruptroutinen nichts zu suchen
  3. Variablen, die in ISR und im Programm genutzt werden müssen volatile sein und sollten bei > Byte atomar ausgelesen werden

Vermutlich ein RAM Problem.
Sollen wir uns nun deine zwei Versionen und die erforderlichen Libraries laden um sie beide zu testen (mit deiner Hardware), oder meldest du dich wieder, wenn du das Problem gefunden hast?

So, Danke für die schnellen Antworten!

ich habe jetzt mal alles an Quatsch rausgeschmissen und nur noch die "wichtigsten Funktionen" drin gelassen. Siehe da: Das Problem ist mal wieder verschwunden. Das Stützt wieder die Vermutung mit dem Speicherproblem, die hatte ich auch schon, konnte das aber eigentlich nicht Nachvollziehen. Die Frage ist, wie ich das verhindern kann... vermutlich muss ich das gesamte Programm schlanker aufbauen, da die Libraries wohl auch noch relativ viel Speicher belegen. Die GFX Library muss ja noch die Schriftart laden und die RTC Lib hat die Wochentagsberechnung drin.

Wenn ihr wollt könnt ihr das Projekt gerne mal ausprobieren, ich lade gerne den Schaltplan hoch.

V_3_43.ino (13.3 KB)

Schaltplan.pdf (456 KB)

Die beschriebenen Fehler im Interrupthandling sind immer noch drin.

Gruß Tommy

Von 22 auf 13 kB Text wird sich wohl auch in der Programmgröße in jeder Hinsicht auswirken.

Um die Uhrzeit einer RTC zu lesen braucht man außer Wire.h eigentlich keine Library. Aber ob ungenutzte Funktionen einer überflüssigen Library tatsächlich Speicher belegen, müsste man genauer untersuchen. Wirklich kritisch ist ja stets nur der RAM. FLASH-Überlauf merkt man leichter.

Danke für deine schnelle Antwort :slight_smile:

Soo ich mach jetzt erst mal Mittagspause und dann räume ich mal den Rest des Programms auf.

@michael_x Die RTC auszulesen ist auch kein Ding, aber die Wochentage werden so wie ich das verstehe mit der RTC Lib berechnet.

Ich melde mich wenn das Ding läuft. Oder wenn ich wieder am verzweifeln bin xD

Ich dachte, die Wochentage brauchst du nicht. Außerdem hat die DS1307 einen Wochentagszähler.

Ich hatte neulich das gleiche Problem. Was geholfen hat: sämtlichen Text ins F-Makro verfrachten.
Also z.B. statt

display.println("Update Time?");

-->

display.println(F("Update Time?"));

Danke für den Tipp, ich werde es mal ausprobieren!

Zur Bibliothek Adafruit_SSD1306 gibt es speichersparendere Alternativen, besonders bei reinen Textausgaben. Oliver Kraus (olikraus) bietet die U8g2 an, die wiederum die U8x8 nur für Text enthält.