I2C Display Compiler fehler? Speicherfehler?

Hallo zusammen,
ich habe ein seltsames Problem mit einem 128x64 Display an einem classischen Uno. Das Display wurde an der I2C Schnittstelle angeschlossen, aus dem Internet ein Bsp-Code heruntergeladen.
Compilieren, hochladen, das Programm tut was es soll.
Danach fange ich an die Textbausteine (nur anderer Text) im Programm zu verändern.
Alles Prima das Display zeigt, den veränderten Text an.
Ich versuche eine erneute Änderung des Textes. Nun zeigt das Display die Veränderungen nicht mehr an sondern den alten Text.
Ich spiele den Blink-Sketch auf den Uno. Er funktioniert. Ein weiteres Programm, es funktioniert.
Danach spiele sich wieder den Textdisplaycode auf. Der letzte Text steht wieder dort, obwohl der Code etwas anderes sagt.
Ich füge in den Code eine Zeile Serial.println(“check”) ein. Das Programm zeigt den falschen Text, schreibt aber fleissig im Serial-Monitor “check”. Strom trennen, resetten, booten des PCs, sketche umbenennen, neune sketch erstellen + code reinkopieren, alles bringt nichts.
Ich habe auch das Verzeichnis mit der hex.datei die hochgeladen wird, gelöscht, alles wieder neu gemacht. Das Problem bleibt bestehen.
Hat jemand schon mal ein ähnliches Problem gehabt?

VG
Drberie

Das Display:

0,96 Zoll Arduino OLED Display SSD1306 Weiss 128x64 I2C/IIC Modul

Mein Uno:
BN: Arduino/Genuino Uno
VID: 2341
PID: 0043
SN: 5573532363535151C181

Displayklein2.ino (1006 Bytes)

Hallo,

funktioniert das?

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

#define OLED_RESET 4 // not used / nicht genutzt bei diesem Display
Adafruit_SSD1306 display(OLED_RESET);

void setup()   {                

  // initialize with the I2C addr 0x3C / mit I2C-Adresse 0x3c initialisieren
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  
  // random start seed / zufälligen Startwert für Random-Funtionen initialisieren
 Serial.begin(9600); 

 #define DRAW_DELAY 118
 #define D_NUM 47

 display.clearDisplay();
 display.setTextColor(WHITE);
 display.setTextSize(2);
}

void loop() {
  
  display.setCursor(1,0);
  display.print("TEXT eins");
  delay(2000);
  
  display.setCursor(1,0);
  display.print("TEXT zwei");
  delay(2000);
  
  display.setCursor(1,0);
  display.print("TEXT drei");
  delay(2000);
  
}

Setze den bitte in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar, auch mobile Geräte.

Wenn du auf dem Display Text anzeigen willst, musst du den auch auf das Display schreiben.

Hallo Doc_Arduino,
vielen Dank für die schnelle Rückmeldung.
Ich hatte zwischenzeitlich den Rechner im Ruhemodus und den Uno abgestöpselt. Nach dem Wiedereinschalten sehe ich nur Pünktchen auf dem ganzen Display. Den Code habe ich ausprobiert. Er lässt sich compilieren und auf das Board laden. Keine Fehlermeldungen.
Folgende Rückmeldung erhalte ich:

"avrdude: 13062 bytes of flash written
avrdude: verifying flash memory against C:\Users\Kunden\AppData\Local\Temp\arduino_build_960658/sketch_dec14c.ino.hex:
avrdude: load data flash data from input file C:\Users\Kunden\AppData\Local\Temp\arduino_build_960658/sketch_dec14c.ino.hex:
avrdude: input file C:\Users\Kunden\AppData\Local\Temp\arduino_build_960658/sketch_dec14c.ino.hex contains 13062 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 1.68s

avrdude: verifying ...
avrdude: 13062 bytes of flash verified

avrdude done. Thank you."

Leider sehe ich auf dem Display wieder das gleiche Muster.

