← - 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:
# Linux/Raspberry Pi
i2cdetect -y 1
Если устройство работает, в таблице появится адрес 50.
Диагностика 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
Симптомы: i2cdetect показывает пустую таблицу, адрес 0x50 не отображается.
Решения:
- Проверьте подтягивающие резисторы
- Raspberry Pi: встроенные 1.8 кОм обычно достаточно
-
Другие платы: добавьте внешние 4.7 кОм
-
Check wiring
SDA → SDA (not crossed!) SCL → SCL -
Проверьте длину проводов
- I2C: максимум 30 см без буферов
-
Для больших расстояний используйте 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)
Симптомы: PermissionError: [Errno 13] Permission denied: '/dev/ttyUSB0'
Решение:
# 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.
Причина: Это нормальное поведение. После переключения интерфейса старый интерфейс отключается.
Решения:
- После UART → I2C:
- Подключитесь к устройству через I2C
- Адрес по умолчанию: 0x50 (или ранее настроенный)
-
Проверка:
i2cdetect -y 1 -
После I2C → UART:
- Подключитесь к устройству через UART
-
Скорость: 115200, 8N1
-
Если вы изменили адрес I2C:
- Просканируйте шину:
i2cdetect -y 1 - Устройство будет по новому адресу
Пример переключения 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")
Ошибки протокола
Ошибка 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 — Синтаксическая ошибка
Причина: Неизвестная команда или неверный формат.
Проверьте:
- Стартовый байт — команда должна начинаться с
0x02 - Код команды — используйте только допустимые коды:
0x53(SET)0x47(GET)0x43(CURVE)0x51(GETCURVE)0x52(FREQ)0x58(RESET)0x5B(SWITCH_I2C)
Пример правильной команды:
Correct: 02 53 00 32 (SET brightness 50%)
Incorrect: 53 00 32 (no start byte)
Incorrect: 02 99 00 (unknown command 0x99)
Ошибка 0xFD — Неверный индекс
Причина: Указан несуществующий индекс диммера.
Решение: Используйте индекс 0x00. Текущая версия поддерживает только один диммер.
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
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
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.
# 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 (по умолчанию)
Power
100% │ ╱
│ ╱
50% │ ╱
│ ╱
0% │ ╱
└──────────────
0% 50% 100%
Level
- Мощность линейно зависит от уровня
- Универсальный вариант
- Подходит для большинства нагрузок
RMS
Brightness
100% │ ╱
│ ╱
50% │ ╱
│ ╱
0% │ ╱
└──────────────
0% 50% 100%
Level
- Компенсирует нелинейность ламп накаливания
- Уровень 50% = 50% воспринимаемой яркости
- Идеально для ламп накаливания
LOG (логарифмическая)
Brightness
100% │ ╱
│ ╱
50% │ ╱
│ ╱
0% │╱
└──────────────
0% 50% 100%
Level
- Учитывает логарифмическое восприятие глаза
- Плавные изменения яркости на низких уровнях
- Рекомендуется для LED-ламп
Рекомендации
| Тип нагрузки | Рекомендуемая кривая |
|---|---|
| LED (диммируемые) | LOG (2) |
| Лампа накаливания | RMS (1) |
| Обогреватель | LINEAR (0) |
| Мотор (вентилятор) | LINEAR (0) |
| Don't know | Попробуйте все три |
⚠️ Важно: Газоразрядные лампы (галогенные, люминесцентные, HID, натриевые) не поддерживаются — для зажигания и поддержания разряда требуется высокое напряжение.
Как сменить кривую:
# 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:
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";
}
}
Совместимые нагрузки
Поддерживаемые
| Тип нагрузки | Поддержка | Примечания |
|---|---|---|
| Лампа накаливания | ✓ | Минимум 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:
Диммер:
Минимальный тест работоспособности
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?
- Быстрый старт — начните с простого примера
- Команды UART — полный список команд
- Регистры I2C — карта регистров
- Примеры кода — готовые скрипты