红外实验 - 把手机变成家电遥控器

« 返回红外拓展文档  IoT 专题

红外实验:把手机变成遥控器

这个实验做完你会得到什么

按手机上的按钮,电视/空调/机顶盒真的有反应 —— 手机通过顶部的红外发射器 发出和原装遥控器一样的信号。

项目 说明
难度 ★★★☆☆
用时 约 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 发指令给它,再由它发红外

相关文档

文档反馈