Перейти к содержимому

← - Lambda FAQ и устранение неполадок | Содержание

FAQ и устранение неполадок

Часто задаваемые вопросы и решения типичных проблем при работе с DimmerLink.




Содержание




Проблемы подключения


Нет ответа от устройства

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

Возможные причины и решения:

Причина Решение
Отсутствует стартовый байт (UART) Добавьте 0x02 в начало команды
Неверная скорость передачи (UART) Установите 115200 baud
TX/RX перепутаны Проверьте перекрёстное подключение: TX→RX, RX→TX
Интерфейс в другом режиме Устройство в режиме I2C? Переключите на UART
Неверный адрес (I2C) Адрес по умолчанию — 0x50 (может быть изменён)
Нет подтягивающих резисторов (I2C) Добавьте резисторы 4.7 кОм на SDA и SCL
Нет питания Проверьте VCC и GND

Диагностика I2C:

bash
# Linux/Raspberry Pi
i2cdetect -y 1

Если устройство работает, в таблице появится адрес 50.

Диагностика 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

Симптомы: i2cdetect показывает пустую таблицу, адрес 0x50 не отображается.

Решения:

  1. Проверьте подтягивающие резисторы
  2. Raspberry Pi: встроенные 1.8 кОм обычно достаточно
  3. Другие платы: добавьте внешние 4.7 кОм

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

  5. Проверьте длину проводов

  6. I2C: максимум 30 см без буферов
  7. Для больших расстояний используйте 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)

Симптомы: PermissionError: [Errno 13] Permission denied: '/dev/ttyUSB0'

Решение:

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

# Log out and back in, or reboot
logout


Устройство не отвечает после переключения интерфейса

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

Причина: Это нормальное поведение. После переключения интерфейса старый интерфейс отключается.

Решения:

  1. После UART → I2C:
  2. Подключитесь к устройству через I2C
  3. Адрес по умолчанию: 0x50 (или ранее настроенный)
  4. Проверка: i2cdetect -y 1

  5. После I2C → UART:

  6. Подключитесь к устройству через UART
  7. Скорость: 115200, 8N1

  8. Если вы изменили адрес I2C:

  9. Просканируйте шину: i2cdetect -y 1
  10. Устройство будет по новому адресу

Пример переключения 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")



Ошибки протокола


Ошибка 0xFC — Ошибка записи EEPROM

Причина: Не удалось сохранить настройки в энергонезависимую память.

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

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



Ошибка 0xF9 — Синтаксическая ошибка

Причина: Неизвестная команда или неверный формат.

Проверьте:

  1. Стартовый байт — команда должна начинаться с 0x02
  2. Код команды — используйте только допустимые коды:
  3. 0x53 (SET)
  4. 0x47 (GET)
  5. 0x43 (CURVE)
  6. 0x51 (GETCURVE)
  7. 0x52 (FREQ)
  8. 0x58 (RESET)
  9. 0x5B (SWITCH_I2C)

Пример правильной команды:

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


Ошибка 0xFD — Неверный индекс

Причина: Указан несуществующий индекс диммера.

Решение: Используйте индекс 0x00. Текущая версия поддерживает только один диммер.

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


Ошибка 0xFE — Неверный параметр

Причина: Значение параметра выходит за допустимый диапазон.

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)



Проблемы диммирования


Lamp Doesn't Light at Low Brightness

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

Причина: Это нормальное поведение ламп накаливания. При низкой мощности нагрев нити недостаточен для видимого свечения.

Решение: Используйте яркость от 25% и выше для ламп накаливания.



Brightness Doesn't Match Expectations

Симптомы: 50% выглядит как 20% или 80%.

Причина: Выбрана неподходящая кривая диммирования.

Решение: Выберите кривую, соответствующую типу нагрузки (см. раздел ниже).



Формат GET и SET

Обе команды SET и GET работают в одном формате:

  • SET принимает проценты: 0–100
  • GET возвращает проценты: 0–100
python
dimmer.set_level(50)       # Set 50%
level = dimmer.get_level() # Get 50


UART или I2C — что выбрать?

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



Выбор кривой диммирования


Какую кривую выбрать?

