ESP8266 & OLED HW-364A: I²C-Probleme gelöst – warum D2/D1 hier nicht funktionieren!

Hi, hattest du auch schon mal Probleme mit dem OLED HW-364A am ESP8266?

Dann willkommen im Club – ich hab mir stundenlang den Kopf zerbrutzelt, bis ich das geschnallt hab. Damit du dir das sparst: Hier mein Erfahrungsbericht, kurz und schmerzlos. 😅


TL;DR

Beim ESP8266 0.96″ OLED HW-364A ist das OLED fest auf I²C an D6/D5 (GPIO14/12) verdrahtet – nicht auf den üblichen D2/D1!
Wenn du andere I²C-Geräte auf denselben Bus quetschst oder alles auf D2/D1 umlenkst, hängt oder bootet der ESP nicht sauber.

Lösung: OLED auf seinem festen Bus lassen, für alle weiteren I²C-Geräte (Sensoren, Keypad usw.) einfach einen zweiten I²C-Bus anlegen – per Laufzeitumschaltung von Wire, ganz ohne Extra-Bibliothek.


Verkabelung (getrennte Busse = stabiles Leben)

Bus 1 – OLED (nicht anfassen!)

  • SDA → D6 (GPIO14)
  • SCL → D5 (GPIO12)
  • Adresse: 0x3C

📌 Pullups sind meistens auf dem OLED-Modul schon drauf.

Wire.begin(14, 12);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

Bus 2 – Externer I²C (für PCF8574, Sensoren etc.)

  • SDA → D7 (GPIO13)
  • SCL → D4 (GPIO2)

❗ WICHTIG: GPIO2 (D4) muss beim Boot HIGH sein. Also bitte keine Last auf GND dort.


Beispiel: PCF8574 Keypad

  • Adressen: 0x20–0x27 (PCF8574), 0x38–0x3F (PCF8574A)
  • INT-Pin: unbenutzt lassen (einfach offen)
  • Keypad-Matrix:
1 2 3 A
4 5 6 B
7 8 9 C
* 0 # D

📌 Mapping:
Columns = P4–P7
Rows = P0–P3
(Beim Lesen: Row-Bit maskieren, sonst kommt Quatsch raus.)


Warum das alles nötig ist

  1. Das HW-364A hat festverdrahtetes OLED
    – auf GPIO14/12. Andere Beispiele mit D2/D1? Leider falsch für dieses Board.
  2. Zweiter I²C-Bus ist Pflicht
    – sonst knallt’s bei Pullups, Pegeln und Reset.
  3. Wire.begin() ist dein Freund
    – ESP8266 macht I²C eh softwarebasiert. Einfach Bus umschalten, kein SoftwareWire-Murks nötig.
  4. Keypad will sauber gescannt werden
    – Nur eine Row auf LOW, dann Spalten einlesen, Row-Bit rausfiltern.

Minimaler Bus-Switch-Code:

inline void selectBusOLED() { Wire.begin(14, 12); Wire.setClock(100000); }
inline void selectBusPCF()  { Wire.begin(13,  2); Wire.setClock(100000); }

void setup() {
  selectBusOLED();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  selectBusPCF();
  // pcf8574.begin(…); oder Adressen scannen
}

char readKey() {
  selectBusPCF();
  char k = // Taste lesen…
  selectBusOLED();
  return k;
}

Troubleshooting

Problem Lösung
PCF wird nicht erkannt Ist’s vielleicht ein PCF8574A? → andere Adressen!
Immer Taste „1“ gedrückt? Rows/Cols vertauscht? Richtig: C = P4–P7, R = P0–P3 + Bitmaske setzen!
ESP bootet nicht mehr Achtung: GPIO2 (D4) muss beim Start HIGH sein!

Merksatz:

„OLED bleibt auf D6/D5. Alles andere bekommt eigene Leitungen. Wire-Bus beim Zugriff kurz umschalten.“

Viel Spaß beim Basteln und Fehler vermeiden! 😎

Nach oben scrollen