跳转到内容

设置 RMT 设备

在本指南中,将使用 ESPHome 设置一个红外设备。首先,使用红外接收模块(如这个)捕获遥控码。我们将使用 ESPHome 的转储功能直接输出解码后的遥控码。

然后,我们将使用红外 LED(如这个)设置一个新的遥控发射器,在按下按钮时发送该码。

首先,将红外接收模块连接到板子上的一个引脚,并设置一个 remote_receiver 实例:

remote_receiver:
pin: GPIOXX
dump: all

编译并上传代码。在查看 ESP 的日志输出时,按下您想要捕获的红外遥控器上的按钮(一次一个)。

您应该会看到类似下面的日志输出:

# 如果编解码器已知:
[D][remote.panasonic] Received Panasonic: address=0x4004 command=0x8140DFA2
# 如果尚不知道,则显示原始输出
# 数值可能会有轻微波动,但只要相似就没问题
[D][remote.raw] Received Raw: 4088, -1542, 1019, -510, 513, -1019, 510, -509, 511, -510, 1020,
[D][remote.raw] -1020, 1022, -1019, 510, -509, 511, -510, 511, -509, 511, -510,
[D][remote.raw] 1020, -1019, 510, -511, 1020, -510, 512, -508, 510, -1020, 1022

如果 ESPHome 中已经实现了该编解码器,您将直接看到解码后的值 - 否则您将看到原始数据转储(同样可以使用)。您已成功捕获了第一个红外码。

现在让我们利用这些信息从 ESP 模拟按钮按下。首先,将红外二极管连接到 ESP 上的一个新引脚,并配置一个全局的 remote_transmitter 实例:

remote_transmitter:
pin: GPIOXX
# 红外遥控使用 50% 的载波信号
carrier_duty_percent: 50%

这将允许我们通过红外 LED 发送任何我们想要的数据。为了复现我们之前解码的码,创建一个新的模板按钮,在触发时发送红外码:

button:
- platform: template
name: Panasonic Power Button
on_press:
- remote_transmitter.transmit_panasonic:
address: 0x4004
command: 0x8140DFA2
# 或者使用原始码
button:
- platform: template
name: Raw Code Power Button
on_press:
- remote_transmitter.transmit_raw:
carrier_frequency: 38kHz
code: [4088, -1542, 1019, -510, 513, -1019, 510, -509, 511, -510, 1020,
-1020, 1022, -1019, 510, -509, 511, -510, 511, -509, 511, -510,
1020, -1019, 510, -511, 1020, -510, 512, -508, 510, -1020, 1022]

重新编译后,下次启动设备时,您将在前端看到一个新增的按钮。点击它,您应该会看到红外信号被发送。完成!

remote_transmitter 和 remote_receiver 组件也可以用于发送和接收 433MHz 射频(RF)信号。本指南将讨论如何设置一个 433MHz 接收器来捕获设备的遥控码。之后,我们将设置一个 433MHz 发射器,通过在前端按下一个按钮来复现遥控码。

首先,将射频模块连接到 ESP 上的一个引脚,并设置一个 remote_receiver 实例:

remote_receiver:
pin: GPIOXX
dump: all
# 优化射频设备识别的设置
tolerance: 25%
filter: 250us
idle: 4ms
buffer_size: 2kb # 仅适用于 ESP8266

tolerance 设置默认为 25%。如果已知协议解码失败,请逐步增加。避免接近 50% 的值——协议内相邻时序槽的宽窗口开始重叠,解码器可能匹配错误的符号并输出垃圾数据。

编译并上传代码。在查看 ESP 的日志输出时,按下您想要捕获的射频遥控器上的按钮(一次一个)。

您应该会看到类似下面的日志输出:

