每次看到抽屉里堆积如山的旧遥控器,总有种"食之无味,弃之可惜"的感觉。电视、空调、机顶盒...这些陪伴我们多年的老伙计,难道就只能沦为电子垃圾?今天我要分享的,是如何用树莓派和几块钱的红外接收头,把这些闲置遥控器改造成智能家居的物理控制面板。想象一下:用老电视遥控器的一键开关灯,用空调遥控器的温度键调节智能插座,这种新旧技术的碰撞,才是创客精神的真正体现。
这个项目的核心硬件非常简单:
连接方式出奇简单:
code复制GPIO17 → 红外接收头信号线(中间引脚)
GPIO18 → 可选红外发射管(如需反向控制设备)
5V引脚 → 红外接收头VCC(通常左侧引脚)
GND引脚 → 红外接收头GND(通常右侧引脚)
提示:红外接收头有方向性,接反会导致无法工作。如果购买的是三脚直插式,通常弧形面朝向树莓派外侧。
与网上大多数教程不同,现代树莓派系统(基于4.19+内核)的配置已经大幅简化。只需要修改/boot/config.txt:
ini复制dtoverlay=gpio-ir,gpio_pin=17
dtoverlay=gpio-ir-tx,gpio_pin=18
安装必要软件包:
bash复制sudo apt update && sudo apt install lirc
关键配置文件/etc/lirc/lirc_options.conf只需修改两处:
ini复制driver = default
device = /dev/lirc1
传统教程会推荐使用irrecord,但实测发现它的识别准确率堪忧。我的方案是先用mode2获取原始信号,再手动编辑配置文件:
bash复制mode2 -m -d /dev/lirc1
按下遥控器按键后,你会看到类似输出:
code复制620000 9170 4441 640 552 604 554 609 552 635 528 612 551 601 556 634 528 609 553 614 1629 610 1632 635 1615 627 1619 596 1602 639 1629 611 1618 616 1605 633 1607 638 552 610 1604 633 1615 596 562 621 541 594 567 595 564 568 594 593 1649 566 598 568 601 591 1678 516 1697 556 1692 547 1683 546 132000
编辑/etc/lirc/lircd.conf需要特别注意格式规范。以下是经过验证的有效配置模板:
ini复制begin remote
name custom_remote
flags RAW_CODES
eps 30
aeps 100
gap 108106
begin raw_codes
name KEY_POWER
9156 4519 628 552 604 554 609
552 635 528 612 551 601 556
634 528 609 553 614 1629 610
1632 635 1615 627 1619 596
name KEY_VOLUME_UP
9820 4520 556 601 591 567 594
593 568 594 567 595 564 568
594 593 1649 566 598 568 601
591 1678 516 1697 556 1692
end raw_codes
end remote
注意:每个数值必须严格右对齐,行首空格数量会影响解析。建议每配置3-4个按键就重启lirc服务测试。
通过Python脚本可以轻松将红外指令转化为HA的API调用。先安装必要库:
bash复制pip install requests pyyaml
创建/home/pi/scripts/ha_controller.py:
python复制import requests
import yaml
with open('/home/pi/.homeassistant/secrets.yaml') as f:
secrets = yaml.safe_load(f)
HA_URL = secrets['ha_url']
HA_TOKEN = secrets['ha_token']
headers = {
"Authorization": f"Bearer {HA_TOKEN}",
"content-type": "application/json",
}
def toggle_light():
requests.post(
f"{HA_URL}/api/services/light/toggle",
json={"entity_id": "light.living_room"},
headers=headers
)
.lircrc配置文件示例,实现多场景控制:
ini复制begin
prog = irexec
button = KEY_POWER
config = python3 /home/pi/scripts/ha_controller.py toggle_light
end
begin
prog = irexec
button = KEY_VOLUME_UP
config = curl -X POST -H "Authorization: Bearer YOUR_TOKEN" http://ha.local:8123/api/services/switch/turn_on -d '{"entity_id":"switch.coffee_maker"}'
end
将电视遥控器改造成全屋控制面板:
通过添加以下Python脚本,可以将红外信号转为MQTT消息:
python复制import paho.mqtt.publish as publish
import lirc
sockid = lirc.init("myprogram")
while True:
code = lirc.nextcode()
if code:
publish.single(
"home/ir/remote",
payload=code[0],
hostname="mqtt.local"
)
旧遥控器的特殊按键可以发挥新作用:
| 原按键 | 新功能 | 实现方式 |
|---|---|---|
| 静音键 | 启动安防模式 | 触发HA安防场景 |
| 输入源 | 循环切换灯光模式 | 调用HA脚本 |
| 菜单键 | 播报天气 | 调用TTS服务 |
问题1:按键无响应
/dev/lirc1是否存在sudo systemctl status lircdmode2 -d /dev/lirc1问题2:信号不稳定
使用ir-ctl工具进行底层调试:
bash复制# 查看原始信号
ir-ctl -r -d /dev/lirc1
# 发送信号测试
ir-ctl -S="frequency=38000 duty_cycle=0.5" -s="0x12345678"
对于长期运行的服务,建议:
bash复制# 限制lircd内存使用
sudo systemctl edit lircd.service
添加:
ini复制[Service]
MemoryMax=50M
为防止误操作,可以在关键按键上实现长按触发机制。修改.lircrc:
ini复制begin
prog = irexec
button = KEY_POWER
config = bash -c '[[ $(cat /proc/uptime | cut -d"." -f1) -gt 3 ]] && python3 /path/to/script.py'
repeat = 3
end
虽然不常见,但可以通过以下方式增加安全性:
python复制# 加密示例
from cryptography.fernet import Fernet
key = Fernet.generate_key()
cipher = Fernet(key)
encrypted = cipher.encrypt(b"KEY_POWER")
decrypted = cipher.decrypt(encrypted)
通过创建虚拟开关,实现红外与语音控制的联动:
yaml复制# Home Assistant配置示例
automation:
- alias: "Voice to IR"
trigger:
platform: state
entity_id: input_boolean.ir_trigger
action:
- service: shell_command.ir_send
data_template:
command: "{{ states('input_text.ir_command') }}"
这个项目最让我惊喜的是,当我用二十年前的老录像机遥控器控制智能灯泡时,那种时空交错的感觉。技术不应该是冷冰冰的更新换代,而是让旧物焕发新生的魔法。