ESP8266 OLED PCF8563T - DIY Uhr

Hallo zusammen,
ich hatte mir irgendwann mal zum Spaß ein paar
ESP8266 0,96 inch OLED Display Modul ESP12F LCD Screen WiFi Uhr Modul DIY Wetter Prognose IIC I2C Interface für Arduino
bestellt.
Mir gefiel die kompakte Bauweise und dass man die ESP´s neu bespielen kann.

Also Board und Display getrennt (Schraub- + Steckverbindung), einen FT232 und einen Schalter zwischen IO 0 & GND aufgesteckt.
Und siehe da: Er redet mit mir und lässt sich beschreiben :slight_smile:

Allerdings habe ich noch keine Kommunikation mit dem OLED hinbekommen.
Im Beispiel-Sketch "ssd1306_128x64_i2c" habe ich verschiedenste Adressen ausprobiert. Auch ein I2C-Scan hat kein Ergebnis gebracht

Wire.beginTransmission(1..127);
error = Wire.endTransmission();

Laut Beschreibung ist es ein ESP-12F mit 4MB. Habe nur ein NodeMCU mit ESP-12E im Boardmanager gefunden, der mir am nächsten dran erschien. Aber auch beim "generic ESP8266" sind die Pins:
SDA: 4, SCL: 5 - wie mir das Pinout für den 12F auch bestätigt.
Bleibt doch eigentlich nur die Adresse?!

Weiterhin fehlt mir noch wie ich das Clock-Modul PCF8563T ansprechen kann :sweat_smile:
Das hat doch ebenfalls eine I2C Schnittstelle mit unbekannter Adresse. Und optional wohl noch einen Interrupt-Pin...
Vielleicht hat ja Jemand von Euch bereits Erfahrungen damit gesammelt oder Euer geschultes Auge erkennt aus der Ferne bereits woran es hapert :innocent:

Eine "Anleitung" gibt es hier. Die ist aber äußerst übersichtlich...

Display
IMG_20211005_115052
Board Unterseite

Fänd´s super, die Dinger zum laufen zu bekommen. Die kosten ~5€ und sind über alle bekannten Kanäle zu erwerben.

Du musst im Sketch ein "wire.begin(pins)" die I2C-Pins am ESP8266 mit angeben.

Du könntest, falls Du hast, das Display der einfachheit halber mal an nen Uno oder so anschliessen und da dann den i2C Schanner drüber rennen lassen. Da sind ja schonmal SDA und SCL definitiv bekannt und der i2c-Scanner läuft da auch sicher zuverlässig. so kannst Du schonmal die Adresse exact feststellen und damit diese Fehlerquelle ausschlieesen. und mit nem einfachen oled-Beispiel kannst Du dann auch noch testen, ob das Display funktioniert und auch auf die vom Scanner ausgegebene Adresse reagiert. Danach kanns du dann schauen, warum es aufm ESP nicht will.
Naturlich kannst du auch das Uhr-Modul mit dem Scanner auf seine Adresse(n) überprüfen, ob und was da kommt.

1 Like

Welche Library verwendest du für dein Oled ?
Meine letzten Tests habe ich mit der U8g2lib durchgeführt.
Nach diesem Beispiel (Auszug) ohne loop():

#include <U8g2lib.h>
#include <Wire.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R2);

void setup(void) {
  u8g2.begin();
  Wire.begin(4,5);
}

Was die RTC PCF8563 betrifft, findest du bei https://github.com/orbitalair/Rtc_Pcf8563 weitere Informationen.

Das hat leider keinen Unterschied gemacht. Wenn man dort explizit nichts mitgibt, fällt der ja auf die SDA & SCL Konstanten zurück.

Also die Idee von @Deltaflyer verfolgt und Tadaaaaa: Es wird per Nano die Addresse 0x3C gefunden!
Sketch angepasst und das Display läuft!

Also alles zurück auf den ESP. Es geht nach wie vor nicht.

No I2C devices found

Sketch:

