如何获取三星电视适配的adafruit_irremote GenericTransmit参数及信号地址?
问题描述
我用Circuit Playground Express运行以下代码尝试触发三星电视的电源按键,代码能正常运行并打印IR signal sent!,但电视完全没反应。想请教怎么获取适配这款三星电视的adafruit_irremote.GenericTransmit所需的header、one、zero、trail参数,以及对应的信号地址?
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # SPDX-License-Identifier: MIT """IR transmit example for Samsung TV using Circuit Playground Express""" # pylint: disable-msg=no-member import time import pulseio import board import digitalio import adafruit_irremote # Create a button object to trigger IR transmit button = digitalio.DigitalInOut(board.GP0) button.direction = digitalio.Direction.INPUT button.pull = digitalio.Pull.DOWN pulseout = pulseio.PulseOut(board.GP1, frequency=38000, duty_cycle=2**15) encoder = adafruit_irremote.GenericTransmit( header=[9500, 4500], one=[550, 550], zero=[550, 1700], trail=0 ) while True: if button.value: print("IR signal sent!") encoder.transmit(pulseout, [31, 31, 152, 103]) time.sleep(0.2)
解决方法
最可靠的方式是直接捕获你家三星电视原装遥控器的IR信号,再从中提取所需参数和命令码,步骤如下:
1. 用Circuit Playground Express捕获原装遥控器的IR脉冲
先把设备改成IR接收器,运行以下代码:
import pulseio import board import adafruit_irremote import time # 初始化IR接收器 pulsein = pulseio.PulseIn(board.GP1, maxlen=120, idle_state=True) decoder = adafruit_irremote.GenericDecode() print("等待捕获IR信号...") while True: try: # 捕获脉冲序列 pulses = decoder.read_pulses(pulsein) print("捕获到脉冲:", pulses) # 尝试解码成二进制数据(方便后续分析) code = decoder.decode_bits(pulses, debug=False) print("解码后的数据:", code) except adafruit_irremote.IRNECRepeatException: continue except adafruit_irremote.IRDecodeException as e: print("解码失败:", e) time.sleep(0.5)
运行代码后,将原装遥控器对准设备的IR接收引脚(若设备自带IR模块,用默认接收引脚即可),按下电源键,控制台会输出捕获到的脉冲序列和解码后的数据。
2. 从捕获的脉冲中提取GenericTransmit参数
三星电视IR协议多基于NEC协议变体,不同型号有细微差异,需从捕获的脉冲里拆分出以下部分:
- header:脉冲序列的前两个数值,即引导码的高、低电平时长(比如常见三星引导码为
[9000, 4500],但需以你实际捕获的为准) - one:代表二进制
1的脉冲对时长(通常是短高电平+长低电平,比如[560, 1690]) - zero:代表二进制
0的脉冲对时长(通常是短高电平+短低电平,比如[560, 560]) - trail:脉冲序列的最后一个数值,即结束码时长,多数三星型号为
0或短脉冲
举个例子,若捕获的脉冲开头为[9000, 4500, 560, 1690, 560, 560,...],对应的参数设置就是:
encoder = adafruit_irremote.GenericTransmit( header=[9000, 4500], one=[560, 1690], zero=[560, 560], trail=0 )
3. 获取正确的信号地址和命令码
三星IR信号通常为4个字节:地址 + 地址反码 + 命令 + 命令反码。你原代码里的[31, 31, 152, 103]是通用值,需替换成你实际捕获到的解码数据。比如捕获到的解码数据是[16, 239, 128, 127],就把这个值替换到encoder.transmit的第二个参数中。
额外注意事项
- 若设备无自带IR发射LED,需外接一个IR LED到GP1引脚,同时串联220Ω左右的限流电阻。
- 三星电视载波频率几乎都是38kHz,你代码里的
frequency=38000无需修改。
内容的提问来源于stack exchange,提问作者ChairPearBear
相关产品推荐
相关产品推荐

