跳转至

红外发射

库: IRremote (#include <IRremote.hpp>)
访问: IrSender 全局对象
发射引脚: GPIO 44

M5Cardputer 内置红外 LED,可发射红外信号。支持 NEC、Sony、RC5 等多种协议,通过 IRremote 库实现。


初始化

#define DISABLE_CODE_FOR_RECEIVER  // 节省内存(ADV 版键盘已占用 RMT)
#define SEND_PWM_BY_TIMER
#define IR_TX_PIN 44
#include <IRremote.hpp>

void setup() {
    IrSender.begin(DISABLE_LED_FEEDBACK);
    IrSender.setSendPin(IR_TX_PIN);
}
用途
DISABLE_CODE_FOR_RECEIVER 节省 Flash/RAM — Cardputer 不需要接收
SEND_PWM_BY_TIMER 使用定时器 PWM 代替 RMT(避免 RMT 通道冲突)
IR_TX_PIN 44 M5Cardputer 红外 LED 引脚

发送 NEC 指令

NEC 是最常用的红外协议(大多数电视、空调等)。

IrSender.sendNEC(address, command, repeats);
参数 类型 说明
address uint16_t 设备地址(如 0x1111
command uint8_t 指令码(如 0x34 表示电源)
repeats uint8_t 重复次数(0 = 发送一次)

示例:电视电源开关

// 三星电视电源: address=0x0707, command=0x02
IrSender.sendNEC(0x0707, 0x02, 0);

示例:用键盘控制音量

void loop() {
    M5Cardputer.update();

    if (M5Cardputer.Keyboard.isChange()) {
        M5Cardputer.Keyboard.updateKeysState();
        for (char c : M5Cardputer.Keyboard.keysState().word) {
            switch (c) {
                case '+':
                    IrSender.sendNEC(0x1111, 0x10, 0);  // 音量+
                    break;
                case '-':
                    IrSender.sendNEC(0x1111, 0x11, 0);  // 音量-
                    break;
            }
        }
    }
}

其他协议

IrSender.sendSony(address, command, repeats);   // Sony SIRCS
IrSender.sendRC5(address, command, repeats);     // Philips RC5
IrSender.sendRC6(address, command, repeats);     // Philips RC6
IrSender.sendRaw(data, length, frequency);       // 原始脉冲串

协议详情请参阅 IRremote 文档


快速示例:红外遥控模拟器

完整示例见 examples/Basic/ir_nec

#define DISABLE_CODE_FOR_RECEIVER
#define SEND_PWM_BY_TIMER
#define IR_TX_PIN 44
#include <IRremote.hpp>
#include <M5Cardputer.h>

void setup() {
    M5Cardputer.begin();
    IrSender.begin(DISABLE_LED_FEEDBACK);
    IrSender.setSendPin(IR_TX_PIN);

    M5Cardputer.Display.println("红外 NEC 发射器");
    M5Cardputer.Display.println("按任意键发送红外指令");
}

void loop() {
    M5Cardputer.update();

    if (M5Cardputer.Keyboard.isChange() && M5Cardputer.Keyboard.isPressed()) {
        IrSender.sendNEC(0x1111, 0x34, 0);
        M5Cardputer.Display.println("已发送 NEC 0x1111 0x34");
    }
}