void I2CScan()
{
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  Serial.println("SDA: " + String(SDA));
  Serial.println("SCL: " + String(SCL));
  Wire.begin(SDA, SCL);
  nDevices = 0;
  for (address = 1; address < 127; address++) {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.print(address, HEX);
      Serial.println(" !");
      nDevices++;
    }
    else if (error == 4) {
      Serial.print("Unknown error at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);
    }
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
  delay(5000); // wait 5 seconds for next scan
}

Habe also einmal durchgemessen und SCL liegt auf GPIO14, was PIN5 entsprechen sollte. SDA liegt auf GPIO16, was dann PIN4 bedeutet. Also genau dem, was auch über die Board-Definition kommt.
ESP-12f specification

Wie eingangs geschrieben, verwende ich das SSD1306 Beispiel:

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET     -1//4 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Serial.begin(115200);
  //Wire.begin(SCL, SDA);

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

  Serial.println("Start!");

  display.display();
  [...]
}

Zumindest komme ich auch über den "Start!" hinaus.
Ob mit Wire.begin(5,4), den Konstanten SCL & SDA oder ohne, kein Ergebnis. Weder das Display zeigt was an, noch findet I2CScan() etwas.

Ok, das wundert mich.
Allerdings habe ich es mit dem Adafruit-Treiber aucvh noch nie probiert.
Der U8g2lib-Treiber funktioniert hervorragend mit den ESP8266. Nur dafür war auch mein Beispiel.

Moment, du hast die I2C-Verbindungen auf den oben genannten Pins gemessen ?
Dann musst du auch die GPIO-Nummern angeben. Für SCL=14, für SDA=16.
Und zwar im wire.begin !

Da hilft dir die andere Angabe nicht.

Hallo,
ich hab jetzt für SCREEN_WIDTH und SCREEN_HIGHT nichts in Deinem Sketch gefunden

schau Dir mal das beispiel aus der Lib an ssd1306_124X64

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

OLDED_RESET habe ich immer auf -1 stehen
Heinz

Hatte ganz stumpf den Durchgang gemessen und im Datasheet geschaut welcher Pin auf dem ESP am SDA und welcher am SCL vom Display rauskommt.

Allerdings tut sich auch mit Wire.begin(14,16) nichts. Weder reagiert das Display, noch gibt es was bei beginTransmission / endTransmission auf die nun bekannte Adresse 0x3C zurück.
Echt seltsam, da das Display natürlich vor meinem ersten Flashen hervorragend am ESP funktioniert hat. Ein Hardwaredefekt ist daher recht unwahrscheinlich.

Denke für heute muss das reichen, ich gehe morgen nochmal mit neuem Elan an die Sache ran :muscle:t2:

Sehr merkwürdig das Ganze.....
Einen "normalen" ESP8266 als Wemos o.ä. hast du nicht zufällig ?

Hallo,
hier habe ich einen Schaltplan gefunden und der zeigt sehr seltsames. Der I2C-Bus wurde aufgeteilt für das Oled und die RTC. Und SCL für das Display ist GPIO14 GPIO5 und SDA GPIO12 GPIO4, also nicht wie du es ausgemessen hast.
Das solltest du ändern.

Und es wird noch etwas umständlicher deine RTC anzusprechen, da du 2 Wire Instanzen aufbauen musst. Oder du versuchst beide auf einen Bus zu bringen.

1 Like

Ui, das schaut ja wirklich spannend aus :roll_eyes:
Also müsste ich dann für die Uhr noch eine Adresse finden. Aber die interessiert mich erstmal nur sekundär (mein Anspruch ist aber natürlich perspektivisch das ganze Teil nutzen zu können).
Probiere ich morgen früh direkt mal mit der 12 aus!
Die Pins lagen exakt nebeneinander und das Datasheet für den ESP-12F hat mir die 16 ausgeworfen. Aber das sehen wir dann ja.

Dir erstmal vielen Dank, dass Du Dich auch am Thema festgebissen hast :smiley:

Gerne, da ich viel mit dem ESP8266 mache, interessiert mich das auch und konnte mir so nicht denken, wo der Fehler liegt.

Und hier gibt es Tipps für 2 Wire-Instanzen.

Das gibt es doch nicht! Es will einfach nicht :face_with_raised_eyebrow:

