#include <IRremote.h>
const int buttonPin = 2;
const int ledPin = 13;
void setup() {
Serial.begin(9600);
delay(500); // 等待串口稳定
Serial.println("--- 系统启动中 ---");
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
// 关键改动:先不启用 LED 反馈,防止 D13 冲突
IrReceiver.begin(11, DISABLE_LED_FEEDBACK);
Serial.println("1. 红外接收器已就绪 (引脚11)");
Serial.println("2. 物理按钮已就绪 (引脚2)");
Serial.println("请按遥控器或点击绿色按钮...");
}
void loop() {
// 1. 监测红外
if (IrReceiver.decode()) {
// 1. 先检查协议类型
Serial.print("协议: ");
Serial.println(IrReceiver.getProtocolString());
// 2. 如果是已知协议,打印 Command (这比 RawData 更稳定)
if (IrReceiver.decodedIRData.protocol != UNKNOWN) {
Serial.print("按键命令 (HEX): 0x");
Serial.println(IrReceiver.decodedIRData.command, HEX);
// 也可以看地址码,判断是不是同一个遥控器
Serial.print("设备地址: ");
Serial.println(IrReceiver.decodedIRData.address, HEX);
// 这里会打印出一串数组,那个才是它的“真身”
Serial.println("原始脉冲");
IrReceiver.printIRResultRawFormatted(&Serial, true);
} else {
// 3. 如果是未知协议,必须看原始脉冲
Serial.println("收到未知协议!小米可能使用了非标编码。");
// 这里会打印出一串数组,那个才是它的“真身”
IrReceiver.printIRResultRawFormatted(&Serial, true);
}
IrReceiver.resume();
}
// 2. 监测物理按钮
// 必须是 LOW 才代表按下
if (digitalRead(buttonPin) == LOW) {
delay(20); // 快速消抖
if (digitalRead(buttonPin) == LOW) {
Serial.println("【物理控制】按钮按下,切换LED状态");
digitalWrite(ledPin, !digitalRead(ledPin));
// 阻塞直到松开,并加一个小延时防止抖动
while(digitalRead(buttonPin) == LOW);
delay(20);
}
}
}