Irgendwas scheint kaputt gegangen zu sein, ich frage mich nur was.
Gruß,
Drberie

Ich wiederhole mich gern noch mal....auch wenn du nicht meiner Bitte nachkommst.

In deinem geposteten Sketch, den man übrigens mobil nicht lesen kann, schreibst du keinen Text auf das Display.

Das ist für mich "dein Fehler" !

Anbei nochmal der Code, er unterscheidet sich nicht wesentlich, von dem Beispiel-Code von Doc_Arduino,

da das Display mittlerweile nur Pünktchen anzeigt, vermute ich einen Hardwaredefekt.
Vor 2h habe ich Text auf dem Display erkennen können, leider hat sich der nicht mit dem Text gedeckt, den ich im Programm geschrieben habe.

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

#define OLED_RESET 4 // not used / nicht genutzt bei diesem Display
Adafruit_SSD1306 display(OLED_RESET);

void setup()   {                

  // initialize with the I2C addr 0x3C / mit I2C-Adresse 0x3c initialisieren
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  
  // random start seed / zufälligen Startwert für Random-Funtionen initialisieren
 Serial.begin(9600); 
}

#define DRAW_DELAY 118
#define D_NUM 47

int i;

void loop() {
  
  display.clearDisplay();
  
  // set text color / Textfarbe setzen
  display.setTextColor(WHITE);
  // set text size / Textgroesse setzen
  display.setTextSize(2);
  // set text cursor position / Textstartposition einstellen
  display.setCursor(1,0);
  // show text / Text anzeigen
  //display.println("Das ist ein Display");
 
 
  delay(8000);
  display.clearDisplay();
  
 
  delay(1000); 
  Serial.println("check");
  
}

Hallo,

nimm mal alles vom Strom. Arduino und Display. Überprüfe nochmal die Verkabelung. Kann auch sein das Display veträgt nur 3,3V. Muss in der Adafruit Anleitung stehen. Es gibt gefühlt tausende Displaytypen und Modelle. Wenn das Display vom Arduino versorgt wird, dann eben alles anstecken, wenn es getrennt versorgt wird erst Display dann Arduino mit Spannung versorgen. Falls es sich zickig verhält. Massen vorher verbinden. Sind hoffentlich verbunden.

Wenn ich von deinem letzten Sketch die Kommentarzeilen rausnehme bleibt nichts übrig was da auf das Display schreiben soll.

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

#define OLED_RESET 4 // not used / nicht genutzt bei diesem Display
Adafruit_SSD1306 display(OLED_RESET);

void setup()   {               
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
 
  Serial.begin(9600);
}

#define DRAW_DELAY 118
#define D_NUM 47

void loop() {
 
  display.clearDisplay();
 
  display.setTextColor(WHITE);
  
  display.setTextSize(2);
  
  display.setCursor(1,0);
  
  delay(8000);
  display.clearDisplay();
 
  delay(1000);
  Serial.println("check");
}

Da passiert nichts außer Display löschen und Textgröße + Farbe einstellen. Das macht man nicht ständig, sondern nur einmal im setup, deswegen habe ich das dort hinverlagert. “check” landet im seriellen Monitor.

Wenn mit meinem Sketch nichts passiert nach Spannung weg und wieder an, dann teste bitte erstmal die Bsp. Sketche von der Lib. Prüfe laut Anleitung die I2C Adresse? Nutze den I2C Scanner wegen der richtigen Adresse. Aus den tiefen des Forums.

//    FILE: MultiSpeedI2CScanner.ino
//  AUTHOR: Rob Tillaart
// VERSION: 0.1.06
// PURPOSE: I2C scanner @different speeds
//    DATE: 2013-11-05
//     URL: http://forum.arduino.cc/index.php?topic=197360
//
// Released to the public domain

#include <Wire.h>
#include <Arduino.h>

const char version[] = "0.1.06";

