Passa al contenuto

← - Lambda FAQ e risoluzione dei problemi | Indice

FAQ e risoluzione dei problemi

Domande frequenti e soluzioni ai problemi comuni durante l'utilizzo di DimmerLink.


Problemi di connessione

Nessuna risposta dal dispositivo

Symptoms: I send a command, but there's no response.

Possibili cause e soluzioni:

Causa Soluzione
Byte di inizio mancante (UART) Aggiungere 0x02 all'inizio del comando
Baud rate errato (UART) Impostare 115200 baud
TX/RX invertiti Verificare il cablaggio incrociato: TX→RX, RX→TX
Interfaccia in modalità diversa Dispositivo in modalità I2C? Passare a UART
Indirizzo errato (I2C) L'indirizzo predefinito è 0x50 (potrebbe essere stato modificato)
Nessuna resistenza di pull-up (I2C) Aggiungere resistenze da 4,7 kΩ su SDA e SCL
Nessuna alimentazione Verificare VCC e GND

Diagnostica I2C:

bash
# Linux/Raspberry Pi
i2cdetect -y 1

Se il dispositivo funziona, l'indirizzo 50 apparirà nella tabella.

Diagnostica UART:

python
import serial
ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
ser.write(bytes([0x02, 0x52]))  # Request frequency
print(ser.read(2).hex())  # Expect "0032" or "003c"

I2C Doesn't See Device

Sintomi: i2cdetect mostra una tabella vuota, l'indirizzo 0x50 non viene visualizzato.

Soluzioni:

  1. Check pull-up resistors - Raspberry Pi: built-in 1.8kΩ usually sufficient - Other boards: add external 4.7kΩ

  2. Check wiring
    SDA → SDA (not crossed!) SCL → SCL

  3. Check wire length - I2C: maximum 30 cm without buffers - For longer distances use UART

  4. Check if I2C is enabled
    bash # Raspberry Pi sudo raspi-config # Interface Options → I2C → Enable

  5. Check bus number
    bash ls /dev/i2c-* # May be i2c-0 or i2c-1 i2cdetect -y 0 # try different bus


Permission Denied (Linux)

Sintomi: PermissionError: [Errno 13] Permission denied: '/dev/ttyUSB0'

Soluzione:

bash
# Add user to groups
sudo usermod -a -G dialout,i2c $USER

# Log out and back in, or reboot
logout

Il dispositivo non risponde dopo il cambio di interfaccia

Symptoms: After SWITCH_I2C command (0x5B) or SWITCH_UART (via I2C), device doesn't respond.

Causa: Questo è un comportamento normale. Dopo il cambio di interfaccia, la vecchia interfaccia viene disabilitata.

Soluzioni:

  1. After UART → I2C: - Connect to device via I2C - Default address: 0x50 (or previously configured) - Check: i2cdetect -y 1

  2. After I2C → UART: - Connect to device via UART - Speed: 115200, 8N1

  3. If you changed the I2C address: - Scan the bus: i2cdetect -y 1 - Device will be at the new address

Esempio di passaggio UART → I2C:

python
import serial
from smbus2 import SMBus

# 1. Send switch command via UART
ser = serial.Serial('COM3', 115200, timeout=1)
ser.write(bytes([0x02, 0x5B]))  # SWITCH_I2C
resp = ser.read(1)
if resp and resp[0] == 0x00:
    print("Switched to I2C")
ser.close()

# 2. Now work via I2C
bus = SMBus(1)
freq = bus.read_byte_data(0x50, 0x20)
print(f"Mains frequency: {freq} Hz")

Errori di protocollo

Errore 0xFC — Errore di scrittura EEPROM

Causa: Impossibile salvare le impostazioni nella memoria non volatile.

Possible causes:
- Flash memory problem
- Power supply voltage too low

Solution:
- Check power supply voltage (minimum 2.7V for Flash write)
- Retry the command


Errore 0xF9 — Errore di sintassi

Causa: Comando sconosciuto o formato non valido.

Verificare:

  1. Byte di inizio — il comando deve iniziare con 0x02
  2. Command code — use only valid codes: - 0x53 (SET) - 0x47 (GET) - 0x43 (CURVE) - 0x51 (GETCURVE) - 0x52 (FREQ) - 0x58 (RESET) - 0x5B (SWITCH_I2C)

Esempio di comando corretto:

plaintext
Correct:   02 53 00 32  (SET brightness 50%)
Incorrect: 53 00 32     (no start byte)
Incorrect: 02 99 00     (unknown command 0x99)