Кривая Код Лучше всего для Особенность
LINEAR 0 Универсальное применение Линейная зависимость мощности
RMS 1 Лампы накаливания Линейная яркость для ламп накаливания
LOG 2 LED-лампы Соответствует восприятию глаза


LINEAR (по умолчанию)

python
Power
100% │         ╱
     │       ╱
 50% │     ╱
     │   ╱
  0% │ ╱
     └──────────────
       0%   50%  100%
          Level
  • Мощность линейно зависит от уровня
  • Универсальный вариант
  • Подходит для большинства нагрузок


RMS

python
Brightness
100% │         ╱
     │       ╱
 50% │     ╱
     │   ╱
  0% │ ╱
     └──────────────
       0%   50%  100%
          Level
  • Компенсирует нелинейность ламп накаливания
  • Уровень 50% = 50% воспринимаемой яркости
  • Идеально для ламп накаливания


LOG (логарифмическая)

python
Brightness
100% │              ╱
     │           ╱
 50% │       ╱
     │   ╱
  0% │╱
     └──────────────
       0%   50%  100%
          Level
  • Учитывает логарифмическое восприятие глаза
  • Плавные изменения яркости на низких уровнях
  • Рекомендуется для LED-ламп


Рекомендации

Тип нагрузки Рекомендуемая кривая
LED (диммируемые) LOG (2)
Лампа накаливания RMS (1)
Обогреватель LINEAR (0)
Мотор (вентилятор) LINEAR (0)
Don't know Попробуйте все три

⚠️ Важно: Газоразрядные лампы (галогенные, люминесцентные, HID, натриевые) не поддерживаются — для зажигания и поддержания разряда требуется высокое напряжение.

Как сменить кривую:

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

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



Коды ошибок


Сводная таблица

Код Имя Описание Решение
0x00 OK Успех
0xF9 ERR_SYNTAX Неверный формат Проверьте START-байт и код команды
0xFC ERR_NOT_READY Ошибка записи EEPROM Проверьте питание, повторите
0xFD ERR_INDEX Неверный индекс Используйте индекс 0
0xFE ERR_PARAM Неверный параметр Проверьте допустимые диапазоны


Пример обработки ошибок

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



Совместимые нагрузки


Поддерживаемые

Тип нагрузки Поддержка Примечания
Лампа накаливания Минимум 25% для видимого свечения
Галогенная лампа Работает как лампа накаливания
LED (диммируемые) Only with "dimmable" marking
Обогреватель Резистивная нагрузка
Мотор (вентилятор) Универсальные/щёточные двигатели

⚠️ 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.


Не поддерживаемые

Тип нагрузки Причина
Люминесцентные лампы Газоразрядные, требуют балласт
HID, натриевые лампы Газоразрядные, высокое напряжение
LED without "dimmable" Не рассчитаны на диммирование
Трансформаторные LED-драйверы Могут перегреться или выйти из строя



Мерцание лампы

Симптомы: Лампа мигает или мерцает во время работы.

Возможные причины и решения:

Причина Решение
LED lamp not "dimmable" Замените на диммируемую LED
Слишком малая мощность LED Добавьте минимальную нагрузку (лампу накаливания параллельно)
Помехи в сети Добавьте RC-снаббер на выход диммера
Плохой контакт Проверьте все соединения

💡 Примечание: DimmerLink устраняет программное мерцание. Если мерцание сохраняется — причина в нагрузке или схеме подключения.




Общие рекомендации


Чек-лист перед началом работы

DimmerLink:

  • ☐ Питание подключено (VCC и GND)
  • ☐ TX/RX подключены перекрёстно (для UART)
  • ☐ SDA/SCL подключены напрямую (для I2C)
  • ☐ Подтягивающие резисторы установлены (для I2C)
  • ☐ Устройство в правильном режиме (UART или I2C)
  • Диммер:

  • ☐ Z-C и Dim подключены к DimmerLink
  • ☐ Диммер подключён к сети AC (ОСТОРОЖНО!)
  • ☐ Load power doesn't exceed dimmer rating
  • ☐ Нагрузка совместима (см. таблицу выше)

  • Минимальный тест работоспособности

    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 и устранение неполадок | Содержание