// scans devices from 50 to 800KHz I2C speeds.
// lower than 50 is not possible
// DS3231 RTC works on 800 KHz. TWBR = 2; (?)
const long allSpeed[] = {
  50, 100, 200, 250, 400, 500, 800
};
long speed[sizeof(allSpeed) / sizeof(allSpeed[0])];
int speeds;

int addressStart = 0;
int addressEnd = 127;

// DELAY BETWEEN TESTS
#define RESTORE_LATENCY  5    // for delay between tests of found devices.
bool delayFlag = false;

// MINIMIZE OUTPUT
bool printAll = true;
bool header = true;

// STATE MACHINE
enum states {
  STOP, ONCE, CONT, HELP
};
states state = STOP;

uint32_t startScan;
uint32_t stopScan;

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  setSpeed('0');
  displayHelp();
}


void loop()
{
  char command = getCommand();
  switch (command)
  {
    case 's':
      state = ONCE;
      break;
    case 'c':
      state = CONT;
      break;
    case 'd':
      delayFlag = !delayFlag;
      Serial.print(F("<delay="));
      Serial.println(delayFlag ? F("5>") : F("0>"));
      break;

    case 'e':
      // eeprom test TODO
      break;

    case 'h':
      header = !header;
      Serial.print(F("<header="));
      Serial.println(header ? F("yes>") : F("no>"));
      break;
    case 'p':
      printAll = !printAll;
      Serial.print(F("<print="));
      Serial.println(printAll ? F("all>") : F("found>"));
      break;

    case '0':
    case '1':
    case '2':
    case '4':
    case '8':
      setSpeed(command);
      break;

    case 'a':
      setAddress();
      break;

    case 'q':
    case '?':
      state = HELP;
      break;
    default:
      break;
  }

  switch (state)
  {
    case ONCE:
      I2Cscan();
      state = HELP;
      break;
    case CONT:
      I2Cscan();
      delay(1000);
      break;
    case HELP:
      displayHelp();
      state = STOP;
      break;
    case STOP:
      break;
    default: // ignore all non commands
      break;
  }
}


void setAddress()
{
  if (addressStart == 0)
  {
    addressStart = 8;
    addressEnd = 120;
  }
  else
  {
    addressStart = 0;
    addressEnd = 127;
  }
  Serial.print(F("<address Range = "));
  Serial.print(addressStart);
  Serial.print(F(".."));
  Serial.print(addressEnd);
  Serial.println(F(">"));

}

void setSpeed(char sp)
{
  switch (sp)
  {
    case '1':
      speed[0] = 100;
      speeds = 1;
      break;
    case '2':
      speed[0] = 200;
      speeds = 1;
      break;
    case '4':
      speed[0] = 400;
      speeds = 1;
      break;
    case '8':
      speed[0] = 800;
      speeds = 1;
      break;
    case '0':  // reset
      speeds = sizeof(allSpeed) / sizeof(allSpeed[0]);
      for (int i = 0; i < speeds; i++)
      {
        speed[i] = allSpeed[i];
      }
      break;
  }
}

char getCommand()
{
  char c = '\0';
  if (Serial.available())
  {
    c = Serial.read();
  }
  return c;
}

void displayHelp()
{
  Serial.print(F("\nArduino I2C Scanner - "));
  Serial.println(version);
  Serial.println();
  Serial.println(F("Scanmode:"));
  Serial.println(F("\ts = single scan"));
  Serial.println(F("\tc = continuous scan - 1 second delay"));
  Serial.println(F("\tq = quit continuous scan"));
  Serial.println(F("\td = toggle latency delay between successful tests. 0 - 5 ms"));
  Serial.println(F("Output:"));
  Serial.println(F("\tp = toggle printAll - printFound."));
  Serial.println(F("\th = toggle header - noHeader."));
  Serial.println(F("\ta = toggle address range, 0..127 - 8..120"));
  Serial.println(F("Speeds:"));
  Serial.println(F("\t0 = 50 - 800 Khz"));
  Serial.println(F("\t1 = 100 KHz only"));
  Serial.println(F("\t2 = 200 KHz only"));
  Serial.println(F("\t4 = 400 KHz only"));
  Serial.println(F("\t8 = 800 KHz only"));
  Serial.println(F("\n\t? = help - this page"));
  Serial.println();
}


