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.




Indice




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. Verificare le resistenze di pull-up
  2. Raspberry Pi: le 1,8 kΩ integrate sono generalmente sufficienti
  3. Altre schede: aggiungere resistenze esterne da 4,7 kΩ

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

  5. Verificare la lunghezza dei cavi

  6. I2C: massimo 30 cm senza buffer
  7. Per distanze maggiori usare UART

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

  9. 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. Dopo UART → I2C:
  2. Connettersi al dispositivo via I2C
  3. Indirizzo predefinito: 0x50 (o quello configurato in precedenza)
  4. Verifica: i2cdetect -y 1

  5. Dopo I2C → UART:

  6. Connettersi al dispositivo via UART
  7. Velocità: 115200, 8N1

  8. Se è stato modificato l'indirizzo I2C:

  9. Scansionare il bus: i2cdetect -y 1
  10. Il dispositivo sarà al nuovo indirizzo

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. Codice comando — usare solo codici validi:
  3. 0x53 (SET)
  4. 0x47 (GET)
  5. 0x43 (CURVE)
  6. 0x51 (GETCURVE)
  7. 0x52 (FREQ)
  8. 0x58 (RESET)
  9. 0x5B (SWITCH_I2C)

Esempio di comando corretto:

python
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.

python
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

python
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)

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


RMS

python
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)

python
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