红外实验:把手机变成遥控器
这个实验做完你会得到什么
按手机上的按钮,电视/空调/机顶盒真的有反应 —— 手机通过顶部的红外发射器 发出和原装遥控器一样的信号。
| 项目 | 说明 |
|---|---|
| 难度 | ★★★☆☆ |
| 用时 | 约 50 分钟(录码占大半) |
| 前置 | 无。但手机必须自带红外发射器,第一步就验证这件事 |
⚠️ 绝大多数手机没有红外发射器。红米/小米部分型号、华为荣耀部分型号有, 苹果全系没有。第一步就是检测,没有的话这篇做不了 —— 这是硬件限制, 装什么 App 都没用。
一、器材清单
| 器材 | 数量 | 说明 |
|---|---|---|
| 带红外发射器的 Android 手机 | 1 | 顶部有个小黑窗口的那种 |
| 要控制的家电 | 1 | 电视、空调、机顶盒、风扇都行 |
| Arduino + 红外接收头(可选) | 1 | 录制自家遥控器的码用,见第五节 |
二、导入扩展
UrsAI2IrXmitter.zip(解压后导入 .aix)
示例工程:MetzIRControl.aia
三、界面组件
| 组件 | 命名 | 关键属性 |
|---|---|---|
| 标签 | 标签_硬件 |
字号 18,文本「检测中…」 |
| 按钮 | 按钮_电源 |
文本「电源」 |
| 按钮 | 按钮_音量加 |
文本「音量 +」 |
| 标签 | 标签_状态 |
|
| UrsAI2IrXmitter | UrsAI2IrXmitter1 |
不可见 |
四、分步搭代码块
第 1 步:先确认手机有没有红外发射器
这一步不通,后面全都白搭,所以放在最前面。
when Screen1.Initialize() {
if UrsAI2IrXmitter1.HasIrEmitter {
标签_硬件.Text = join("本机支持红外,可用载波频率:", UrsAI2IrXmitter1.CarrierFrequencies)
标签_硬件.TextColor = "&HFF43A047"
按钮_电源.Enabled = true
} else {
标签_硬件.Text = "本机没有红外发射器,这个实验做不了"
标签_硬件.TextColor = "&HFFE53935"
按钮_电源.Enabled = false
}
}
中途验证:显示绿色的”本机支持红外”并列出频率(通常包含 38000)。 显示红色就到此为止 —— 换一台有红外的手机。
CarrierFrequencies返回逗号分隔的频率列表。家电遥控绝大多数用 38kHz, 少数用 36k/40k/56k。这个列表是手机硬件支持的范围。
第 2 步:发一个红外码
Pattern 是一串以微秒为单位的时长,Mark(发射)和 Space(停顿)交替,从 Mark 开始:
global 电源码 = "9000,4500,560,560,560,1690,560,560,560,1690,560,1690,560,560,560,1690,560,560,560,560,560,1690,560,560,560,1690,560,1690,560,560,560,1690,560,1690,560,39000"
when 按钮_电源.Click() {
UrsAI2IrXmitter1.CarrierFrequency = 38000
UrsAI2IrXmitter1.Transmit(电源码)
标签_状态.Text = "已发送电源码"
}
中途验证:对准电视按一下 —— 上面这串是 NEC 协议的一个示例码, 未必对得上你家的电器。对不上很正常,第五节讲怎么录自己的。
数字怎么读:
9000,4500是 NEC 协议的引导码(发射 9ms、停 4.5ms); 后面560,560表示逻辑 0、560,1690表示逻辑 1,一共 32 位; 最后一个大数是帧间间隔。
Transmit是同步的:方法返回时已经发完了。文档写明 只能发送短于 2 秒的 Pattern,超长的要用重复发送。
第 3 步:长按连发(音量键必备)
音量、亮度这种要按住不放连续调的,用重复发送:
global 音量加码 = "9000,4500,560,560,560,1690,560,560,560,1690,560,1690,560,560,560,1690,560,560,560,560,560,1690,560,560,560,1690,560,560,560,1690,560,560,560,1690,560,39000"
when 按钮_音量加.TouchDown() {
UrsAI2IrXmitter1.RepeatedTransmit(-1, 音量加码)
标签_状态.Text = "连发中…"
}
when 按钮_音量加.TouchUp() {
UrsAI2IrXmitter1.StopTransmission()
标签_状态.Text = "已停止"
}
when UrsAI2IrXmitter1.TransmitDone() {
标签_状态.Text = "发送完成"
}
中途验证:按住音量键,电视音量连续上升;松手就停。
重复次数填
-1= 无限重复,直到调用StopTransmission。 这正好对应”按住不放”的交互,所以要用TouchDown/TouchUp而不是Click。
RepeatedTransmit是异步的,立即返回;Transmit是同步的。别搞混。
第 4 步:更省事的写法 —— 把按钮直接注册给扩展
上面那套”按下发、松开停”的逻辑,扩展可以帮你接:
when Screen1.Initialize() {
UrsAI2IrXmitter1.RegisterButtonForRepeatedPattern(按钮_音量加, 音量加码)
UrsAI2IrXmitter1.RegisterButtonForSinglePattern(按钮_电源, 电源码)
}
中途验证:不写任何 TouchDown / TouchUp,按钮照样能用。
注册之后由扩展自动处理按下/松开:
RegisterButtonForSinglePattern是点一下发一次,RegisterButtonForRepeatedPattern是按住连发、松手停。 遥控器按钮多的时候,这种写法能省掉几十个事件块。
五、怎么得到自己家电的红外码
上面的示例码大概率对不上你的设备。三条路:
① 用 Arduino 录(最靠谱) 本目录提供了录码程序 IRrecord.ino:Arduino + 一个红外接收头 (VS1838B 之类),把原装遥控器对着它按一下,串口就会打印出这串时长数字, 复制到 App 里即可。
② 查现成的码库 LIRC、irdb 这类开源红外码库收录了大量品牌型号,格式转换后可用。
③ 用手机上的万能遥控 App 试 它们内置了码库,但导不出来 —— 只能用来确认”这台设备能被红外控制”。
红外码是按品牌+型号走的,同品牌不同年份的机器码也可能不一样。 没有”通用码”这回事,万能遥控 App 也是靠一个个试。
六、排错表
| 现象 | 原因与处理 |
|---|---|
| 显示”没有红外发射器” | 手机硬件不支持,换机。这是硬件限制,无解 |
| 有硬件但电器没反应 | ① 码不对(最常见,见第五节录自己的);② 载波频率不对,试 38000;③ 没对准,红外是直线传播,要对着接收窗口且距离 5 米内 |
| 偶尔才响应一次 | 距离太远或角度太偏;或电器接收头被遮挡 |
| 报错 17303 | Pattern 转不成整数数组 —— 检查有没有多余空格、中文逗号、末尾多一个逗号 |
| 报错 17305 | 上一次异步发送还没结束就又发。先 StopTransmission |
| 报错 17308 / 17309 | StartDelay / RepetitionDelay 超出 0~1000 的范围 |
| 按住不放只发了一次 | 用了 Click 而不是 TouchDown/TouchUp;或重复次数没填 -1 |
七、下一步
- 用 TinyDB 把录好的码存起来,做一个可自定义的遥控器
- 家里没红外的手机,可以用 ESP32 + WiFi 做红外转发器, 手机通过 UDP 发指令给它,再由它发红外
扫码添加客服咨询