# 如果编解码器已知:
[D][remote.rc_switch] Received RCSwitch: protocol=2 data='100010000000000010111110'
# 如果尚不知道,则显示原始输出
# 数值可能会有轻微波动,但只要相似就没问题
[D][remote.raw] Received Raw: 4088, -1542, 1019, -510, 513, -1019, 510, -509, 511, -510, 1020,
[D][remote.raw] -1020, 1022, -1019, 510, -509, 511, -510, 511, -509, 511, -510,
[D][remote.raw] 1020, -1019, 510, -511, 1020, -510, 512, -508, 510, -1020, 1022

NOTE

如果日志输出被 “Received Raw” 消息淹没,您也可以禁用原始遥控码报告,依靠 rc_switch 来解码值。

remote_receiver:
pin: GPIOXX
dump:
- rc_switch
...

如果 ESPHome 中已经实现了该编解码器,您将直接看到解码后的值 - 否则您将看到原始数据转储(同样可以使用)。您已成功捕获了第一个射频码。

现在让我们利用这些信息从 ESP 模拟按钮按下。首先,将射频发射器连接到 ESP 上的一个新引脚,并配置一个全局的 remote_transmitter 实例:

remote_transmitter:
pin: GPIOXX
# 射频使用 100% 的载波信号
carrier_duty_percent: 100%

这将允许我们通过射频发射器发送任何我们想要的数据。为了复现我们之前解码的码,创建一个新的模板按钮,在触发时发送射频码:

button:
- platform: template
name: RF Power Button
optimistic: true
on_press:
- remote_transmitter.transmit_rc_switch_raw:
code: '100010000000000010111110'
protocol: 2
repeat:
times: 10
wait_time: 0s
# 或者使用原始码
button:
- platform: template
name: Raw Code Power Button
on_press:
- remote_transmitter.transmit_raw:
code: [4088, -1542, 1019, -510, 513, -1019, 510, -509, 511, -510, 1020,
-1020, 1022, -1019, 510, -509, 511, -510, 511, -509, 511, -510,
1020, -1019, 510, -511, 1020, -510, 512, -508, 510, -1020, 1022]

重新编译后,下次启动设备时,您将在前端看到一个新增的按钮。点击它,您应该会看到射频信号被发送。完成!

NOTE

有些设备要求重复发送的码才能被识别为有效信号。重复之间的间隔也很重要。请检查遥控器和发射器节点之间的重复日志节奏是否一致。您可以根据需要调整 repeat: 设置。

有些设备使用滚动码,即按钮不是生成一个唯一的码,而是以随机方式生成n 个不同的码。良性的接收器逻辑很简单:当前码必须与上一个不同。在这种情况下,可以通过多次按下每个按钮来记录 n 个码,并将其存储在向量中。例如,brennenstuhl 遥控器为每个按钮使用四个滚动码。下面的 YAML 展示了三个按钮 A_ON、A_OFF 和 B_ON 的发射器。其他按钮只需以同样的方式添加:

globals:
# 三个按钮 A_ON、A_OFF 和 B_ON 的码向量
- id: a_on
type: std::vector<uint32_t>
initial_value: '{ 0xbfcf6c, 0xbe821c, 0xb1d75c, 0xb593ac }'
- id: a_off
type: std::vector<uint32_t>
initial_value: '{ 0xbd2e2c, 0xb4ed8c, 0xb2b6bc, 0xb3017c }'
- id: b_on
type: std::vector<uint32_t>
initial_value: '{ 0xbb3535, 0xb87af5, 0xbca0e5, 0xba5c05 }'
script:
# - 使用 bs_button 选择向量
# - 使用 idx 从向量中查找码
# - 调用 remote_transmitter
# - 更新 idx
- id: bs_transmitter
mode: single
parameters:
bs_button: int
then:
- remote_transmitter.transmit_brennenstuhl:
code: !lambda |-
uint32_t code = 0;
static int32_t idx = 0; // 滚动索引
switch(bs_button) {
case 10: { // A_ON
code=id(a_on)[idx];
break;
}
case 11: { // A_OFF
code=id(a_off)[idx];
break;
}
case 20: { // B_ON
code=id(b_on)[idx];
break;
}
}
idx = (idx + 1) & 3;
return code;