#ifndef IR_RECEIVER_H #define IR_RECEIVER_H #include #include // 红外接收结果结构体 struct IRReceiveResult { bool success; // 是否成功接收到信号 uint32_t protocol; // 协议类型 uint32_t address; // 地址码 uint32_t command; // 命令码 uint16_t bits; // 数据位数 uint16_t* rawData; // 原始数据指针 size_t rawLength; // 原始数据长度 }; class IRReceiver { private: static uint8_t receivePin; static bool initialized; static uint16_t rawBuffer[RAW_BUFFER_LENGTH]; public: // 初始化红外接收器 static void init(uint8_t pin = 15); // 读取红外信号直到信号结束,返回读取结果 static IRReceiveResult readIRSignal(uint32_t timeoutMs = 5000); // 释放资源 static void cleanup(); }; // 静态成员变量定义 uint8_t IRReceiver::receivePin = 15; bool IRReceiver::initialized = false; uint16_t IRReceiver::rawBuffer[RAW_BUFFER_LENGTH]; // 初始化红外接收器 void IRReceiver::init(uint8_t pin) { receivePin = pin; IrReceiver.begin(receivePin, ENABLE_LED_FEEDBACK); initialized = true; } // 读取红外信号直到信号结束,返回读取结果 IRReceiveResult IRReceiver::readIRSignal(uint32_t timeoutMs) { IRReceiveResult result = {false, 0, 0, 0, 0, nullptr, 0}; if (!initialized) { return result; } unsigned long startTime = millis(); // 等待接收到红外信号 while (!IrReceiver.decode()) { if (millis() - startTime > timeoutMs) { return result; // 超时返回失败结果 } delay(1); } // 成功接收到信号 result.success = true; result.protocol = IrReceiver.decodedIRData.protocol; result.address = IrReceiver.decodedIRData.address; result.command = IrReceiver.decodedIRData.command; result.bits = IrReceiver.decodedIRData.numberOfBits; // 复制原始数据到缓冲区 if (IrReceiver.decodedIRData.rawDataPtr != nullptr) { result.rawLength = IrReceiver.decodedIRData.rawlen; // 确保不超过缓冲区大小 if (result.rawLength > RAW_BUFFER_LENGTH) { result.rawLength = RAW_BUFFER_LENGTH; } // 复制原始数据 for (size_t i = 0; i < result.rawLength; i++) { rawBuffer[i] = IrReceiver.decodedIRData.rawDataPtr->rawbuf[i]; } result.rawData = rawBuffer; } // 准备接收下一个信号 IrReceiver.resume(); return result; } // 释放资源 void IRReceiver::cleanup() { if (initialized) { IrReceiver.stop(); initialized = false; } } #endif