#ifndef IR_CONTROL_H #define IR_CONTROL_H #include #include "driver/rmt.h" #include "driver/gpio.h" #include #include // 红外信号结构体 struct IRSignal { unsigned int* markTimes; // mark时间数组(微秒) unsigned int* spaceTimes; // space时间数组(微秒) int markCount; // mark数量 int spaceCount; // space数量 unsigned int carrierFreq; // 载波频率(Hz) bool isValid; // 信号是否有效 }; // 配置参数 #define IR_RECEIVE_PIN 18 #define IR_SEND_PIN 19 #define MAX_SIGNAL_LENGTH 1000 #define RECEIVE_TIMEOUT_US 1000000 // 1秒接收超时 #define SIGNAL_END_TIMEOUT_US 50000 // 50ms信号结束判断 #define IR_CARRIER_FREQ 38000 // 38kHz载波频率 #define CARRIER_PERIOD_US 26 // 38kHz载波周期(微秒) // RMT配置参数 #define RMT_TX_CHANNEL RMT_CHANNEL_0 // RMT发送通道 #define RMT_RX_CHANNEL RMT_CHANNEL_1 // RMT接收通道 #define RMT_CLK_DIV 80 // RMT时钟分频器 (80MHz / 80 = 1MHz, 1us分辨率) #define RMT_MEM_BLOCK_NUM 1 // RMT内存块数量 #define RMT_TX_CARRIER_EN true // 启用发送载波 #define RMT_TX_CARRIER_FREQ_HZ 38000 // 发送载波频率 #define RMT_TX_CARRIER_DUTY_PERCENT 33 // 载波占空比 #define RMT_TX_CARRIER_LEVEL RMT_CARRIER_LEVEL_HIGH // 载波电平 #define RMT_IDLE_LEVEL RMT_IDLE_LEVEL_LOW // 空闲电平 #define RMT_RX_FILTER_EN true // 启用接收滤波器 #define RMT_RX_FILTER_THRESH_US 100 // 接收滤波器阈值(微秒) #define RMT_RX_IDLE_THRESH_US 10000 // 接收空闲阈值(微秒) /** * 初始化红外控制模块 * 设置引脚模式和初始状态 */ void initIRControl(); /** * 检查是否有红外信号开始 * @return bool 是否检测到红外信号开始 * - true: 检测到信号开始(低电平) * - false: 没有检测到信号 */ bool checkIRSignalStart(); /** * 接收红外信号 * @return IRSignal 包含红外信号mark/space时序和载波频率的结构体 * - markTimes: 指向mark时间数组的指针 * - spaceTimes: 指向space时间数组的指针 * - markCount: mark数量 * - spaceCount: space数量 * - carrierFreq: 载波频率 * - isValid: 是否成功接收到有效信号 * * 注意:调用者需要在使用完毕后调用 freeIRSignal() 释放内存 */ IRSignal receiveIRSignal(); /** * 发送红外信号 * @param signal 要发送的红外信号结构体 * @return bool 发送是否成功 * - true: 发送成功 * - false: 发送失败(信号无效或为空) */ bool sendIRSignal(const IRSignal& signal); /** * 释放IRSignal结构体中分配的内存 * @param signal 要释放的信号结构体 */ void freeIRSignal(IRSignal& signal); /** * 复制红外信号 * @param source 源信号 * @return IRSignal 复制的信号 * * 注意:调用者需要在使用完毕后调用 freeIRSignal() 释放内存 */ IRSignal copyIRSignal(const IRSignal& source); /** * 打印红外信号数据(用于调试) * @param signal 要打印的信号 * @param maxPrint 最大打印数量,0表示打印全部 */ void printIRSignal(const IRSignal& signal, int maxPrint = 20); /** * 验证红外信号是否有效 * @param signal 要验证的信号 * @return bool 信号是否有效 */ bool isValidIRSignal(const IRSignal& signal); #endif // IR_CONTROL_H