Arduino Uno Fehler - stürzt in void setup() ab

Das es Adafruit ist, sehe ich in deinem Sketch nichts.
Und mit der gibt es keine Probleme, die läuft auch bei mir und du brauchst die nicht wechseln.

Ich kann nur nicht erkennen, wie die bei dir initialisiert wird.
Da wird dein Fehler sein.

und im setup nochmal

Sind zwei Displays im Spiel?

Vielen vielen Dank für eure Antworten. Problem ist leider noch nicht gelöst. Das ganze sitzt auf einem Breadboard und sieht etwas verrückt aus (kann natürlich auch das Problem sein):

Die Adafruit Library ist in der Klasse Disp. Die Disp.h sieht so aus:

// Disp.h
#ifndef DISP_H
#define DISP_H

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

class Disp {
    public:
        Disp(int RESET, TwoWire *Wire);
        void on();
        void off();
        void init();
        void show();
        void update_led_status(int status);
        void update_led_mode(int mode1, int mode2);
        void update_led_speed(int speed);
        void update_battery_level(int level);

    private:
        Adafruit_SSD1306 display;
        int led_status;
        int led_mode;
        int led_speed;
        int battery_level;
        int mode;
};

#endif

und die Disp.cpp:

#include "Disp.h"
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_ADDRESS 0x3C

Disp::Disp(int RESET, TwoWire *Wire): display(128, 64, Wire, -1)
{
    led_speed = 0;
    battery_level = 0;
    //display.clearDisplay();
}

void Disp::on()
{
    display.clearDisplay();
    display.setTextColor(WHITE);
    display.setTextSize(1);
    display.setCursor(23,0);
    display.println("OLED - Display");
    display.setCursor(23,12);
    display.println("www.joy-it.net");
    display.setCursor(36,24);
    display.println("SBC-OLED01");
    display.display();
    delay(8000);
    display.clearDisplay();
    display.invertDisplay(true);
    delay(8000);
    display.invertDisplay(false);
    delay(1000);
}

void Disp::off()
{
    bool active = true;
    if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C )) {
        Serial.println(F("SSD1306 allocation failed"));
        active = false;
    }
    if (false){
    }
}

void Disp::init()
{
    
    display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS );
   
    display.clearDisplay();
    display.setTextColor(WHITE);
    display.setTextSize(1);
    display.setCursor(23,0);
    display.println("OLED - Display");
    display.setCursor(23,12);
    display.println("www.joy-it.net");
    display.setCursor(36,24);
    display.println("SBC-OLED01");
    display.display();
}

void Disp::show()
{
    display.clearDisplay();
    display.setTextColor(WHITE);
    display.setTextSize(1);
    display.setCursor(0,0);
    display.print("LED Status: ");
    display.println(led_status == 0 ? "ON" : "OFF");
    display.print("LED Mode: ");
    display.print(led_mode);
    display.println(" / BLUE");
    display.print("LED Speed: ");
    display.print(led_speed);
    display.println("ms");
    //display.println("");
    display.setCursor(0,28);
    display.print("Fuel: ");
    display.print(battery_level);
    display.println("%");
    display.setCursor(0,40);
    display.print("Voltage: ");
    display.println("5.01V");
    display.print("Current: ");
    display.println("1A");
    //display.print("Power: ");
    //display.println("5.01 Watts");
    display.display();
}

void Disp::update_led_status(int status)
{
    if (status != led_status){
        led_status = status;
        show();
    }
}

void Disp::update_led_mode(int mode1, int mode2)
{
    int mode = abs(1-mode1) + 2*(abs(1-mode2));
    if (mode != led_mode){
        led_mode = mode;
        show();
    }
}

void Disp::update_led_speed(int speed)
{
    if (abs(led_speed - speed) > 1){
        led_speed = speed;
        show();
    }
}

void Disp::update_battery_level(int level)
{
    if (abs(battery_level - level) > 1){
        battery_level = level;
        show();
    }
}

Es ist nur ein Display. Disp.init() führt einen Sketch aus, der einfach nur das Display das erste mal mit etwas befüllt. Die anderen Libraries sind ein guter Tipp. Das werde ich mal ausprobieren.

Ich kann mir echt keinen Reim draus machen, warum es hier zu diesen Problemen kommt. Vielleicht lädt der Display wirklich zu viel in den Speicher?

Das ist quatsch.
Die Adafruit funktioniert.

Warum den Umstand einer zusätzlichen Klasse ?
Mach es direkt im Sketch in einer eigenen Funktion und es läuft (bestimmt) richtig.
Zudem ist das für externe übersichtlicher.

