← - Lambda FAQ & Dépannage | Sommaire
FAQ & Dépannage
Questions fréquentes et solutions aux problèmes courants lors de l'utilisation de DimmerLink.
Sommaire
- Problèmes de connexion
- Erreurs de protocole
- Problèmes de variation
- Choix de la courbe de variation
- Codes d'erreur
Problèmes de connexion
Pas de réponse du périphérique
Symptoms: I send a command, but there's no response.
Causes possibles et solutions :
| Cause | Solution |
|---|---|
| Octet de début manquant (UART) | Ajoutez 0x02 au début de la commande |
| Mauvais débit (UART) | Réglez 115200 baud |
| TX/RX inversés | Vérifiez le câblage croisé : TX→RX, RX→TX |
| Interface dans un autre mode | Périphérique en mode I2C ? Basculez vers UART |
| Mauvaise adresse (I2C) | L'adresse par défaut est 0x50 (peut être modifiée) |
| Pas de résistances de rappel (I2C) | Ajoutez des résistances de 4,7 kΩ sur SDA et SCL |
| Pas d'alimentation | Vérifiez VCC et GND |
Diagnostic I2C :
# Linux/Raspberry Pi
i2cdetect -y 1
Si le périphérique fonctionne, l'adresse 50 apparaît dans le tableau.
Diagnostic 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
Symptômes : i2cdetect affiche un tableau vide, l'adresse 0x50 n'apparaît pas.
Solutions :
- Vérifiez les résistances de rappel
- Raspberry Pi : les 1,8 kΩ intégrées sont généralement suffisantes
-
Autres cartes : ajoutez des résistances externes de 4,7 kΩ
-
Check wiring
SDA → SDA (not crossed!) SCL → SCL -
Vérifiez la longueur des fils
- I2C : maximum 30 cm sans buffer
-
Pour les distances plus longues, utilisez 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)
Symptômes : PermissionError: [Errno 13] Permission denied: '/dev/ttyUSB0'
Solution :
# Add user to groups
sudo usermod -a -G dialout,i2c $USER
# Log out and back in, or reboot
logout
Le périphérique ne répond pas après un changement d'interface
Symptoms: After SWITCH_I2C command (0x5B) or SWITCH_UART (via I2C), device doesn't respond.
Cause : C'est un comportement normal. Après le changement d'interface, l'ancienne interface est désactivée.
Solutions :
- Après UART → I2C :
- Connectez-vous au périphérique via I2C
- Adresse par défaut : 0x50 (ou celle précédemment configurée)
-
Vérification :
i2cdetect -y 1 -
Après I2C → UART :
- Connectez-vous au périphérique via UART
-
Vitesse : 115200, 8N1
-
Si vous avez changé l'adresse I2C :
- Scannez le bus :
i2cdetect -y 1 - Le périphérique sera à la nouvelle adresse
Exemple de basculement 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")
Erreurs de protocole
Erreur 0xFC — Erreur d'écriture EEPROM
Cause : Impossible d'enregistrer les paramètres en mémoire 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
Erreur 0xF9 — Erreur de syntaxe
Cause : Commande inconnue ou format invalide.
Vérifiez :
- Octet de début — la commande doit commencer par
0x02 - Code de commande — utilisez uniquement les codes valides :
0x53(SET)0x47(GET)0x43(CURVE)0x51(GETCURVE)0x52(FREQ)0x58(RESET)0x5B(SWITCH_I2C)
Exemple de commande correcte :
Correct: 02 53 00 32 (SET brightness 50%)
Incorrect: 53 00 32 (no start byte)
Incorrect: 02 99 00 (unknown command 0x99)
Erreur 0xFD — Index invalide
Cause : Index de variateur inexistant spécifié.
Solution : Utilisez l'index 0x00. La version actuelle ne prend en charge qu'un seul variateur.
Correct: 02 53 00 32 (dimmer 0)
Incorrect: 02 53 05 32 (dimmer 5 doesn't exist)
Erreur 0xFE — Paramètre invalide
Cause : Valeur du paramètre en dehors de la plage autorisée.
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)
Problèmes de variation
Lamp Doesn't Light at Low Brightness
Symptoms: Incandescent lamp doesn't light below 25% brightness.
Cause : C'est un comportement normal pour les lampes à incandescence. À faible puissance, le chauffage du filament est insuffisant pour produire une lumière visible.
Solution : Utilisez des niveaux de luminosité de 25% et plus pour les lampes à incandescence.
Brightness Doesn't Match Expectations
Symptômes : 50% ressemble à 20% ou 80%.
Cause : Mauvaise courbe de variation sélectionnée.
Solution : Choisissez la courbe correspondant à votre type de charge (voir section ci-dessous).
Format GET et SET
Les deux commandes SET et GET fonctionnent dans le même format :
- SET accepte un pourcentage : 0–100
- GET renvoie un pourcentage : 0–100
dimmer.set_level(50) # Set 50%
level = dimmer.get_level() # Get 50
UART vs I2C — Lequel choisir ?
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
Choix de la courbe de variation
Quelle courbe choisir ?
| Courbe | Code | Idéale pour | Caractéristique |
|---|---|---|---|
| LINEAR | 0 | Universel | Relation linéaire de puissance |
| RMS | 1 | Lampes à incandescence | Luminosité linéaire pour incandescence |
| LOG | 2 | Lampes LED | Correspond à la perception de l'œil |
LINEAR (par défaut)
Power
100% │ ╱
│ ╱
50% │ ╱
│ ╱
0% │ ╱
└──────────────
0% 50% 100%
Level
- La puissance dépend linéairement du niveau
- Option universelle
- Convient à la plupart des charges
RMS
Brightness
100% │ ╱
│ ╱
50% │ ╱
│ ╱
0% │ ╱
└──────────────
0% 50% 100%
Level
- Compense la non-linéarité des lampes à incandescence
- 50% du niveau = 50% de luminosité perçue
- Idéale pour les lampes à incandescence
LOG (Logarithmique)
Brightness
100% │ ╱
│ ╱
50% │ ╱
│ ╱
0% │╱
└──────────────
0% 50% 100%
Level
- Tient compte de la perception logarithmique de l'œil
- Changements de luminosité progressifs aux niveaux bas
- Recommandée pour les lampes LED
Recommandations
| Type de charge | Courbe recommandée |
|---|---|
| LED (dimmable) | LOG (2) |
| Lampe à incandescence | RMS (1) |
| Chauffage | LINEAR (0) |
| Moteur (ventilateur) | LINEAR (0) |
| Don't know | Essayez les trois |
⚠️ Important : Les lampes à décharge (halogène, fluorescente, HID, sodium) ne sont pas prises en charge — elles nécessitent une haute tension pour l'allumage et le maintien de la décharge.
Comment changer la courbe :
# UART
ser.write(bytes([0x02, 0x43, 0x00, 2])) # LOG
# I2C
bus.write_byte_data(0x50, 0x11, 2) # LOG
Codes d'erreur
Tableau récapitulatif
| Code | Nom | Description | Solution |
|---|---|---|---|
| 0x00 | OK | Succès | — |
| 0xF9 | ERR_SYNTAX | Format invalide | Vérifiez l'octet START et le code de commande |
| 0xFC | ERR_NOT_READY | Erreur d'écriture EEPROM | Vérifiez l'alimentation, réessayez |
| 0xFD | ERR_INDEX | Index invalide | Utilisez l'index 0 |
| 0xFE | ERR_PARAM | Paramètre invalide | Vérifiez les plages de valeurs |
Exemple de gestion des erreurs
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";
}
}
Charges compatibles
Prises en charge
| Type de charge | Support | Remarques |
|---|---|---|
| Lampe à incandescence | ✓ | Minimum 25% pour lumière visible |
| Lampe halogène | ✓ | Fonctionne comme une lampe à incandescence |
| LED (dimmable) | ✓ | Only with "dimmable" marking |
| Chauffage | ✓ | Charge résistive |
| Moteur (ventilateur) | ✓ | Moteurs universels/à balais |
⚠️ 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 prises en charge
| Type de charge | Raison |
|---|---|
| Lampes fluorescentes | Décharge gazeuse, nécessitent un ballast |
| Lampes HID, sodium | Décharge gazeuse, haute tension |
| LED without "dimmable" | Non conçues pour la variation |
| Drivers LED à transformateur | Risque de surchauffe ou de panne |
Scintillement de la lampe
Symptômes : La lampe clignote ou scintille en fonctionnement.
Causes possibles et solutions :
| Cause | Solution |
|---|---|
| LED lamp not "dimmable" | Remplacez par une LED dimmable |
| Puissance LED trop faible | Ajoutez une charge minimale (lampe à incandescence en parallèle) |
| Interférences sur le réseau | Ajoutez un circuit RC snubber en sortie du variateur |
| Mauvais contact | Vérifiez toutes les connexions |
💡 Remarque : DimmerLink élimine le scintillement logiciel. Si le scintillement persiste — la cause est dans la charge ou le câblage.
Conseils généraux
Liste de vérification avant de commencer
DimmerLink :
Variateur :
Test minimal de fonctionnement
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?
- Démarrage rapide — commencez par un exemple simple
- Commandes UART — liste complète des commandes
- Registres I2C — carte des registres
- Exemples de code — scripts prêts à l'emploi