void I2Cscan()
{
  startScan = millis();
  uint8_t count = 0;

  if (header)
  {
    Serial.print(F("TIME\tDEC\tHEX\t"));
    for (uint8_t s = 0; s < speeds; s++)
    {
      Serial.print(F("\t"));
      Serial.print(speed[s]);
    }
    Serial.println(F("\t[KHz]"));
    for (uint8_t s = 0; s < speeds + 5; s++)
    {
      Serial.print(F("--------"));
    }
    Serial.println();
  }

  // TEST
  // 0.1.04: tests only address range 8..120
  // --------------------------------------------
  // Address  R/W Bit Description
  // 0000 000   0 General call address
  // 0000 000   1 START byte
  // 0000 001   X CBUS address
  // 0000 010   X reserved - different bus format
  // 0000 011   X reserved - future purposes
  // 0000 1XX   X High Speed master code
  // 1111 1XX   X reserved - future purposes
  // 1111 0XX   X 10-bit slave addressing
  for (uint8_t address = addressStart; address <= addressEnd; address++)
  {
    bool printLine = printAll;
    bool found[speeds];
    bool fnd = false;

    for (uint8_t s = 0; s < speeds ; s++)
    {
#if ARDUINO >= 158
      Wire.setClock(speed[s] * 1000);
#else
      TWBR = (F_CPU / (speed[s] * 1000) - 16) / 2;
#endif
      Wire.beginTransmission (address);
      found[s] = (Wire.endTransmission () == 0);
      fnd |= found[s];
      // give device 5 millis
      if (fnd && delayFlag) delay(RESTORE_LATENCY);
    }

    if (fnd) count++;
    printLine |= fnd;

    if (printLine)
    {
      Serial.print(millis());
      Serial.print(F("\t"));
      Serial.print(address, DEC);
      Serial.print(F("\t0x"));
      if (address < 0x10) Serial.print(0, HEX);
      Serial.print(address, HEX);
      Serial.print(F("\t"));

      for (uint8_t s = 0; s < speeds ; s++)
      {
        Serial.print(F("\t"));
        Serial.print(found[s] ? F("V") : F("."));
      }
      Serial.println();
    }
  }

  stopScan = millis();
  if (header)
  {
    Serial.println();
    Serial.print(count);
    Serial.print(F(" devices found in "));
    Serial.print(stopScan - startScan);
    Serial.println(F(" milliseconds."));
  }
}

drberie:
Anbei nochmal der Code, er unterscheidet sich nicht wesentlich, von dem Beispiel-Code von Doc_Arduino,

da das Display mittlerweile nur Pünktchen anzeigt, vermute ich einen Hardwaredefekt.
Vor 2h habe ich Text auf dem Display erkennen können, leider hat sich der nicht mit dem Text gedeckt, den ich im Programm geschrieben habe.

Liest du eigentlich die Beiträge die dir geschrieben werden ?

In deinem Sketch ist immer noch der Fehler, dass nichts auf das Display geschrieben wird.

Hallo zusammen und vielen Dank für die Hilfe,
ich denke das Problem wird ungelöst bleiben.

Ich habe mittlerweile alles ausprobiert, was Doc_Arduino mir vorgeschlagen hat. Strom weg, 3,3V ausprobiert (Anleitung habe ich keine bekommen) Display funktioniert (zeigt Pünktchen) aber macht nicht was es soll. Zeigt den gleichen Pünktchensalat. Das Display wir über den Uno mit Strom versorgt.
Die I2C-Adresse habe ich geprüft, die stimmt auch mit dem Code überein.