Allerdings befürchte ich bei deinem "Kabelverhau" auch schnell mal Kontaktfehler ect.
Sowas ist nicht für einen festen, endgültigen Betrieb geeignet.

Und solltest du wirklich Speicherprobleme haben, kannst du später immer noch auf eine andere Lib wechseln.

Wie hoch ist dein Speicherverbrauch nach dem Kompilieren ?

Ja, ist eine Idee das direkt in die main.cpp zu hauen. Wie kann ich den Speicherverbrauch mir auf dem Arduino anzeigen? Das kommt nach dem kompilieren:

Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [====      ]  36.6% (used 749 bytes from 2048 bytes)
Flash: [======    ]  58.0% (used 18698 bytes from 32256 bytes)

Ja das mit den Kabeln ist nicht ganz optimal :smiley: Das es ein Fehler mit den Kontakten ist kann ich mir nicht ganz vorstellen, da es bei einer kleinen Änderung des Programms nicht mehr geht. Das soll auch nur so ca 2 Jahre halten und erfährt keine Vibrationen in einem sehr geschützten Gehäuse.

Wenn das original ist, ist es noch kein Problem.

Und mach das mit dem Display, so wie im Beispiel der Lib gezeigt. Und glaub mir, das funktioniert.
Ich habe lange Zeit mit der Adafruit gearbeitet. Aktuell sind es bei mir ESP's und da sind andere Libs gefragt.

Ok, wenn es dir reicht, ist gut. Für mich wäre das def. keine Lösung.
Viel zu unsicher.....

Ich habe jetzt alles in der main.cpp. Aber wieder gefailed. Diesmal aber mit dem Serial Monitor das aufgeschnappt:

---- Opened the serial port COM3 ----
Set pin modes
Init Battery
Init LEDs
- LEDs set mode
- LEDs reset and standby
Init LEDs completed
Init Display
SSD1306 allocation failed

Das heißt, hier bleibt er hängen:

if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

Warum geht das manchmal und manchmal nicht??? Auf dem Display steht hinten 0x3C

Oh....das ist dann ein Fehler in der Hardware.
Da ist irgend etwas faul.

Kabel....oder Störungen oder fehlende Pullup-Widerstände.
Nimm mal fürs Display kürzere Kabel.

Sicher ist es kein Problem der Library !!

Also ich hab kürzere Kabel ausprobiert, ein anderes Display und nochmal andere Adressen aber der gleiche Fehler. Wieso aber erst, wenn bestimmte Dinge wie der Serial Monitor oder eine anderes Objekt hinzukomen...

Wie sieht der Speicherbedarf mit seriellem Monitor aus ?
Was für andere Objekte ?

Ok, ich bin für heute weg....

Die Adressen muss man NICHT ausprobieren. Die muss man AUSLESEN.

Wie bereits erwähnt, einfach mal den i2c_scanner aus den Beispielen starten.

Dabei darauf achten das NIX an den bei Pins des i2c-Bus hängt als nur das Display.

Wenn du mehr als ein Objekt hast was i2c hat, in deinen Projekt dann einen nach den anderen dran hängen.

Ich habe die Erfahrung gemacht das "Adress-Aufdrucke" nur als bessere Empfehlungen zu nutzen sind. Ich hab mal eine Adresse die das Teil angeblich haben sollte eingegeben. Und dann 3 Std. nach den Fehler gesucht. Dann habe ich gescannt und gemerkt das die Adresse nicht stimmte.

Ich halte eine Gesunde Paranoia in der gesamten IT für was sehr gutes. :wink:

Falls du nur ein MC hast, es reicht völlig wenn du den i2c Bus leer machst, beim Scannen.

Gruß

Pucki

Wozu ?
Wenn das Oled funktioniert, muss man nicht noch mal die Adresse scannen.

Was den Speicherbedarf angeht.

Das was er da anzeigt, ist der NACKTE Speicherbedarf. Also das was der Compiler schon zuweist.

Werden z.b. Variablen (z.b. Strings) aus externen Quellen eingelesen oder im Programm gefüllt, kann das ganz schnell in die berühmte Hose gehen. selbst getestet

Weshalb ich für ein Projekt vom NANO (fast das selbe wie der UNO) zum Mega-2560 gewechselt bin.

Gruß

Pucki

Da hast du nur recht, wenn keine anderen Teile am ic2 hängen. Sonst besteht die Gefahr eines Adressenkonflikt, oder er hat bei den Gewirre SDA (a4)+ SCL (a5) vertauscht. (irgendwo auf den BUS)

