Zum Inhalt springen

DimmerLink wird auf I2C nicht erkannt: Problem mit UART-Standardmodus

DimmerLink wird im UART-Modus ausgeliefert und erscheint erst nach explizitem Umschalten bei einem I2C-Bus-Scan. Das Anschließen im UART-Modus kann die I2C-Bus-Leitungen auf Low ziehen und den Scanner blockieren. Dieser Artikel beschreibt die korrekte Umschaltprozedur und die erforderliche Pull-up-Verdrahtung.

Kurzfassung: DimmerLink wird ab Werk im UART-Modus ausgeliefert. i2cdetect zeigt die Adresse 0x50 nicht an, bis Sie den SWITCH_I2C-Befehl (02 5B) über UART bei 115200 Baud senden. Fügen Sie außerdem 4,7 kΩ Pull-up-Widerstände an SDA und SCL hinzu — viele Boards haben keine ausreichenden eingebauten Pull-ups. Setzen Sie VCC auf die gleiche Spannung wie den Logikpegel Ihres MCU (5V, 3,3V oder 1,8V).




Symptom

Sie verbinden DimmerLink mit Ihrem I2C-Bus, führen i2cdetect -y 1 aus (oder scannen von Arduino), und entweder:

  • die Adresstabelle ist komplett leer — Adresse 0x50 wird nicht angezeigt;
  • der Scan dauert viel länger als üblich oder scheint zu hängen.



Ursache 1 — Falscher Modus (UART aktiv)

Jedes DimmerLink-Modul verlässt das Werk im UART-Modus. Im UART-Modus:

  • überwacht das Gerät den I2C-Bus nicht;
  • verhalten sich die TX/SDA- und RX/SCL-Pins als UART-Ausgänge;
  • kann das Gerät nicht auf I2C-Adressen antworten — es wird niemals bei einem Scan erscheinen.

Die I2C-Schnittstelle ist erst aktiv, nachdem der Modus auf I2C umgeschaltet wurde. Der Modus wird im EEPROM gespeichert und bleibt über Neustarts hinweg erhalten, sodass Sie nur einmal umschalten müssen.




Ursache 2 — UART-Modus zieht I2C-Bus-Leitungen auf Low

Wenn DimmerLink im UART-Modus ist und mit Ihrem I2C-Bus verbunden:

  • Der UART-TX-Ausgang wird auf logisch High gehalten (Ruhezustand) — das ist kein Problem.
  • Einige UART-Implementierungen ziehen den Ausgang zwischen Übertragungen oder beim Start auf Low.

Wenn die TX-Leitung (die mit SDA verdrahtet ist) auf Low geht, zieht sie die I2C-SDA-Leitung auf Low. Der I2C-Scanner sendet eine START-Bedingung auf SDA und SCL, aber SDA bleibt Low — der Bus erscheint dauerhaft belegt. i2cdetect wartet mehrere Sekunden pro Adresse vor dem Timeout, sodass der Scan hängend erscheint.

Dies ist kein Hardware-Fehler — sobald DimmerLink in den I2C-Modus umgeschaltet ist, werden SDA/SCL zu echten bidirektionalen I2C-Leitungen und das Problem verschwindet.




Ursache 3 — Fehlende Pull-up-Widerstände

I2C benötigt externe Pull-up-Widerstände an SDA und SCL. Ohne sie kann die Spannung auf diesen Leitungen nicht auf logisch High ansteigen und der Bus funktioniert nicht.

Platine Eingebaute I2C-Pull-ups Ausreichend?
Raspberry Pi 3/4/5 1,8 kΩ (auf dem Board) Normalerweise ausreichend
Arduino Uno / Mega ~50 kΩ (schwach) Unzureichend — externe hinzufügen
ESP8266 / ESP32 Schwach (~50 kΩ) Unzureichend — externe hinzufügen
STM32 Keine Externe müssen hinzugefügt werden
Raspberry Pi Pico Keine Externe müssen hinzugefügt werden

Erforderlicher Wert: 4,7 kΩ von SDA zu VCC und 4,7 kΩ von SCL zu VCC. Verwenden Sie das gleiche VCC wie für DimmerLink (siehe unten).




Ursache 4 — VCC-Spannungsfehlanpassung

DimmerLink unterstützt drei Versorgungsspannungen:

