Se rendre au contenu

← - 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


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 :

bash
# Linux/Raspberry Pi
i2cdetect -y 1

Si le périphérique fonctionne, l'adresse 50 apparaît dans le tableau.

Diagnostic 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

Symptômes : i2cdetect affiche un tableau vide, l'adresse 0x50 n'apparaît pas.

Solutions :

  1. Vérifiez les résistances de rappel
  2. Raspberry Pi : les 1,8 kΩ intégrées sont généralement suffisantes
  3. Autres cartes : ajoutez des résistances externes de 4,7 kΩ

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

  5. Vérifiez la longueur des fils

  6. I2C : maximum 30 cm sans buffer
  7. Pour les distances plus longues, utilisez 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)

Symptômes : PermissionError: [Errno 13] Permission denied: '/dev/ttyUSB0'

Solution :

bash
# 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 :

  1. Après UART → I2C :
  2. Connectez-vous au périphérique via I2C
  3. Adresse par défaut : 0x50 (ou celle précédemment configurée)
  4. Vérification : i2cdetect -y 1

  5. Après I2C → UART :

  6. Connectez-vous au périphérique via UART
  7. Vitesse : 115200, 8N1

  8. Si vous avez changé l'adresse I2C :

  9. Scannez le bus : i2cdetect -y 1
  10. Le périphérique sera à la nouvelle adresse

Exemple de basculement 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")



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 :

  1. Octet de début — la commande doit commencer par 0x02
  2. Code de commande — utilisez uniquement les codes valides :
  3. 0x53 (SET)
  4. 0x47 (GET)
  5. 0x43 (CURVE)
  6. 0x51 (GETCURVE)
  7. 0x52 (FREQ)
  8. 0x58 (RESET)
  9. 0x5B (SWITCH_I2C)

Exemple de commande correcte :

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

python
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

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)



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

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



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)

python
Power
100% │         ╱
     │       ╱
 50% │     ╱
     │   ╱
  0% │ ╱
     └──────────────
       0%   50%  100%
          Level
  • La puissance dépend linéairement du niveau
  • Option universelle
  • Convient à la plupart des charges


RMS

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

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

python
# 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 :

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";
    }
}



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 :

  • ☐ Alimentation connectée (VCC et GND)
  • ☐ TX/RX connectés en croisé (pour UART)
  • ☐ SDA/SCL connectés directement (pour I2C)
  • ☐ Résistances de rappel installées (pour I2C)
  • ☐ Périphérique dans le bon mode (UART ou I2C)
  • Variateur :

  • ☐ Z-C et Dim connectés au DimmerLink
  • ☐ Variateur connecté au secteur AC (ATTENTION !)
  • ☐ Load power doesn't exceed dimmer rating
  • ☐ La charge est compatible (voir tableau ci-dessus)

  • Test minimal de fonctionnement

    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 & Dépannage | Sommaire