Kleiner Tipp an den TO. Neben den i2c-Bus muss ein Pin (ARef) i.d.R. frei sein.

Ist so ziemlich die einzige Idee warum das sonst Abkackt. Die Adafruit_SSD1306.h + Co. nutze ich nämlich selbst. Nur mein Display hat eine schmalere Form.

Gruß

 Pucki

Es geht doch hier um den Aufbau des TO, oder ?
Und da hängt nur das Oled dran und nix weiter. Also was möchtest du da noch rein interpretieren?
Wenn SDA und SCL vertauscht ist, dann zeigt das Oled def. nix an, auch nicht bei dem "Gewirre".
Und die Anzeige ist aber durchaus vorhanden, wenn auch nicht ständig. Einfach mal alles richtig lesen.
Mit deinen Aussagen bringst du hier nur wieder alles durcheinander.

1 Like

Problem ist der TO zeigt nur Fragmente die nicht zusammen hängen
es wird zwei mall wire deklariert, wozu?
Ok ist kein Fehler aber trotzdem, und wo zu gut ist

Disp Display(-1, &Wire);

weis nicht.
Es ist schön und gut eigene .h und .cpp bauen nur man sollte auf Kleinigkeiten aufpassen.
Zum testen wurde erstmal Display .h und cpp außer Betrieb setzen und als Tab einbinden. Es wird fehlerfrei kompiliert nur irgend wo danach der Speicher überschrieben.
Meistens ist der großer Fehler alles auf einmal schreiben, wen man häppschen weise macht ist das schneller erledigt, wenn Funktioniert kann man immer noch schöner machen.

Und genau wissen, was man bei Problemen machen muss.
Und dazu sollte ein Projekt erstmal mit den Standardfunktionen grundsätzlich laufen.

Deswegen würde ich gern wissen, von was für zusätzlichen Objekten der TO schreibt.

Also ich bin mir jetzt sicher, dass die Lib für den Uno zu viel Speicher alloziert. Wenn ich weniger ram nutze, kann er das Display allozieren. Sonst nicht. So sieht es aus wenns geht, die Zahl ist der freie Ram nach dem Prozess:

---- Opened the serial port COM3 ----
2299
Set pin modes
2299
Init Battery
2299
Init Display
294
---- Closed the serial port COM3 ----

Also der Display benötigt fast 2000 was auch immer. So siehts aus, wenn ich zum Beispiel die Klasse LEDStateChart nicht auskommentiere und es dann crasht:

---- Opened the serial port COM3 ----
2166
Set pin modes
2166
Init Battery
2166
Init LEDs
2166
- LEDs set mode
2166
- LEDs reset and standby
2166
Init LEDs completed
Init Display
SSD1306 allocation failed

Obwohl ich hier ausrechne, dass noch was übrig ist, würde ich sagen, es liegt am Speicher, was ja eigentlich die Fehlermeldung auch aussagt...

Kann durchaus sein.

Das Display braucht einiges an Speicher. Grund ist die Definition der Schriften. Du benutzt ja keine festen Schriften die im Speicher liegen (Wie z.b bei den 16x2 Displays).

Um das zu testen, wirst du wohl ca. 20 Euro in die Hand nehmen müssen.

kompatibler Arduino Mega mit... kaufen bei BerryBase + VK <- z.b.

Das ist ein Nachbau. Original liegt bei ca. 40 Euro + VK.

Ich hatte bei einen Projekt ähnliche Probleme. Rein aus den Bauch heraus würde ich sagen ab ca. 3-4 Module (Display + Tasten / Tastatur zählen mit) wird es verdammt eng im Speicher.

Eine kostengünstiger Alternative könnte vielleicht was aus der ESP Serie sein. Wenn man da Wlan + (wenn vorhanden) BT abschaltet sollte der Speicher locker reichen.

Aber vorher gucken, das man genug Pins hat beim ein ESP. Der Mega-2560 ist mit Pins reichlich gesegnet.

Gruß

 Pucki

Das ist Quatsch. Das mag aber für deinen Sketch stimmen.
Daher hatte ich dich schon gebeten, uns diese Info zu posten. Ebenso dein unbekanntes Objekt.
Damit wir richtig helfen können, brauchen wir schon alle Infos.

Und ja, wenn die Library zu viel Ram benötigt, musst du eine andere Library einsetzen.
Oder du schreibst den Sketch so, dass er weniger Speicher benötigt.
Eine weitere Alternative wäre ein anderer Controller.