Python Урок 3. Отправка команды на установку яркости по ID устройства
В уроке 2 мы научились считывать ответ от устройства. В этом уроке мы отправим команду на установку яркости по адресу устройства, не учитывая канал CH. Для этого необходимо:
1. Узнать идентификатор устройства SUF-1-300.
2. Включить режим диммирования устройству SUF-1-300.
3. Подсчитать контрольную сумму (CRC) для отправляемого пакета.
4. Отправить устройству пакет с командой с заданным значением яркости по указанному адресу устройства.
1. Из полученного ответа можно узнать идентификатор устройства (ID), который состоит из байтов ID0, ID1, ID2, ID3. В нашем случае идентификатор (в десятичном виде) - 0 1 56 170.

Отправим команду на установку яркости непосредственно по адресу устройства, не учитывая канал CH, к которому оно было привязано. Для этого в пакете из 17 байтов следует изменить значение CTR с 0 на 9, что означает передачу команды по указанному адресу.
2. Так как нам необходимо отправить команду на установку яркости с определенным ее значением, то у устройства SUF-1-300 должен быть включен режим диммирования. Чтобы включить режим диммирования, следует отправить устройству пакет с настройкой (аналогично отправке команды из первого урока), который представлен ниже. Обратите внимание, что данный пакет настройки уже предназначен определенному адресу устройства.
(ST= 171; MODE = 2; CTR = 9; RES = 0; CH = 0; CMD = 129; FMT = 16; D0= 2; D1 = 0; D2 = 2; D3 = 0; ID0 = 0; ID1 = 1; ID2 = 56; ID3 = 170; CRC = 46; SP = 172)
Байт: | ST | MODE | CTR | RES | CH | CMD | FMT | D0 | D1 | D2 | D3 | ID0 | ID1 | ID2 | ID3 | CRC | SP |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Передача (17 байт): | 171 | 2 | 9 | 0 | 0 | 129 | 16 | 2 | 0 | 2 | 0 | 0 | 1 | 56 | 170 | 46 | 172 |
CMD = 129 — это команда Write_State, с помощью которой задаются настройки устройства
FMT = 16, D0 = 2, D2 = 2 — формат и данные для включения режима диммирования
Нагрузка плавно загорится и погаснет, если настройка была успешно принята устройством SUF-1-300.
3. Подсчет контрольной суммы (CRC) был рассмотрен в уроке 1. Чтобы автоматизировать этот процесс, необходимо сложить значения байтов с 0-го по 14-ый включительно, затем вычислить остаток от деления суммы на 256.
4. Рассмотрим команду на установку яркости, см. таблицу ниже. CMD = 6, в D0 указываем конкретное значение яркости, которое может быть от 0 до 255.
(ST= 171; MODE = 2; CTR = 9; RES = 0; CH = 0; CMD = 6; FMT = 0; D0= 255; D1 = 0; D2 = 0; D3 = 0; ID0 = 0; ID1 = 1; ID2 = 56; ID3 = 170; CRC = 158; SP = 172)
Байт: | ST | MODE | CTR | RES | CH | CMD | FMT | D0 | D1 | D2 | D3 | ID0 | ID1 | ID2 | ID3 | CRC | SP |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Передача (17 байт): | 171 | 2 | 9 | 0 | 0 | 6 | 0 | 255 | 0 | 0 | 0 | 0 | 1 | 56 | 170 | 158 | 172 |
В предложенном коде программы необходимо ввести идентификатор устройства (разделяя байты пробелами) и значение яркости, при условии, что режим диммирования уже включен.
Пример кода Python в подсказке.
# Подключение модуля для работы с СОМ портом
import serial
# Задание параметров порта
port = serial.Serial(port='COM8', baudrate=9600, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS)
print("Введите ID, отделяя байты пробелами:")
id = [int(i) for i in input().split()]
# (4.) Ввод значения яркости для отправляемой команды
print("Введите яркость 0 до 255:")
bright = int(input())
# (2.) Пакет байтов для отправки.
# Значение 8 - для отправки команды по указанному идентификатору.
# Значение 6 - команда яркости Set_Brightness.
# Остальные байты, кроме стопового, заполним нулями.
package = bytearray ([171, 2, 9, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172])
# (1.) Подстановка значения яркости и ID , введённых пользователем
package[7] = bright
package[11] = id[0]
package[12] = id[1]
package[13] = id[2]
package[14] = id[3]
# (3.) Подсчёт контрольной суммы для 15го байта в массиве (младший байт от суммы байтов с 0-го по 14-ый включительно)
byteSumm = 0
for i in range(0, 15):
byteSumm += package[i]
crc = byteSumm % 256
package[15] = crc
# Запись пакета с командой, яркостью и идентификатором в порт
command = port.write(package)
Вывод консоли ниже.
