SSD1306 beißt sich mit Code-Teil

Hi Forum,

wir haben in der Schule gerade ein Projekt mit einem Roboterarm und Arduino.
In unsrem Projekt misst ein Farbsensor (I2C) einen Würfel, gibt an einen zweiten Arduino einen Befehl zum schalten eines Ausgangs und per Optokoppler wird der Roboterarm gesteuert, der dann den Würfel in eine Kiste sortiert. Eine Waage überprüft, ob die Kiste irgendwann voll ist.
Wir haben noch ein SSD1306 OLED-Display angebracht, um einige Dinge anzeigen zu lassen.

Jetzt beißt sich irgendwas mit diesem OLED-Display. Er wird andauernd nicht erkannt. Jedes mal wenn ich einen Codeteil auskommentiere funktioniert er dann wieder. Aber immer unterschiedliche Teile. Mal kommentiere ich die SoftwareSerial Libary aus, dann geht es. Dann lass ich den auskommentiert, schreibe etwas neues und schon geht es wieder nicht. Zuletzt habe ich einfach einen Serial.print eingefügt und es hat dann nicht meher funktioniert.

Manchmal war es die Funktion "d_print" oder auch "senden()" weshalb ich dachte es hat was mit den Strings zu tun, die ich der Funktion übergebe.

Ich suche jetzt schon zwei Tagen und probiere, aber nichts hilft. Verkabelung muss ja in Ordnung sein, da es ja ab und zu Funktioniert.