Nochmal den Durchgang geprüft:
Kniet nieder vor meinen MS Paint-Fähigkeiten :crazy_face:


Der 6. v.l. geht auf SDA
Der 5. v.l. geht auf SCL

Also nochmal speziell nach DOITING, der als Hersteller auf dem Chip steht, gesucht und wir sind wieder am Anfang:
grafik
Offenbar ist ESP-12F nicht gleich ESP12-F. Z.B. die Wemos unterscheiden sich etwas vom Layout und dem Pinout.

Auf dem von Dir verlinkten Schaltplan ist es aber genauso, das OLED ist auf SCL2 und SDA2 verlinkt. Die wiederum sind GPIO5 & 4.
Also alles nochmal zurück und siehe da: Ich bekomme vom ESP ein Lebenszeichen:
I2C device found at address 0x3C
Das Display tut aber nix...

Meine Testfunktionen alle rausgeworfen, nur noch den SSD1306 Beispiel-Sketch + Wire.begin(5, 4); drin.
Und es klappt :astonished:
WTF habe ich denn da die ganze Zeit gemacht?! Das kann ja eigentlich nur ein Wackler/Kabelbruch von den Dupont-Verbindungen gewesen sein :see_no_evil:
Ich werd bekloppt!

Lt. dem Ali-Datenblatt ist die RTC auf SD1 & SCL1 gelegt. Also 14 & 12. Bisher keine Reaktion, aber das teste ich mal in Ruhe. Die Zeit gibt es ja auch erstmal im Internet :wink:

Das ist doch schon mal super, wenn es geht.
Alles andere findet sich und ja, die Zeit geht per WLan.
Sorry, dass ich dich da verwirrt habe. Hatte mich im Schaltplan versehen.
War doch schon zu spät. :wink:

Edit:
Ein Problem gibt es wohl mit der 2. Instanz.
Das hatte ich gestern mal getestet und kam zu keinem vernünftigen Ergebnis.

Mein Tipp, wenn du die RTC verwenden willst/musst, dann versuche den I2C-Bus auch auf GPIO4 und 5 zu legen. Das wird einfacher.
Zudem ist die RTC nicht sehr genau, da ist die Nutzung von NTP über Wlan genauer.

Gestern noch mal schnell eine super simple Hülle entworfen und gedruckt:

Stelle ich damnächst bei Thingiverse rein, wer es selbst nachdrucken will.
Ist jedoch eine Fummelei den ESP dort wieder heraus zu bekommen. Alles wird in einander gesteckt und sitzt so spack, dass nix wackelt.
Per OTA braucht man ja auch eigentlich nicht mehr dran.
Aprospos: Wie zieht Ihr dann Dateien (HTML, CSS & JS) auf den ESP? Einmalig eine Seite mit "Upload"-Button veröffentlichen? Webserver erstellen und per Postman die Dateien pushen?
Was funktioniert am effektivsten? Gerade zu Beginn tauscht man die ja doch etwas häufiger...

Ist echt mini, das kleine Kerlchen!

Es scheint ja jetzt alles zu funktionieren ?

Dann schau dir mal die Seite von Fips an.

Ja, bis auf das RTC Modul. Aber das brauche ich aktuell nicht.
Da gehe ich vielleicht nochmal ran, wenn ich Langeweile habe :wink:

Jut, also Variante 1 mit der Seite und Upload.
Wobei das ja nicht ausschließt ein CURL-Script o.ä. zu bauen, welches mir automatisch den Inhalt eines Ordners synchronisiert :thinking:
Glaube das ist gerade am Anfang eleganter als über den Browser einzeln die Dateien zu pushen.
Werde mal was basteln :muscle:t2:

Hallo,
wenn Du OTA drauf hast geht es doch auch mit der IDE so als wenn das Ding am USB hängt mittels Sketch Daten Upload. Geht allerdings nur dann wenn nicht noch andere aktuelle Daten auf dem Filesystem des ESP liegen. Die würden ja ansonsten mit gelöscht/überschrieben.
Heinz

1 Like

Ich baue den Dateimanager von Fips mit ein.

Gruß Tommy