← - 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
- Errori di protocollo
- Problemi di dimmerizzazione
- Scelta della curva di dimmerizzazione
- Codici di errore
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:
# Linux/Raspberry Pi
i2cdetect -y 1
Se il dispositivo funziona, l'indirizzo 50 apparirà nella tabella.
Diagnostica UART:
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:
- Verificare le resistenze di pull-up
- Raspberry Pi: le 1,8 kΩ integrate sono generalmente sufficienti
-
Altre schede: aggiungere resistenze esterne da 4,7 kΩ
-
Check wiring
SDA → SDA (not crossed!) SCL → SCL -
Verificare la lunghezza dei cavi
- I2C: massimo 30 cm senza buffer
-
Per distanze maggiori usare UART
-
Check if I2C is enabled
bash # Raspberry Pi sudo raspi-config # Interface Options → I2C → Enable -
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:
# 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:
- Dopo UART → I2C:
- Connettersi al dispositivo via I2C
- Indirizzo predefinito: 0x50 (o quello configurato in precedenza)
-
Verifica:
i2cdetect -y 1 -
Dopo I2C → UART:
- Connettersi al dispositivo via UART
-
Velocità: 115200, 8N1
-
Se è stato modificato l'indirizzo I2C:
- Scansionare il bus:
i2cdetect -y 1 - Il dispositivo sarà al nuovo indirizzo
Esempio di passaggio UART → I2C:
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:
- Byte di inizio — il comando deve iniziare con
0x02 - Codice comando — usare solo codici validi:
0x53(SET)0x47(GET)0x43(CURVE)0x51(GETCURVE)0x52(FREQ)0x58(RESET)0x5B(SWITCH_I2C)
Esempio di comando corretto:
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.
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
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
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.
# 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)
Power
100% │ ╱
│ ╱
50% │ ╱
│ ╱
0% │ ╱
└──────────────
0% 50% 100%
Level
- La potenza dipende linearmente dal livello
- Opzione universale
- Adatta alla maggior parte dei carichi
RMS
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)
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:
# 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:
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:
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:
Dimmer:
Test minimo di funzionamento
UART:
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:
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?
- Avvio rapido — iniziare con un esempio semplice
- Comandi UART — elenco completo dei comandi
- Registri I2C — mappa dei registri
- Esempi di codice — script pronti all'uso