VCC Logikpegel Typischer MCU
5 V 5V TTL Arduino Uno, Mega
3,3V 3.3V CMOS ESP32, ESP8266, Raspberry Pi
1,8V 1.8V CMOS Niederspannungs-MCUs

Verbinden Sie VCC mit der gleichen Spannung wie den Logikpegel Ihres MCU. Nicht mischen: Ein DimmerLink-VCC von 5V, verbunden mit einem 3,3V-MCU, führt zu 5V-Signalen auf SDA/SCL, was den MCU beschädigen oder Logikfehler verursachen kann.

Ein Pegelwandler ist nicht nötig — DimmerLink passt sich an die jeweilige VCC-Spannung an.




Lösung: Schritt-für-Schritt-Umschaltung in den I2C-Modus


Was Sie benötigen

  • USB-UART-Adapter (CP2102, CH340, FT232 oder ähnlich)
  • Jumperkabel
  • Eine beliebige serielle Terminal-Anwendung


Schritt 1 — DimmerLink mit USB-UART-Adapter verbinden

DimmerLink-Pin UART-Adapter-Pin
VCC 3.3V-Ausgang
GND GND
TX/SDA RX
RX/SCL TX

Verbinden Sie TX mit RX und RX mit TX (gekreuzt). Versorgung über den 3.3V-Ausgang des Adapters — verwenden Sie nicht 5V, wenn Ihr UART-Adapter nur 5V-Signale liefert.


Schritt 2 — Serielles Terminal öffnen

Einstellungen: 115200 Baud, 8 Datenbits, keine Parität, 1 Stoppbit (8N1).

Empfohlene Terminals:

  • Windows: RealTerm (HEX-Sendemodus)
  • Linux/macOS: picocom -b 115200 /dev/ttyUSB0


Schritt 3 — SWITCH_I2C-Befehl senden

Senden Sie Roh-Bytes: 02 5B

  • In RealTerm: Reiter Send → Feld Send Numbers: 02 5BSend
  • Unter Linux/macOS — verwenden Sie den folgenden Python-Einzeiler (erfordert pyserial):
bash
python3 -c "
import serial
s = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
s.write(bytes([0x02, 0x5B]))
resp = s.read(1)
print('Antwort:', resp.hex() if resp else 'keine')
s.close()
"

Ersetzen Sie /dev/ttyUSB0 durch Ihren tatsächlichen Port (/dev/ttyACM0, /dev/ttyS0 usw.). Installieren Sie pyserial bei Bedarf: pip install pyserial.

Erwartete Antwort: 00 (ein Byte, OK).

Falls keine Antwort:

  • Prüfen Sie, ob TX/RX gekreuzt sind (Adapter TX → DimmerLink RX).
  • Bestätigen Sie, dass die Baudrate genau 115200 beträgt.
  • Bestätigen Sie, dass VCC angeschlossen ist.


Schritt 4 — Modusumschaltung überprüfen

Nach Erhalt von 00 befindet sich DimmerLink jetzt im I2C-Modus. Trennen Sie den UART-Adapter, verdrahten Sie für I2C und scannen Sie:

Raspberry Pi:

bash
i2cdetect -y 1

Arduino:

cpp
#include <Wire.h>
void setup() {
    Serial.begin(115200);
    Wire.begin();
    for (uint8_t addr = 1; addr < 127; addr++) {
        Wire.beginTransmission(addr);
        if (Wire.endTransmission() == 0) {
            Serial.print("Gefunden bei 0x");
            Serial.println(addr, HEX);
        }
    }
}

Erwartetes Ergebnis: Adresse 0x50 gefunden.




Verdrahtung für I2C-Betrieb

Nach dem Umschalten in den I2C-Modus wie folgt verbinden:


— (kein ISR)

RPi GPIO-Header Jeder ESP32
Pin 1 (3.3V) VCC
Pin 6 (GND) GND
Pin 3 (GPIO2 / SDA) TX/SDA
Pin 5 (GPIO3 / SCL) RX/SCL

RPi hat 1,8 kΩ Pull-ups an GPIO2/3 — normalerweise ausreichend für Kabel unter 30 cm. Fügen Sie externe 4,7 kΩ Pull-ups hinzu, wenn die Kommunikation unzuverlässig ist.


Arduino (Uno/Mega)

Arduino Jeder ESP32
A4 (SDA) TX/SDA
A5 (SCL) RX/SCL
5 V VCC
GND GND