Errore 0xFD — Indice non valido

Causa: Specificato un indice dimmer inesistente.

Soluzione: Usare l'indice 0x00. La versione attuale supporta un solo dimmer.

plaintext
Correct:   02 53 00 32  (dimmer 0)
Incorrect: 02 53 05 32  (dimmer 5 doesn't exist)

Errore 0xFE — Parametro non valido

Causa: Valore del parametro fuori dal range consentito.

Check:
- Brightness: 0-100 (not 0-255!)
- Curve: 0, 1, or 2
- I2C address: 0x08-0x77

plaintext
Correct:   02 53 00 64  (brightness 100%)
Incorrect: 02 53 00 FF  (255 > 100)

Correct:   02 43 00 02  (LOG curve)
Incorrect: 02 43 00 05  (curve 5 doesn't exist)

Problemi di dimmerizzazione

Lamp Doesn't Light at Low Brightness

Symptoms: Incandescent lamp doesn't light below 25% brightness.

Causa: Questo è un comportamento normale per le lampade a incandescenza. A bassa potenza, il riscaldamento del filamento è insufficiente per produrre luce visibile.

Soluzione: Utilizzare livelli di luminosità del 25% e superiori per le lampade a incandescenza.


Brightness Doesn't Match Expectations

Sintomi: Il 50% sembra il 20% o l'80%.

Causa: Curva di dimmerizzazione errata selezionata.

Soluzione: Scegliere la curva adatta al tipo di carico (vedere la sezione seguente).


Formato GET e SET

Entrambi i comandi SET e GET funzionano nello stesso formato:

  • SET accetta percentuale: 0–100
  • GET restituisce percentuale: 0–100
python
dimmer.set_level(50)       # Set 50%
level = dimmer.get_level() # Get 50

UART vs I2C — Quale scegliere?

UART limitations:
- Recommended interval between commands: 10-20 ms
- More frequent commands may cause buffer data loss
- UART is a relatively slow interface

Recommendation: If you need frequent brightness changes (smooth transitions, animations), use I2C — it's significantly faster.

python
# UART: no more than 3-5 commands/sec
for level in range(0, 101, 10):
    ser.write(bytes([0x02, 0x53, 0x00, level]))
    time.sleep(0.3)  # Minimum 200-300 ms between commands

# I2C: can be much faster
for level in range(0, 101):
    bus.write_byte_data(0x50, 0x10, level)
    time.sleep(0.01)  # 10 ms — smooth transition

Scelta della curva di dimmerizzazione

Quale curva scegliere?

Curva Codice Ideale per Caratteristica
LINEAR 0 Universale Relazione lineare di potenza
RMS 1 Lampade a incandescenza Luminosità lineare per incandescenza
LOG 2 Lampade LED Corrisponde alla percezione dell'occhio

LINEAR (predefinita)

plaintext
Power
100% │         ╱
     │       ╱
 50% │     ╱
     │   ╱
  0% │ ╱
     └──────────────
       0%   50%  100%
          Level
  • La potenza dipende linearmente dal livello
  • Opzione universale
  • Adatta alla maggior parte dei carichi

RMS

plaintext
Brightness
100% │         ╱
     │       ╱
 50% │     ╱
     │   ╱
  0% │ ╱
     └──────────────
       0%   50%  100%
          Level
  • Compensa la non-linearità delle lampade a incandescenza
  • Livello 50% = 50% di luminosità percepita
  • Ideale per lampade a incandescenza

LOG (Logaritmica)

plaintext
Brightness
100% │              ╱
     │           ╱
 50% │       ╱
     │   ╱
  0% │╱
     └──────────────
       0%   50%  100%
          Level
  • Tiene conto della percezione logaritmica dell'occhio
  • Variazioni di luminosità graduali ai livelli bassi
  • Raccomandata per lampade LED

Raccomandazioni

Tipo di carico Curva raccomandata
LED (dimmerabile) LOG (2)
Lampada a incandescenza RMS (1)
Riscaldatore LINEAR (0)
Motore (ventilatore) LINEAR (0)
Don't know Provare tutte e tre

⚠️ Importante: Le lampade a scarica di gas (alogene, fluorescenti, HID, sodio) non sono supportate — richiedono alta tensione per l'accensione e il mantenimento della scarica.

Come cambiare la curva:

python
# UART
ser.write(bytes([0x02, 0x43, 0x00, 2]))  # LOG

# I2C
bus.write_byte_data(0x50, 0x11, 2)  # LOG

Codici di errore

Tabella riepilogativa

Codice Nome Descrizione Soluzione
0x00 OK Successo
0xF9 ERR_SYNTAX Formato non valido Verificare il byte START e il codice comando
0xFC ERR_NOT_READY Errore di scrittura EEPROM Verificare l'alimentazione, riprovare
0xFD ERR_INDEX Indice non valido Usare l'indice 0
0xFE ERR_PARAM Parametro non valido Verificare i range dei valori

Esempio di gestione degli errori

Python:

python
ERROR_CODES = {
    0x00: "OK",
    0xF9: "Invalid command syntax",
    0xFC: "EEPROM write error",
    0xFD: "Invalid dimmer index",
    0xFE: "Invalid parameter value"
}

def check_response(resp):
    if not resp:
        return "No response"
    code = resp[0]
    return ERROR_CODES.get(code, f"Unknown error: 0x{code:02X}")

Arduino:

cpp
const char* getErrorMessage(uint8_t code) {
    switch (code) {
        case 0x00: return "OK";
        case 0xF9: return "Syntax error";
        case 0xFC: return "EEPROM write error";
        case 0xFD: return "Invalid index";
        case 0xFE: return "Invalid parameter";
        default: return "Unknown error";
    }
}

Carichi compatibili

Supportati

Tipo di carico Supporto Note
Lampada a incandescenza Minimo 25% per luce visibile
Lampada alogena Funziona come una lampada a incandescenza
LED (dimmerabile) Only with "dimmable" marking
Riscaldatore Carico resistivo
Motore (ventilatore) Motori universali/a spazzole

⚠️ Important about motors:
- ✓ Universal brush motors (vacuums, mixers, drills)
- ✗ Induction/asynchronous motors (most fans, pumps) — will hum and overheat!
If unsure about motor type — don't use dimming.

Non supportati

Tipo di carico Motivo
Lampade fluorescenti Scarica di gas, richiedono ballast
Lampade HID, sodio Scarica di gas, alta tensione
LED without "dimmable" Non progettate per la dimmerizzazione
Driver LED a trasformatore Possono surriscaldarsi o guastarsi

Sfarfallio della lampada

Sintomi: La lampada lampeggia o sfarfalla durante il funzionamento.

Possibili cause e soluzioni:

Causa Soluzione
LED lamp not "dimmable" Sostituire con LED dimmerabile
Potenza LED troppo bassa Aggiungere un carico minimo (lampada a incandescenza in parallelo)
Interferenze sulla rete Aggiungere un circuito RC snubber all'uscita del dimmer
Contatto difettoso Verificare tutti i collegamenti

💡 Nota: DimmerLink elimina lo sfarfallio software. Se lo sfarfallio persiste — la causa è nel carico o nel cablaggio.


Suggerimenti generali

Checklist prima di iniziare

DimmerLink:

  • ☐ Alimentazione collegata (VCC e GND)
  • ☐ TX/RX collegati incrociati (per UART)
  • ☐ SDA/SCL collegati direttamente (per I2C)
  • ☐ Resistenze di pull-up installate (per I2C)
  • ☐ Dispositivo nella modalità corretta (UART o I2C)
  • Dimmer:

  • ☐ Z-C e Dim collegati a DimmerLink
  • ☐ Dimmer collegato alla rete AC (ATTENZIONE!)
  • ☐ Load power doesn't exceed dimmer rating
  • ☐ Il carico è compatibile (vedere la tabella sopra)
  • Test minimo di funzionamento

    UART:

    python
    import serial
    
    ser = serial.Serial('COM3', 115200, timeout=1)  # Or '/dev/ttyUSB0'
    
    # Request mains frequency
    ser.write(bytes([0x02, 0x52]))
    resp = ser.read(2)
    
    if len(resp) == 2 and resp[0] == 0x00:
        print(f"Device working! Mains frequency: {resp[1]} Hz")
    else:
        print(f"Error: {resp.hex() if resp else 'no response'}")
    

    I2C:

    python
    from smbus2 import SMBus
    
    try:
        bus = SMBus(1)
        freq = bus.read_byte_data(0x50, 0x20)
        print(f"✓ Device working! Mains frequency: {freq} Hz")
    except OSError as e:
        print(f"✗ Connection error: {e}")
        print("Check:")
        print("  - SDA/SCL wiring")
        print("  - Pull-up resistors")
        print("  - Is I2C enabled: sudo raspi-config")
    

    What's Next?

    ← - Lambda FAQ e risoluzione dei problemi | Indice