109 lines
3.4 KiB
C
109 lines
3.4 KiB
C
#ifndef IR_CONTROL_H
|
||
#define IR_CONTROL_H
|
||
|
||
#include <Arduino.h>
|
||
#include "driver/rmt.h"
|
||
#include "driver/gpio.h"
|
||
#include <IRrecv.h>
|
||
#include <IRutils.h>
|
||
|
||
// 红外信号结构体
|
||
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
|