Ich habe jetzt nicht so einen kleinen Code, hoffe aber jemand hätte Zeit und Lust drüber zu schauen, ob ich irgendwas falsch gemacht habe. Würde uns echt den Hintern retten (Abgabe in zwei Tagen :((...)

Vielen Dank schon mal im voraus!

Mfg
Display.ino (1,4 KB)
Farbsensor.ino (3,8 KB)
Serial.ino (1,1 KB)
Taster.ino (1,1 KB)
Waage.ino (1,4 KB)

Arduino_1.ino (1,1 KB)

Hier noch der Haupttab. (Konnte nur 5 Dateien Hochladen)

Code befreit:

// =============================== Arduino 1 ===============================

//== I2C ==
#include <Wire.h>
#include <SPI.h>

#define I2C_DISPLAY    0x3C // Adresse OLED-Display
#define I2C_FARBSENSOR 0x10 // Adresse Farbsensor

//== FARBSENSOR LED ==
#include <FastLED.h>

#define NUM_LEDS 13
#define DATA_PIN 7

CRGB RING[NUM_LEDS];

bool automatik = false;     // flag, um zwischen Automatik und Normal umzuschalten

bool messung_waage = false; // flag, ob Gewichtsmessung schon gemacht wurde
bool messung_farb = false;  // flag, ob Farbmessung schon gemacht wurde

#define Taster 2 // Taster Pin

void setup()
{
  pinMode(Taster, INPUT_PULLUP);

  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(RING, NUM_LEDS).setCorrection(TypicalLEDStrip);

  fill_solid(RING, NUM_LEDS, CRGB::Black); // LEDS für die Farbmessung ausschalten
  FastLED.show();

  init_Serial();
  init_farbsensor();
  init_display();
  init_waage();
}

void loop()
{
  auswertung_taster(); // Taster
  auswertung_farbe();  // Farbsensor
  auswertung_waage();  // Waage
}

//== I2C Display ==
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

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

void init_display()
{
  // Serial.println("Initialisierung Display");

  if (display.begin(SSD1306_SWITCHCAPVCC, I2C_DISPLAY) == false)
    Serial.println(F("ERROR: Display nicht gefunden. Bitte Anschlüsse prüfen!"));

  display.display();
  delay(2000); 

  display.clearDisplay();
}

void d_print(String text, uint8_t x, uint8_t y, uint8_t groesse, boolean clear)
{
  if (clear == true) // will nicht immer das Display komplett löschen
    display.clearDisplay();

  else;
  fest(); // Feste Texte, die immer auf dem Display stehen sollen

  display.setTextSize(groesse);
  display.setTextColor(SSD1306_WHITE);      // Schrift weiss
  display.setCursor(x, y);                  // position

  display.print(text);
  display.display();
  display.setTextSize(1);                   // Normal 1:1
}

void fest()
{
  display.clearDisplay();

  display.setCursor(0, 0);
  display.setTextColor(SSD1306_WHITE);        // Draw white text

  if (automatik)
  {
    display.print(F("Automatik:"));
    display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
    display.println(" An ");
  }
  else
  {
    display.print(F("Automatik:"));
    display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
    display.println(" Aus ");
  }
}
//== I2C Farbsensor ==
#include "veml6040.h"

VEML6040 Farbsensor;

void init_farbsensor()
{
  // Serial.println("Initialisierung Farbsensor...");

  if (Farbsensor.begin() == false)
    Serial.println("ERROR: Sensor nicht gefunden. Bitte Anschlüsse prüfen!");

  else
    Farbsensor.setConfiguration(VEML6040_IT_80MS + VEML6040_TRIG_ENABLE + VEML6040_AF_FORCE + VEML6040_SD_ENABLE);

}
void auswertung_farbe()
{
  if (messung_farb == true) // nur Messen, falls taster gedrückt
  {
    switch (Farb_Messung()) // Erst Messen, dann ausweten
    {
      case 0: // Rot
        Serial.println("ROT");

        d_print("ROT", 45, 25, 2, true);
        d_print("WUERFEL WIRD SORTIERT ", 0, 50, 1, false);

        // senden ("pin 02 OUT HIGH");
        break;

      case 1: // Grün
        Serial.println("GRUEN");
        d_print("GRUEN", 32, 25, 2, true);
        d_print("WUERFEL WIRD SORTIERT ", 0, 50, 1, false);

        //  senden ("pin 03 OUT HIGH");
        break;

      case 2: // Blau
        Serial.println("BLAU");
        d_print("BLAU", 38, 25, 2, true);
        d_print("WUERFEL WIRD SORTIERT ", 0, 50, 1, false);

        //  senden ("pin 04 OUT HIGH");
        break;

      case 3: // Farbe nicht eindeutig
        Serial.println("FARBE NICHT EINDEUTIG");
        d_print("Ergebnis: \n   NICHT EINDEUTIG!", 0, 30, 1, true);

        //  senden ("LOW "); // Keine Messung erfolt, also alle Pins LOW
        break;

      default: // Messung noch nicht erfolgt
        Serial.println("MESSUNG NICHT ERFOLGT");
        d_print("MESSUNG NICHT ERFOLGT \nODER FEHLGESCHLAGEN", 0, 30, 1, true);

        //  senden ("LOW "); // Keine Messung erfolt, also alle Pins LOW
        break;
    }
    messung_waage = true; // Würfel wurde sortiert, also einmal Gewicht messen
  }
}

uint8_t Farb_Messung()
{
  uint16_t roh_rot[10]   = {0}; // Array für alle Farben anlegen
  uint16_t roh_gruen[10] = {0};
  uint16_t roh_blau[10]  = {0};

  uint16_t rot = 0; // Variablen für durchnittswert
  uint16_t gruen = 0;
  uint16_t blau = 0;

  d_print("Farbmessung...", 10, 30, 1, true);

  fill_solid(RING, NUM_LEDS, CRGB(100, 100, 200)); // LEDS für die Farbmessung einschalten
  FastLED.show();

  for (uint8_t i = 0; i < 10; i++) // Sensor 10x Lesen
  {
    Farbsensor.setConfiguration(VEML6040_IT_80MS + VEML6040_TRIG_ENABLE + VEML6040_AF_FORCE + VEML6040_SD_ENABLE); // muss nach jeder Messung neu definiert werden, da Trigger mode
    delay(90); // warte etwas mehr als 80ms

    roh_rot[i] = Farbsensor.getRed(); // Daten in Array speichern
    roh_blau[i] = Farbsensor.getBlue();
    roh_gruen[i] = Farbsensor.getGreen();

    // Serial.print("ROHDAETN: Rot ");
    // Serial.print(roh_rot[i]);
    // Serial.print(" blau ");
    // Serial.print(roh_gruen[i]);
    // Serial.print(" gruen ");
    // Serial.println(roh_blau[i]);
  }

  for (uint8_t i = 0; i < 10; i++) // Daten aufaddieren
  {
    rot += roh_rot[i];
    blau += roh_blau[i];
    gruen += roh_gruen[i];
  }

  // Sensor mittelwert bilden
  rot = rot / 10;
  gruen = gruen / 10;
  blau = blau / 10;

  //    Serial.print("MITTELWERT: Rot ");
  //    Serial.print(rot);
  //    Serial.print(" blau ");
  //    Serial.print(blau);
  //    Serial.print(" gruen ");
  //    Serial.println(gruen);

  messung_farb = false; // messung erledigt

  fill_solid(RING, NUM_LEDS, CRGB::Black); // LEDS für die Farbmessung ausschalten
  FastLED.show();

  // Auswerten welche Farbe und an Funktion zurückgeben
  if ((rot > gruen) && (rot > blau)) // rot
    return 0;

  else if ((gruen > rot) && (gruen > blau)) // grün
    return 1;

  else if ((blau > gruen) && (blau > rot)) // blau
    return 2;

  else // Farbe nicht eindeutig (Sehr unwahrscheinlich)
    return 3;
}

#include <SoftwareSerial.h>

SoftwareSerial softserial(10, 11); // RX, TX

String inputString = "";     // Speichert eingehende daten
bool stringComplete = false;

void init_Serial()
{
  Serial.begin(115200);

  softserial.begin(4800);
}

void senden(String text)
{
  softserial.println("LOW "); // "LOW " schaltet alle Pins auf LOW
  softserial.println(text);
  delay(10);
}

void auswertung_serial()
{
  while (softserial.available())
  {
    char inChar = (char)softserial.read(); // neues Byte erhalten:
    inputString += inChar;     // zum inputString hinzufügen:

    if (inChar == '\n') // wenn das eingehende Zeichen ein Zeilenumbruch ist, ein Flag setzen
      stringComplete = true;
  }

  if (stringComplete) // Stringcomplete heißt neue Zeile wurde empfangen
  {
    if (inputString.substring(0, 1) == "A")
      messung_farb = true; // Kuka hat Rückmeldung gegeben, dass er am Farbsensor ist

    // else if (inputString.substring(0, 1) == "B");
    // else if (inputString.substring(0, 1) == "C");


    inputString = "";   // String leeren
    stringComplete = false;
  }
}

void auswertung_taster()
{
  static bool wechsel = false; // wechseln zwischen Automatik und Normalbetrieb

  if (Tasterstatus()) // wenn Taster gedrückt
  {
    messung_farb = true;
    messung_waage = true;

    if (wechsel)
    {
      automatik = true;
      wechsel = false;
    }
    else
    {
      automatik = false;
      wechsel = true;
    }
  }
}
bool Tasterstatus() //== Taster ==
{
  static bool Taster_status;      // Flankenerkennung: true = gedrückt

  bool Taster_gedrueckt = !digitalRead(Taster);

  if ((Taster_gedrueckt) && (!Taster_status))   // Taster wurde gedrückt
  {
    Taster_status = true;    // Taster staus true, da gedrückt
    delay(5);                // entprellen
    return true;             // Rückgabeweet für Sollwert
  }

  if ((!Taster_gedrueckt) && (Taster_status)) // Taster wurde losgelassen
  {
    Taster_status = false;   // Taster staus false, da losgelassen
    delay(5);                // entprellen
    return false;            // Rückgabewert für Sollwert
  }
  return false;              // Falls kein Taster gedrückt wurde
}

#include <DFRobot_HX711.h>

#define DOUT 3
#define SCK 5

DFRobot_HX711 waage(DOUT, SCK);

void init_waage()
{
  // Serial.println("Initialisierung Waage");

  //  if (!waage.is_ready())
  //    Serial.println("Waage nicht gefunden");

  waage.setCalibration(1992);
}


void auswertung_waage()
{
  if (messung_waage) // nur Gewicht messen wenn kuka einen würfel sotiert hat
  {
    Serial.print(waage.readWeight());
    Serial.println(" g");

    if (waage.readWeight() >= 3) // Durchschnitt von 10 Messwerten minus des Taragewichts
    {
      if (automatik)
      {
        // senden ("pin 05 OUT HIGH");

      }

      else
      {
        // senden ("LOW "); // Kein Automatikmodus, also alle Pins LOW
        //   d_print("Behaelter voll! \nBitte entleeren und quittieren", 5, 30, 2, true);
        display.clearDisplay();

        display.setTextSize(2);
        display.setTextColor(SSD1306_WHITE);      // Schrift weiss
        display.setCursor(1, 5);                  // position

        display.print(F("Behaelter\n   Voll!"));
        display.setTextSize(1);
        display.setCursor(0, 45);
        display.print(F("Bitte entleeren und  quittieren!"));

        display.display();
        while (!Tasterstatus()); // Erst weiter, wenn Taster gedrückt
      }
    }
    messung_waage = false; // Gewicht wurde gemessen
  }
}

Davon abgesehen:

void d_print(String text, uint8_t x, uint8_t y, uint8_t groesse, boolean clear)
{
  if (clear == true) // will nicht immer das Display komplett löschen
    display.clearDisplay();
  else;
  fest(); // Feste Texte, die immer auf dem Display stehen sollen

bist Du Dir sicher, das das richtig ist?

Denn:

void fest()
{
  display.clearDisplay();
  display.setCursor(0, 0);
  display.setTextColor(SSD1306_WHITE);        // Draw white text

Hi,

Dankeschön. Wusste nicht ob ich den so oder in einzelne Dateien Hochladen soll. Dachte mit einzelnen Dateien wäre es übersichtlicher

Oh, ne das nicht. Ich hatte d_print zeitweise gelöscht und was anderes probiert. Das clearDisplay ist dann dort reingewandert. Gehört dort nicht hin. :smiley:

Mfg

Mir ging es auch um das:

else;

Im Übrigen werde ich aus Deinem fest() nicht schlau.
Aber das liegt vielleicht auch an dem fehlendem Display....

Was macht diese Funktion?

void fest()
{
  display.clearDisplay();

  display.setCursor(0, 0);
  display.setTextColor(SSD1306_WHITE);        // Draw white text

  if (automatik)
  {
    display.print(F("Automatik:"));
    display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
    display.println(" An ");
  }
  else
  {
    display.print(F("Automatik:"));
    display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
    display.println(" Aus ");
  }
}

genau an der Zeile

  display.setTextColor(SSD1306_WHITE);        // Draw white text

wenn doch wenig später:

    display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text

folgt.

Wäre es da nicht angebracht zu kürzen?

void fest()
{
  display.clearDisplay();
  display.setCursor(0, 0);
  display.setTextColor(SSD1306_WHITE);        // Draw white text
  display.print(F("Automatik: "));
  display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
  automatik ? display.println(F("An")) : display.println(F("Aus"));
}

(Nur Logik - ich kann den Code kompilieren, aber nicht laufen lassen.....)

Das fest() fand ich auch etwas blöd. Wusst nur nicht wie ich es anders machen sollte.

Es gibt einen Automatikmodus, wo die Kiste wenn sie voll ist automatisch geleert wird und einen Handbetriebmodus, indem einfach nur gesagt wird die Kiste ist voll. Es soll immer angezeigt werden in welchem Modus man sich befindet, deshalb ist das fest() auch bei jedem print da.

Das war einfach nur weil ich es optisch schön fand. "Automatik" wird da normal gezeichnet und das "An/Aus" mit weißem Hintergrund

Das sieht natürlich deutlich schöner aus.
Aufgeräumt habe ich den Code zu meiner Verteidigung noch nicht. Wollte erstmal diesem blöden Fehler beseitigen.

Mfg

Ich glaube, ich bin auf etwas gestossen:
Ich bekomme beim aufräumen:

redefinition of 'const byte SCK'

Las mir mal ne Minute.

mh, die hatte ich noch nicht.

tu ich :smiley:

Ein Versuch.
Alle defines getauscht.
Wenn trotzdem noch "Display nicht gefunden" ausgegeben wird, wird es schwierig.

// =============================== Arduino 1 ===============================

//== I2C ==
#include <Wire.h>
#include <SPI.h>

const byte I2C_DISPLAY = 0x3C;     // Adresse OLED-Display
const byte I2C_FARBSENSOR = 0x10;  // Adresse Farbsensor

//== I2C Display ==
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, 4);

//== I2C Farbsensor ==
#include "veml6040.h"
VEML6040 Farbsensor;

#include <SoftwareSerial.h>
const byte softSerRX = 10;
const byte softSerTx = 11;
SoftwareSerial softserial(softSerRX, softSerTx); // RX, TX

//== FARBSENSOR LED ==
#include <FastLED.h>
const byte NUM_LEDS = 13;
const byte DATA_PIN = 7;


#include <DFRobot_HX711.h>
const byte hxOut = 3;
const byte hxClk = 5;
DFRobot_HX711 waage(hxOut, hxClk);

const byte Taster = 2; // Taster Pin

CRGB RING[NUM_LEDS];

bool automatik = false;     // flag, um zwischen Automatik und Normal umzuschalten
bool messung_waage = false; // flag, ob Gewichtsmessung schon gemacht wurde
bool messung_farb = false;  // flag, ob Farbmessung schon gemacht wurde
String inputString = "";     // Speichert eingehende daten
bool stringComplete = false;

void setup()
{
  pinMode(Taster, INPUT_PULLUP);
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(RING, NUM_LEDS).setCorrection(TypicalLEDStrip);
  fill_solid(RING, NUM_LEDS, CRGB::Black); // LEDS für die Farbmessung ausschalten
  FastLED.show();
  init_Serial();
  init_farbsensor();
  init_display();
  init_waage();
}

void loop()
{
  auswertung_taster(); // Taster
  auswertung_farbe();  // Farbsensor
  auswertung_waage();  // Waage
}


void init_display()
{
  // Serial.println("Initialisierung Display");
  if (display.begin(SSD1306_SWITCHCAPVCC, I2C_DISPLAY) == false)
    Serial.println(F("ERROR: Display nicht gefunden. Bitte Anschlüsse prüfen!"));
  display.display();
  delay(2000);
  display.clearDisplay();
}

void d_print(String text, uint8_t x, uint8_t y, uint8_t groesse, boolean clear)
{
  if (clear == true) // will nicht immer das Display komplett löschen
    display.clearDisplay();
  else
  {
    fest(); // Feste Texte, die immer auf dem Display stehen sollen
    display.setTextSize(groesse);
    display.setTextColor(SSD1306_WHITE);      // Schrift weiss
    display.setCursor(x, y);                  // position
    display.print(text);
    display.display();
    display.setTextSize(1);                   // Normal 1:1
  }
}

void fest()
{
  display.clearDisplay();
  display.setCursor(0, 0);
  display.setTextColor(SSD1306_WHITE);        // Draw white text
  display.print(F("Automatik: "));
  display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
  automatik ? display.println(F("An")) : display.println(F("Aus"));
}

void init_farbsensor()
{
  // Serial.println("Initialisierung Farbsensor...");
  if (Farbsensor.begin() == false)
    Serial.println("ERROR: Sensor nicht gefunden. Bitte Anschlüsse prüfen!");
  else
    Farbsensor.setConfiguration(VEML6040_IT_80MS + VEML6040_TRIG_ENABLE + VEML6040_AF_FORCE + VEML6040_SD_ENABLE);
}
void auswertung_farbe()
{
  if (messung_farb == true) // nur Messen, falls taster gedrückt
  {
    switch (Farb_Messung()) // Erst Messen, dann ausweten
    {
      case 0: // Rot
        Serial.println("ROT");
        d_print("ROT", 45, 25, 2, true);
        d_print("WUERFEL WIRD SORTIERT ", 0, 50, 1, false);
        // senden ("pin 02 OUT HIGH");
        break;
      case 1: // Grün
        Serial.println("GRUEN");
        d_print("GRUEN", 32, 25, 2, true);
        d_print("WUERFEL WIRD SORTIERT ", 0, 50, 1, false);
        //  senden ("pin 03 OUT HIGH");
        break;
      case 2: // Blau
        Serial.println("BLAU");
        d_print("BLAU", 38, 25, 2, true);
        d_print("WUERFEL WIRD SORTIERT ", 0, 50, 1, false);
        //  senden ("pin 04 OUT HIGH");
        break;
      case 3: // Farbe nicht eindeutig
        Serial.println("FARBE NICHT EINDEUTIG");
        d_print("Ergebnis: \n   NICHT EINDEUTIG!", 0, 30, 1, true);
        //  senden ("LOW "); // Keine Messung erfolt, also alle Pins LOW
        break;
      default: // Messung noch nicht erfolgt
        Serial.println("MESSUNG NICHT ERFOLGT");
        d_print("MESSUNG NICHT ERFOLGT \nODER FEHLGESCHLAGEN", 0, 30, 1, true);
        //  senden ("LOW "); // Keine Messung erfolt, also alle Pins LOW
        break;
    }
    messung_waage = true; // Würfel wurde sortiert, also einmal Gewicht messen
  }
}

uint8_t Farb_Messung()
{
  uint16_t roh_rot[10]   = {0}; // Array für alle Farben anlegen
  uint16_t roh_gruen[10] = {0};
  uint16_t roh_blau[10]  = {0};
  uint16_t rot = 0; // Variablen für durchnittswert
  uint16_t gruen = 0;
  uint16_t blau = 0;
  d_print("Farbmessung...", 10, 30, 1, true);
  fill_solid(RING, NUM_LEDS, CRGB(100, 100, 200)); // LEDS für die Farbmessung einschalten
  FastLED.show();
  for (uint8_t i = 0; i < 10; i++) // Sensor 10x Lesen
  {
    Farbsensor.setConfiguration(VEML6040_IT_80MS + VEML6040_TRIG_ENABLE + VEML6040_AF_FORCE + VEML6040_SD_ENABLE); // muss nach jeder Messung neu definiert werden, da Trigger mode
    delay(90); // warte etwas mehr als 80ms
    roh_rot[i] = Farbsensor.getRed(); // Daten in Array speichern
    roh_blau[i] = Farbsensor.getBlue();
    roh_gruen[i] = Farbsensor.getGreen();
    // Serial.print("ROHDAETN: Rot ");
    // Serial.print(roh_rot[i]);
    // Serial.print(" blau ");
    // Serial.print(roh_gruen[i]);
    // Serial.print(" gruen ");
    // Serial.println(roh_blau[i]);
  }
  for (uint8_t i = 0; i < 10; i++) // Daten aufaddieren
  {
    rot += roh_rot[i];
    blau += roh_blau[i];
    gruen += roh_gruen[i];
  }
  // Sensor mittelwert bilden
  rot = rot / 10;
  gruen = gruen / 10;
  blau = blau / 10;
  //    Serial.print("MITTELWERT: Rot ");
  //    Serial.print(rot);
  //    Serial.print(" blau ");
  //    Serial.print(blau);
  //    Serial.print(" gruen ");
  //    Serial.println(gruen);
  messung_farb = false; // messung erledigt
  fill_solid(RING, NUM_LEDS, CRGB::Black); // LEDS für die Farbmessung ausschalten
  FastLED.show();
  // Auswerten welche Farbe und an Funktion zurückgeben
  if ((rot > gruen) && (rot > blau)) // rot
    return 0;
  else if ((gruen > rot) && (gruen > blau)) // grün
    return 1;
  else if ((blau > gruen) && (blau > rot)) // blau
    return 2;
  else // Farbe nicht eindeutig (Sehr unwahrscheinlich)
    return 3;
}

void init_Serial()
{
  Serial.begin(115200);
  softserial.begin(4800);
}

void senden(String text)
{
  softserial.println("LOW "); // "LOW " schaltet alle Pins auf LOW
  softserial.println(text);
  delay(10);
}

void auswertung_serial()
{
  while (softserial.available())
  {
    char inChar = (char)softserial.read(); // neues Byte erhalten:
    inputString += inChar;     // zum inputString hinzufügen:
    if (inChar == '\n') // wenn das eingehende Zeichen ein Zeilenumbruch ist, ein Flag setzen
      stringComplete = true;
  }
  if (stringComplete) // Stringcomplete heißt neue Zeile wurde empfangen
  {
    if (inputString.substring(0, 1) == "A")
      messung_farb = true; // Kuka hat Rückmeldung gegeben, dass er am Farbsensor ist
    // else if (inputString.substring(0, 1) == "B");
    // else if (inputString.substring(0, 1) == "C");
    inputString = "";   // String leeren
    stringComplete = false;
  }
}

void auswertung_taster()
{
  static bool wechsel = false; // wechseln zwischen Automatik und Normalbetrieb
  if (Tasterstatus()) // wenn Taster gedrückt
  {
    messung_farb = true;
    messung_waage = true;
    if (wechsel)
    {
      automatik = true;
      wechsel = false;
    }
    else
    {
      automatik = false;
      wechsel = true;
    }
  }
}
bool Tasterstatus() //== Taster ==
{
  static bool Taster_status;      // Flankenerkennung: true = gedrückt
  bool Taster_gedrueckt = !digitalRead(Taster);
  if ((Taster_gedrueckt) && (!Taster_status))   // Taster wurde gedrückt
  {
    Taster_status = true;    // Taster staus true, da gedrückt
    delay(5);                // entprellen
    return true;             // Rückgabeweet für Sollwert
  }
  if ((!Taster_gedrueckt) && (Taster_status)) // Taster wurde losgelassen
  {
    Taster_status = false;   // Taster staus false, da losgelassen
    delay(5);                // entprellen
    return false;            // Rückgabewert für Sollwert
  }
  return false;              // Falls kein Taster gedrückt wurde
}

void init_waage()
{
  // Serial.println("Initialisierung Waage");
  //  if (!waage.is_ready())
  //    Serial.println("Waage nicht gefunden");
  waage.setCalibration(1992);
}


void auswertung_waage()
{
  if (messung_waage) // nur Gewicht messen wenn kuka einen würfel sotiert hat
  {
    Serial.print(waage.readWeight());
    Serial.println(" g");
    if (waage.readWeight() >= 3) // Durchschnitt von 10 Messwerten minus des Taragewichts
    {
      if (automatik)
      {
        // senden ("pin 05 OUT HIGH");
      }
      else
      {
        // senden ("LOW "); // Kein Automatikmodus, also alle Pins LOW
        //   d_print("Behaelter voll! \nBitte entleeren und quittieren", 5, 30, 2, true);
        display.clearDisplay();
        display.setTextSize(2);
        display.setTextColor(SSD1306_WHITE);      // Schrift weiss
        display.setCursor(1, 5);                  // position
        display.print(F("Behaelter\n   Voll!"));
        display.setTextSize(1);
        display.setCursor(0, 45);
        display.print(F("Bitte entleeren und  quittieren!"));
        display.display();
        while (!Tasterstatus()); // Erst weiter, wenn Taster gedrückt
      }
    }
    messung_waage = false; // Gewicht wurde gemessen
  }
}

Also Erstmal vielen Dank fürs Helfen :smiley:

aber

23:11:04.805 -> ERROR: Display nicht gefunden. Bitte Anschlüsse prüfen!

:frowning:

Ok,
Du hast das ja schon super geteilt...
Der Display wird ja als vorletztes initialisiert. Fang mal von unten nach oben an auszukommentieren:

  pinMode(Taster, INPUT_PULLUP);
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(RING, NUM_LEDS).setCorrection(TypicalLEDStrip);
  fill_solid(RING, NUM_LEDS, CRGB::Black); // LEDS für die Farbmessung ausschalten
  FastLED.show();
  init_Serial();
//  init_farbsensor();

Geht nicht, dann

  pinMode(Taster, INPUT_PULLUP);
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(RING, NUM_LEDS).setCorrection(TypicalLEDStrip);
  fill_solid(RING, NUM_LEDS, CRGB::Black); // LEDS für die Farbmessung ausschalten
  FastLED.show();
//  init_Serial();
//  init_farbsensor();

geht nicht, dann

  pinMode(Taster, INPUT_PULLUP);
/*
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(RING, NUM_LEDS).setCorrection(TypicalLEDStrip);
  fill_solid(RING, NUM_LEDS, CRGB::Black); // LEDS für die Farbmessung ausschalten
  FastLED.show();
*/
//  init_Serial();
//  init_farbsensor();

Und dann mal schaun...

erledigt. Im Setup steht nur noch init_display()

23:26:04.598 -> ERROR: Display nicht gefunden. Bitte Anschlüsse prüfen!

Ok, dann hast Du ein Beschaltungsproblem.

Kannst Du Bild machen?
Von Oben. Alle Kabel bitte nicht in einer Farbe. Es sollte schon zu erkennen sein, wie es aufgebaut und verbunden ist.

Vorher mal folgendes laufen lassen um zu testen, ob da was erkannt wird:
(HINWEIS: Achtung im Seriellen Monitor ist 115200 eingestellt!)

#include<Wire.h>

void setup(){
  Wire.begin();
  Serial.begin(115200);
  Serial.println("I2C Scanner ist bereit.");
  Serial.println();
}

void loop() {
  scanI2C(100000);
  scanI2C(400000);
//  scanI2C(1000000); // nur aktivieren, wenn der Microcontroller diese Frequenz unterstützt
//  scanI2C(3400000); // nur aktivieren, wenn der Microcontroller diese Frequenz unterstützt
//  scanI2C(5000000); // nur aktivieren, wenn der Microcontroller diese Frequenz unterstützt
  
  Serial.println("****************************");
  Serial.println();
  delay(3000);
}

void scanI2C(long frequency){
  String normal = "standard mode (100 kHz):";
  String fast = "fast mode (400 kHz):";
  String fastPlus = "fast mode plus (1 MHz):";
  String highSpeed = "high speed mode (3.4 MHz):";
  String ultraSpeed = "ultra fast mode (5.0 MHz):";
  String defaultStr = " !!!!! Unzulässige Frequenz !!!!!";
  bool error = true;
  bool addressFound = false;

  Serial.print("Scanne im ");
  switch(frequency){
    case 100000:
      Serial.println(normal);
      break;
    case 400000:
      Serial.println(fast);
      break;
    case 1000000:
      Serial.println(fastPlus);
      break;
    case 3400000:
      Serial.println(highSpeed);
      break;
    case 5000000:
      Serial.println(ultraSpeed);
      break;
    default:
      Serial.println(defaultStr);
      break;
  }
  
  Wire.setClock(frequency);
  for(int i=1; i<128; i++){
    Wire.beginTransmission(i);
    error = Wire.endTransmission();
    if(error == 0){
      addressFound = true;
      Serial.print("0x");
      Serial.println(i,HEX);
    }
  }
  if(!addressFound){
    Serial.println("Keine Adresse erkannt");
  }
  Serial.println();
}

Wenn hier der Display nicht erkannt wird, Kabel tauschen. Alle.

23:37:15.245 -> Scanne im standard mode (100 kHz):
23:37:15.245 -> 0x10
23:37:15.245 -> 0x3C
23:37:15.245 -> 
23:37:15.245 -> Scanne im fast mode (400 kHz):
23:37:15.245 -> 0x10
23:37:15.245 -> 0x3C
23:37:15.245 -> 
23:37:15.245 -> ****************************
23:37:15.245 -> 

Wird beides erkannt.

Da wird man gar nichts erkennen...

Das Gehäuse ist voller Kabel. Aber ich könnte ja mal alles abklemmen und nach und nach wieder dran und dann schauen oder ?

Ok,
dann ist es schick. Ich verzichte auf Bilder :wink:
Las mir mal ne Minute zum nachdenken, was da nicht passen könnte.

sehr gut. Blamage erspart :smiley:

Geht Bei Dir das Beispiel: Datei - Beispiele - Adafruit SSD1306 - SSD1306_128x64?
(HINWEIS: Da ist der SerMon auf 9600 eingestellt!)

Ja, funktioniert.

Könnte es vielleicht sein, dass sich die Bibliotheken selber irgendwo beißen ? Also die Funktionen ?

Da will ich hinkommen.
Wir wissen, das der Display da ist. - 0x3c
Wir wissen, das der auch läuft.. .

Vom Prinzip her müsste Dein Code jetzt komplett entkernt werden, sodas nur noch der Farbsensor und der Display initialisiert werden und irgendwas ausgeben...

Und ganz viele Serielle Ausgaben. Nach jedem Schritt in der InitKette eine Ausgabe. Damit liesse sich das einkreisen....

Für mich ist heute aber Schluß.

Beste Grüße - man liest sich.