You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取三星电视适配的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:44:53