Files
Dorm-Air-Conditioner-Smart-…/ir_control.h
2025-09-23 23:58:49 +08:00

109 lines
3.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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