Es ist richtig, dass bei meinem Programm, das Display schwarz bleiben müsste, tut es aber nicht.
Bei allen anderen Beispielprogrammen, die ich hochlade oder hochgeladen habe, sehe ich seit gestern Abend nur Pünktchen.

Komischerweise, hat das Display gestern Mittag mit dem Beispielcode aus dem Internet problemlos funktioniert.
Danach habe ich lediglich den Text im bestehenden funktionierenden Programm verändert. Das hat auch noch funktioniert. Der geänderte Text wurde nach dem Hochladen angezeigt (Anzeigetext 2).

Eine weitere Anpassung des Textes habe ich gemacht, da ich mich vertippt hatte (ein Buchstabe zuviel), nennen wir diesen Text man Anzeigetext 3.

Nach dem Hochladen sehe ich Anzeigetext2. Dieser Text wurde dann bis gestern Abend immer angezeigt, wenn ich das Display genutzt habe, egal was im Sketch vorgegeben wurde.
Auch wenn ich das ursprüngliche Beispielprogramm, das anfänglich funktioniert hatte, verwendet habe.
Als ich nicht weiterkam , habe ich Blink hochgeladen und ausgeführt, danach ein Beispielprogramm zum Auslesen einer analogen Schnittstelle. Beide Programme haben funktioniert. Das Display blieb schwarz, wurde ja auch nicht angesteuert.
Als ich dann wieder das Beispielprogramm aus dem Internet hochgeladen habe, sah ich auf dem Display wieder den Anzeigetext2 mit meinem Rechtschreibfehler. Das hat mich sehr stutzig gemacht. Woher kam dieser Text.

Okay das ist richtig, der Sketch, den ich hier gepostet habe, zeigt keinen Text. Zumindest hätte aber das Display schwarz bleiben müssen. Oder? Leider war Anzeigetext2 zu sehen. Komisch oder?
Danach habe ich aufgegeben und ein paar Stunden gewartet.
Nach dem Wiedereinschalten, war Anzeigetext2 verschwunden bzw. durch weiße Pünktchen ersetzt. Seither erscheinen auf dem Display weiße Pünktchen (ca. 50% des Bilschirmes sind gefüllt). Das bleibt relativ konstant, egal was ich mache. An-, Ausschalten, resetten, sketch A, B, C oder D, ich sehe immer das gleiche Bild.

Es bleibt für mich ein sehr seltsames Problem.
Ich werde das Teil jetzt am RPi testen und ggf. entsorgen.
Vielen Dank für eure Unterstützung,
VG
Drberie

Du sollst einfach nur am Anfang dieser Zeile

 //display.println("Das ist ein Display");

die // entfernen.

Poste mal Deinen aktuellen Sketch und und Foto der Ausgabe auf dem Display.

Moko:
Du sollst einfach nur am Anfang dieser Zeile

 //display.println("Das ist ein Display");

die // entfernen.

Poste mal Deinen aktuellen Sketch und und Foto der Ausgabe auf dem Display.

Das reicht nicht, auch das "println" durch "print" ersetzen.
Sonnst macht das Display weiter Mist.

HotSystems:
Das reicht nicht, auch das "println" durch "print" ersetzen.
Sonnst macht das Display weiter Mist.

Sorry, hast natürlich Recht.

Hallo,

ich würde einmal behaupten der TO hat die Sketche völlig durcheinander gebracht oder fummelt immer gleich drin rum ohne zu wissen was er tut. Was war der erste Sketch der funktionierte? Ich habe mir auch einmal die Lib runtergeladen und muss feststellen das hier nichts mit einem Bsp. übereinstimmt bezogen auf die Display Konfiguration. Also nimm bitte den Bsp. Sketch "ssd1306_128x64_i2c". Wenn die Verkabelung stimmt dann funktioniert der auch. Ich glaube nicht das das Display defekt ist.