Fügen Sie 4,7 kΩ Pull-ups von A4 zu 5V und von A5 zu 5V hinzu.


❌ nein

❌ nein Jeder ESP32
GPIO21 (SDA) TX/SDA
GPIO22 (SCL) RX/SCL
3,3V VCC
GND GND

Fügen Sie 4,7 kΩ Pull-ups von GPIO21 zu 3.3V und von GPIO22 zu 3.3V hinzu.


I2C-Pull-up-Verdrahtungsdiagramm

text
VCC (gleich wie DimmerLink VCC)
 │
 ├── 4.7kΩ ── SDA
 │
 └── 4.7kΩ ── SCL



Kommunikation überprüfen


Raspberry Pi (CLI)

bash
# Netzfrequenz lesen (sollte 50 oder 60 zurückgeben)
i2cget -y 1 0x50 0x20
# Helligkeit auf 50% setzen
i2cset -y 1 0x50 0x10 50
# Helligkeit zurücklesen
i2cget -y 1 0x50 0x10


Arduino

cpp
#include <Wire.h>
void setup() {
    Serial.begin(115200);
    Wire.begin();
    // Helligkeit auf 50% setzen
    Wire.beginTransmission(0x50);
    Wire.write(0x10);  // DIM0_LEVEL-Register
    Wire.write(50);    // 50%
    if (Wire.endTransmission() == 0) {
        Serial.println("DimmerLink: Helligkeit auf 50% gesetzt");
    } else {
        Serial.println("Fehler: DimmerLink antwortet nicht");
    }
}


Python (Raspberry Pi)

python
from smbus2 import SMBus
try:
    bus = SMBus(1)
    freq = bus.read_byte_data(0x50, 0x20)
    print(f"DimmerLink OK — Netzfrequenz: {freq} Hz")
    bus.close()
except OSError as e:
    print(f"Nicht gefunden: {e}")
    print("Prüfen Sie: I2C-Modus umgeschaltet, Pull-ups installiert, VCC korrekt")



Zurück zum UART-Modus wechseln

Wenn Sie zum UART-Modus zurückkehren müssen, schreiben Sie den Befehl 0x03 (SWITCH_UART) in das I2C-COMMAND-Register (0x01):

Arduino:

cpp
Wire.beginTransmission(0x50);
Wire.write(0x01);   // COMMAND-Register
Wire.write(0x03);   // SWITCH_UART
Wire.endTransmission();
// I2C funktioniert nicht mehr — über UART neu verbinden

Raspberry Pi:

bash
i2cset -y 1 0x50 0x01 0x03
# Jetzt Steuerung nur über UART



Diagnose-Flussdiagramm

text
i2cdetect zeigt nichts bei 0x50?
         │
         ├── Ist DimmerLink VCC angeschlossen und korrekt? → Nein → VCC anschließen
         │
         ├── Wurde SWITCH_I2C gesendet (02 5B über UART)? → Nein → Senden
         │
         ├── Sind 4,7 kΩ Pull-ups an SDA und SCL? → Nein → Hinzufügen
         │
         ├── Ist SDA mit SDA verdrahtet, SCL mit SCL? → Nein → Verdrahtung korrigieren
         │
         └── Hängt i2cdetect (langsamer Scan)?
                 → UART-Modus aktiv → Zuerst SWITCH_I2C senden



Schnell-Checkliste

  • ☐ SWITCH_I2C-Befehl (`02 5B`) über UART bei 115200 Baud gesendet
  • ☐ Antwort `00` erhalten (bestätigt Modusumschaltung)
  • ☐ VCC auf gleiche Spannung wie MCU-Logikpegel gesetzt (3,3V empfohlen)
  • ☐ 4,7 kΩ Pull-up von SDA zu VCC
  • ☐ 4,7 kΩ Pull-up von SCL zu VCC
  • ☐ SDA mit SDA verdrahtet (nicht gekreuzt)
  • ☐ SCL mit SCL verdrahtet (nicht gekreuzt)
  • ☐ `i2cdetect -y 1` zeigt `50` in der Tabelle



  • Verwandte Artikel



    Noch Fragen?

    Ask on forum.rbdimmer.com or open a GitHub Issue.

    Diesen Beitrag teilen
    Anmelden , um einen Kommentar zu hinterlassen