Compare commits
	
		
			2 Commits
		
	
	
		
			30585041b6
			...
			e1a749a8cd
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e1a749a8cd | |||
| b3c6b4cde9 | 
@@ -190,8 +190,11 @@ void sendStoredIRSignal(String buttonName) {
 | 
				
			|||||||
// 从字符串解析红外信号
 | 
					// 从字符串解析红外信号
 | 
				
			||||||
IRSignal parseIRSignalFromString(String dataStr) {
 | 
					IRSignal parseIRSignalFromString(String dataStr) {
 | 
				
			||||||
  IRSignal signal;
 | 
					  IRSignal signal;
 | 
				
			||||||
  signal.data = nullptr;
 | 
					  signal.markTimes = nullptr;
 | 
				
			||||||
  signal.length = 0;
 | 
					  signal.spaceTimes = nullptr;
 | 
				
			||||||
 | 
					  signal.markCount = 0;
 | 
				
			||||||
 | 
					  signal.spaceCount = 0;
 | 
				
			||||||
 | 
					  signal.carrierFreq = IR_CARRIER_FREQ;
 | 
				
			||||||
  signal.isValid = false;
 | 
					  signal.isValid = false;
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  if (dataStr.length() == 0) {
 | 
					  if (dataStr.length() == 0) {
 | 
				
			||||||
@@ -203,11 +206,11 @@ IRSignal parseIRSignalFromString(String dataStr) {
 | 
				
			|||||||
  for (int i = 0; i < dataStr.length(); i++) {
 | 
					  for (int i = 0; i < dataStr.length(); i++) {
 | 
				
			||||||
    if (dataStr[i] == ',') commaCount++;
 | 
					    if (dataStr[i] == ',') commaCount++;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  signal.length = commaCount + 1;
 | 
					  int totalLength = commaCount + 1;
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  // 分配内存
 | 
					  // 分配临时内存存储原始数据
 | 
				
			||||||
  signal.data = (unsigned int*)malloc(signal.length * sizeof(unsigned int));
 | 
					  unsigned int* tempData = (unsigned int*)malloc(totalLength * sizeof(unsigned int));
 | 
				
			||||||
  if (signal.data == nullptr) {
 | 
					  if (tempData == nullptr) {
 | 
				
			||||||
    return signal;
 | 
					    return signal;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
@@ -217,27 +220,78 @@ IRSignal parseIRSignalFromString(String dataStr) {
 | 
				
			|||||||
  for (int i = 0; i <= dataStr.length(); i++) {
 | 
					  for (int i = 0; i <= dataStr.length(); i++) {
 | 
				
			||||||
    if (i == dataStr.length() || dataStr[i] == ',') {
 | 
					    if (i == dataStr.length() || dataStr[i] == ',') {
 | 
				
			||||||
      String valueStr = dataStr.substring(startPos, i);
 | 
					      String valueStr = dataStr.substring(startPos, i);
 | 
				
			||||||
      signal.data[index] = valueStr.toInt();
 | 
					      tempData[index] = valueStr.toInt();
 | 
				
			||||||
      index++;
 | 
					      index++;
 | 
				
			||||||
      startPos = i + 1;
 | 
					      startPos = i + 1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
 | 
					  // 分离mark和space数据
 | 
				
			||||||
 | 
					  signal.markCount = (totalLength + 1) / 2;
 | 
				
			||||||
 | 
					  signal.spaceCount = totalLength / 2;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // 分配mark时间数组
 | 
				
			||||||
 | 
					  if (signal.markCount > 0) {
 | 
				
			||||||
 | 
					    signal.markTimes = (unsigned int*)malloc(signal.markCount * sizeof(unsigned int));
 | 
				
			||||||
 | 
					    if (signal.markTimes == nullptr) {
 | 
				
			||||||
 | 
					      free(tempData);
 | 
				
			||||||
 | 
					      return signal;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    for (int i = 0; i < signal.markCount; i++) {
 | 
				
			||||||
 | 
					      signal.markTimes[i] = tempData[i * 2];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // 分配space时间数组
 | 
				
			||||||
 | 
					  if (signal.spaceCount > 0) {
 | 
				
			||||||
 | 
					    signal.spaceTimes = (unsigned int*)malloc(signal.spaceCount * sizeof(unsigned int));
 | 
				
			||||||
 | 
					    if (signal.spaceTimes == nullptr) {
 | 
				
			||||||
 | 
					      if (signal.markTimes != nullptr) {
 | 
				
			||||||
 | 
					        free(signal.markTimes);
 | 
				
			||||||
 | 
					        signal.markTimes = nullptr;
 | 
				
			||||||
 | 
					        signal.markCount = 0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      free(tempData);
 | 
				
			||||||
 | 
					      return signal;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    for (int i = 0; i < signal.spaceCount; i++) {
 | 
				
			||||||
 | 
					      signal.spaceTimes[i] = tempData[i * 2 + 1];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  free(tempData);
 | 
				
			||||||
  signal.isValid = true;
 | 
					  signal.isValid = true;
 | 
				
			||||||
  return signal;
 | 
					  return signal;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 将红外信号转换为字符串
 | 
					// 将红外信号转换为字符串
 | 
				
			||||||
String irSignalToString(const IRSignal& signal) {
 | 
					String irSignalToString(const IRSignal& signal) {
 | 
				
			||||||
  if (!signal.isValid || signal.data == nullptr || signal.length == 0) {
 | 
					  if (!signal.isValid || 
 | 
				
			||||||
 | 
					      (signal.markTimes == nullptr && signal.spaceTimes == nullptr) || 
 | 
				
			||||||
 | 
					      (signal.markCount == 0 && signal.spaceCount == 0)) {
 | 
				
			||||||
    return "";
 | 
					    return "";
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  String result = "";
 | 
					  String result = "";
 | 
				
			||||||
  for (int i = 0; i < signal.length; i++) {
 | 
					  int maxCount = max(signal.markCount, signal.spaceCount);
 | 
				
			||||||
    if (i > 0) result += ",";
 | 
					  
 | 
				
			||||||
    result += String(signal.data[i]);
 | 
					  // 重建原始时序数据:交替输出mark和space
 | 
				
			||||||
 | 
					  for (int i = 0; i < maxCount; i++) {
 | 
				
			||||||
 | 
					    // 添加mark时间
 | 
				
			||||||
 | 
					    if (i < signal.markCount) {
 | 
				
			||||||
 | 
					      if (result.length() > 0) result += ",";
 | 
				
			||||||
 | 
					      result += String(signal.markTimes[i]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // 添加space时间
 | 
				
			||||||
 | 
					    if (i < signal.spaceCount) {
 | 
				
			||||||
 | 
					      if (result.length() > 0) result += ",";
 | 
				
			||||||
 | 
					      result += String(signal.spaceTimes[i]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  return result;
 | 
					  return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -751,7 +805,7 @@ void handleStartRecord() {
 | 
				
			|||||||
    prefs.putString(("ir_" + buttonName).c_str(), irDataStr);
 | 
					    prefs.putString(("ir_" + buttonName).c_str(), irDataStr);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    Serial.println("红外信号录入成功: " + buttonName);
 | 
					    Serial.println("红外信号录入成功: " + buttonName);
 | 
				
			||||||
    Serial.println("信号长度: " + String(signal.length));
 | 
					    Serial.println("mark数量: " + String(signal.markCount) + ", space数量: " + String(signal.spaceCount));
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    freeIRSignal(signal);
 | 
					    freeIRSignal(signal);
 | 
				
			||||||
    server.send(200, "application/json", "{\"success\":true}");
 | 
					    server.send(200, "application/json", "{\"success\":true}");
 | 
				
			||||||
@@ -768,7 +822,7 @@ void handleSendIR() {
 | 
				
			|||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  DynamicJsonDocument doc(200);
 | 
					  DynamicJsonDocument doc(26700);
 | 
				
			||||||
  deserializeJson(doc, server.arg("plain"));
 | 
					  deserializeJson(doc, server.arg("plain"));
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  String buttonName = doc["button"];
 | 
					  String buttonName = doc["button"];
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										405
									
								
								ir_control.cpp
									
									
									
									
									
								
							
							
						
						
									
										405
									
								
								ir_control.cpp
									
									
									
									
									
								
							@@ -1,169 +1,323 @@
 | 
				
			|||||||
#include "ir_control.h"
 | 
					#include "ir_control.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void initIRControl() {
 | 
					void initIRControl() {
 | 
				
			||||||
    pinMode(IR_RECEIVE_PIN, INPUT);
 | 
					    // 配置RMT发送通道
 | 
				
			||||||
    pinMode(IR_SEND_PIN, OUTPUT);
 | 
					    rmt_config_t rmt_tx_config = RMT_DEFAULT_CONFIG_TX((gpio_num_t)IR_SEND_PIN, RMT_TX_CHANNEL);
 | 
				
			||||||
    digitalWrite(IR_SEND_PIN, LOW);
 | 
					    rmt_tx_config.clk_div = RMT_CLK_DIV;
 | 
				
			||||||
 | 
					    rmt_tx_config.mem_block_num = RMT_MEM_BLOCK_NUM;
 | 
				
			||||||
 | 
					    rmt_tx_config.tx_config.carrier_en = RMT_TX_CARRIER_EN;
 | 
				
			||||||
 | 
					    rmt_tx_config.tx_config.carrier_freq_hz = RMT_TX_CARRIER_FREQ_HZ;
 | 
				
			||||||
 | 
					    rmt_tx_config.tx_config.carrier_duty_percent = RMT_TX_CARRIER_DUTY_PERCENT;
 | 
				
			||||||
 | 
					    rmt_tx_config.tx_config.carrier_level = RMT_TX_CARRIER_LEVEL;
 | 
				
			||||||
 | 
					    rmt_tx_config.tx_config.idle_level = RMT_IDLE_LEVEL;
 | 
				
			||||||
 | 
					    rmt_tx_config.tx_config.idle_output_en = true;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    Serial.println("红外控制模块初始化完成");
 | 
					    esp_err_t err = rmt_config(&rmt_tx_config);
 | 
				
			||||||
    Serial.print("接收引脚: ");
 | 
					    if (err != ESP_OK) {
 | 
				
			||||||
    Serial.println(IR_RECEIVE_PIN);
 | 
					        Serial.printf("RMT发送通道配置失败: %s\n", esp_err_to_name(err));
 | 
				
			||||||
    Serial.print("发送引脚: ");
 | 
					        return;
 | 
				
			||||||
    Serial.println(IR_SEND_PIN);
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    err = rmt_driver_install(RMT_TX_CHANNEL, 0, 0);
 | 
				
			||||||
 | 
					    if (err != ESP_OK) {
 | 
				
			||||||
 | 
					        Serial.printf("RMT发送驱动安装失败: %s\n", esp_err_to_name(err));
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // 配置RMT接收通道
 | 
				
			||||||
 | 
					    rmt_config_t rmt_rx_config = RMT_DEFAULT_CONFIG_RX((gpio_num_t)IR_RECEIVE_PIN, RMT_RX_CHANNEL);
 | 
				
			||||||
 | 
					    rmt_rx_config.clk_div = RMT_CLK_DIV;
 | 
				
			||||||
 | 
					    rmt_rx_config.mem_block_num = RMT_MEM_BLOCK_NUM;
 | 
				
			||||||
 | 
					    rmt_rx_config.rx_config.filter_en = RMT_RX_FILTER_EN;
 | 
				
			||||||
 | 
					    rmt_rx_config.rx_config.filter_ticks_thresh = RMT_RX_FILTER_THRESH_US;
 | 
				
			||||||
 | 
					    rmt_rx_config.rx_config.idle_threshold = RMT_RX_IDLE_THRESH_US;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    err = rmt_config(&rmt_rx_config);
 | 
				
			||||||
 | 
					    if (err != ESP_OK) {
 | 
				
			||||||
 | 
					        Serial.printf("RMT接收通道配置失败: %s\n", esp_err_to_name(err));
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    err = rmt_driver_install(RMT_RX_CHANNEL, 1000, 0);
 | 
				
			||||||
 | 
					    if (err != ESP_OK) {
 | 
				
			||||||
 | 
					        Serial.printf("RMT接收驱动安装失败: %s\n", esp_err_to_name(err));
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    Serial.println("红外控制模块初始化完成 (使用RMT)");
 | 
				
			||||||
 | 
					    Serial.printf("发送引脚: %d (RMT通道: %d)\n", IR_SEND_PIN, RMT_TX_CHANNEL);
 | 
				
			||||||
 | 
					    Serial.printf("接收引脚: %d (RMT通道: %d)\n", IR_RECEIVE_PIN, RMT_RX_CHANNEL);
 | 
				
			||||||
 | 
					    Serial.printf("载波频率: %d Hz\n", RMT_TX_CARRIER_FREQ_HZ);
 | 
				
			||||||
 | 
					    Serial.printf("时钟分辨率: %d us\n", RMT_CLK_DIV);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool checkIRSignalStart() {
 | 
					bool checkIRSignalStart() {
 | 
				
			||||||
    return (digitalRead(IR_RECEIVE_PIN) == LOW);
 | 
					    // 使用RMT检查是否有信号开始
 | 
				
			||||||
 | 
					    // 启动接收并检查是否立即有数据
 | 
				
			||||||
 | 
					    rmt_rx_start(RMT_RX_CHANNEL, true);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // 等待短时间检查是否有信号
 | 
				
			||||||
 | 
					    vTaskDelay(pdMS_TO_TICKS(1));
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // 获取RMT环形缓冲区句柄
 | 
				
			||||||
 | 
					    RingbufHandle_t rb = NULL;
 | 
				
			||||||
 | 
					    esp_err_t err = rmt_get_ringbuf_handle(RMT_RX_CHANNEL, &rb);
 | 
				
			||||||
 | 
					    if (err != ESP_OK) {
 | 
				
			||||||
 | 
					        rmt_rx_stop(RMT_RX_CHANNEL);
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // 检查RMT接收缓冲区是否有数据
 | 
				
			||||||
 | 
					    size_t rx_size = 0;
 | 
				
			||||||
 | 
					    rmt_item32_t* items = (rmt_item32_t*)xRingbufferReceive(rb, &rx_size, 0);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    bool hasSignal = (items != nullptr && rx_size > 0);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (items) {
 | 
				
			||||||
 | 
					        vRingbufferReturnItem(rb, (void*)items);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    rmt_rx_stop(RMT_RX_CHANNEL);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    return hasSignal;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
IRSignal receiveIRSignal() {
 | 
					IRSignal receiveIRSignal() {
 | 
				
			||||||
    IRSignal signal;
 | 
					    IRSignal signal;
 | 
				
			||||||
    signal.data = nullptr;
 | 
					    signal.markTimes = nullptr;
 | 
				
			||||||
    signal.length = 0;
 | 
					    signal.spaceTimes = nullptr;
 | 
				
			||||||
 | 
					    signal.markCount = 0;
 | 
				
			||||||
 | 
					    signal.spaceCount = 0;
 | 
				
			||||||
 | 
					    signal.carrierFreq = IR_CARRIER_FREQ;
 | 
				
			||||||
    signal.isValid = false;
 | 
					    signal.isValid = false;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    Serial.println("开始接收红外信号...");
 | 
					    Serial.println("开始接收红外信号 (使用RMT)...");
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // 分配内存存储信号数据
 | 
					    // 启动RMT接收
 | 
				
			||||||
    signal.data = (unsigned int*)malloc(MAX_SIGNAL_LENGTH * sizeof(unsigned int));
 | 
					    rmt_rx_start(RMT_RX_CHANNEL, true);
 | 
				
			||||||
    if (signal.data == nullptr) {
 | 
					    
 | 
				
			||||||
        Serial.println("内存分配失败");
 | 
					    // 获取RMT环形缓冲区句柄
 | 
				
			||||||
 | 
					    RingbufHandle_t rb = NULL;
 | 
				
			||||||
 | 
					    esp_err_t err = rmt_get_ringbuf_handle(RMT_RX_CHANNEL, &rb);
 | 
				
			||||||
 | 
					    if (err != ESP_OK) {
 | 
				
			||||||
 | 
					        Serial.printf("获取RMT缓冲区句柄失败: %s\n", esp_err_to_name(err));
 | 
				
			||||||
 | 
					        rmt_rx_stop(RMT_RX_CHANNEL);
 | 
				
			||||||
        return signal;
 | 
					        return signal;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    unsigned long startTime = micros();
 | 
					    // 等待接收数据
 | 
				
			||||||
    unsigned long lastChange = startTime;
 | 
					    size_t rx_size = 0;
 | 
				
			||||||
    bool currentState = HIGH;
 | 
					    rmt_item32_t* items = (rmt_item32_t*)xRingbufferReceive(rb, &rx_size, pdMS_TO_TICKS(RECEIVE_TIMEOUT_US / 1000));
 | 
				
			||||||
    bool lastState = HIGH;
 | 
					 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // 等待信号开始(第一个低电平)
 | 
					    if (items == nullptr || rx_size == 0) {
 | 
				
			||||||
    while (digitalRead(IR_RECEIVE_PIN) == HIGH && (micros() - startTime) < RECEIVE_TIMEOUT_US) {
 | 
					        Serial.println("RMT接收超时或无数据");
 | 
				
			||||||
        delayMicroseconds(10);
 | 
					        rmt_rx_stop(RMT_RX_CHANNEL);
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    if ((micros() - startTime) >= RECEIVE_TIMEOUT_US) {
 | 
					 | 
				
			||||||
        Serial.println("等待信号超时");
 | 
					 | 
				
			||||||
        free(signal.data);
 | 
					 | 
				
			||||||
        signal.data = nullptr;
 | 
					 | 
				
			||||||
        return signal;
 | 
					        return signal;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    Serial.println("检测到信号开始");
 | 
					    // 计算接收到的项目数量
 | 
				
			||||||
    lastChange = micros();
 | 
					    size_t item_count = rx_size / sizeof(rmt_item32_t);
 | 
				
			||||||
    lastState = LOW;
 | 
					    Serial.printf("接收到 %d 个RMT项目\n", item_count);
 | 
				
			||||||
    signal.length = 0;
 | 
					 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // 接收信号数据
 | 
					    if (item_count == 0) {
 | 
				
			||||||
    while (signal.length < MAX_SIGNAL_LENGTH) {
 | 
					        Serial.println("接收到的数据为空");
 | 
				
			||||||
        currentState = digitalRead(IR_RECEIVE_PIN);
 | 
					        vRingbufferReturnItem(rb, (void*)items);
 | 
				
			||||||
 | 
					        rmt_rx_stop(RMT_RX_CHANNEL);
 | 
				
			||||||
 | 
					        return signal;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // 分配临时数组存储时序数据
 | 
				
			||||||
 | 
					    unsigned int* tempData = (unsigned int*)malloc(item_count * 2 * sizeof(unsigned int));
 | 
				
			||||||
 | 
					    if (tempData == nullptr) {
 | 
				
			||||||
 | 
					        Serial.println("临时数据内存分配失败");
 | 
				
			||||||
 | 
					        vRingbufferReturnItem(rb, (void*)items);
 | 
				
			||||||
 | 
					        rmt_rx_stop(RMT_RX_CHANNEL);
 | 
				
			||||||
 | 
					        return signal;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    int tempLength = 0;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // 解析RMT数据项
 | 
				
			||||||
 | 
					    for (size_t i = 0; i < item_count; i++) {
 | 
				
			||||||
 | 
					        // 每个RMT项目包含两个时间段:level0的持续时间和level1的持续时间
 | 
				
			||||||
 | 
					        if (items[i].duration0 > 0 && tempLength < item_count * 2) {
 | 
				
			||||||
 | 
					            tempData[tempLength++] = items[i].duration0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (items[i].duration1 > 0 && tempLength < item_count * 2) {
 | 
				
			||||||
 | 
					            tempData[tempLength++] = items[i].duration1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // 释放RMT缓冲区
 | 
				
			||||||
 | 
					    vRingbufferReturnItem(rb, (void*)items);
 | 
				
			||||||
 | 
					    rmt_rx_stop(RMT_RX_CHANNEL);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (tempLength > 0) {
 | 
				
			||||||
 | 
					        // 分离mark和space时间
 | 
				
			||||||
 | 
					        signal.markCount = (tempLength + 1) / 2;  // 奇数索引是mark
 | 
				
			||||||
 | 
					        signal.spaceCount = tempLength / 2;       // 偶数索引是space
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if (currentState != lastState) {
 | 
					        // 分配mark时间数组
 | 
				
			||||||
            // 状态改变,记录持续时间
 | 
					        if (signal.markCount > 0) {
 | 
				
			||||||
            unsigned long duration = micros() - lastChange;
 | 
					            signal.markTimes = (unsigned int*)malloc(signal.markCount * sizeof(unsigned int));
 | 
				
			||||||
            signal.data[signal.length] = duration;
 | 
					            if (signal.markTimes == nullptr) {
 | 
				
			||||||
            signal.length++;
 | 
					                Serial.println("mark时间数组内存分配失败");
 | 
				
			||||||
 | 
					                free(tempData);
 | 
				
			||||||
 | 
					                return signal;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
            lastState = currentState;
 | 
					            // 复制mark时间(从索引0开始,每隔2个取一个)
 | 
				
			||||||
            lastChange = micros();
 | 
					            for (int i = 0; i < signal.markCount; i++) {
 | 
				
			||||||
 | 
					                signal.markTimes[i] = tempData[i * 2];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        // 检查是否信号结束(高电平持续时间过长)
 | 
					        // 分配space时间数组
 | 
				
			||||||
        if (currentState == HIGH && (micros() - lastChange) > SIGNAL_END_TIMEOUT_US) {
 | 
					        if (signal.spaceCount > 0) {
 | 
				
			||||||
            Serial.println("检测到信号结束");
 | 
					            signal.spaceTimes = (unsigned int*)malloc(signal.spaceCount * sizeof(unsigned int));
 | 
				
			||||||
            break;
 | 
					            if (signal.spaceTimes == nullptr) {
 | 
				
			||||||
 | 
					                Serial.println("space时间数组内存分配失败");
 | 
				
			||||||
 | 
					                if (signal.markTimes != nullptr) {
 | 
				
			||||||
 | 
					                    free(signal.markTimes);
 | 
				
			||||||
 | 
					                    signal.markTimes = nullptr;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                free(tempData);
 | 
				
			||||||
 | 
					                return signal;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            // 复制space时间(从索引1开始,每隔2个取一个)
 | 
				
			||||||
 | 
					            for (int i = 0; i < signal.spaceCount; i++) {
 | 
				
			||||||
 | 
					                signal.spaceTimes[i] = tempData[i * 2 + 1];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        // 总体超时检查
 | 
					 | 
				
			||||||
        if ((micros() - startTime) > RECEIVE_TIMEOUT_US) {
 | 
					 | 
				
			||||||
            Serial.println("接收总体超时");
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    if (signal.length > 0) {
 | 
					 | 
				
			||||||
        signal.isValid = true;
 | 
					        signal.isValid = true;
 | 
				
			||||||
        Serial.print("信号接收成功,长度: ");
 | 
					        Serial.printf("RMT信号接收成功,mark数量: %d, space数量: %d\n", signal.markCount, signal.spaceCount);
 | 
				
			||||||
        Serial.println(signal.length);
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        // 重新分配内存以节省空间
 | 
					 | 
				
			||||||
        signal.data = (unsigned int*)realloc(signal.data, signal.length * sizeof(unsigned int));
 | 
					 | 
				
			||||||
        if (signal.data == nullptr) {
 | 
					 | 
				
			||||||
            Serial.println("内存重新分配失败");
 | 
					 | 
				
			||||||
            signal.isValid = false;
 | 
					 | 
				
			||||||
            signal.length = 0;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        Serial.println("未接收到有效信号");
 | 
					        Serial.println("未接收到有效的RMT信号数据");
 | 
				
			||||||
        free(signal.data);
 | 
					 | 
				
			||||||
        signal.data = nullptr;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    free(tempData);
 | 
				
			||||||
    return signal;
 | 
					    return signal;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// generateCarrier函数已被RMT模块替代,不再需要
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool sendIRSignal(const IRSignal& signal) {
 | 
					bool sendIRSignal(const IRSignal& signal) {
 | 
				
			||||||
    if (!isValidIRSignal(signal)) {
 | 
					    if (!isValidIRSignal(signal)) {
 | 
				
			||||||
        Serial.println("信号无效,无法发送");
 | 
					        Serial.println("信号无效,无法发送");
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    Serial.println("开始发送红外信号...");
 | 
					    Serial.println("开始发送红外信号 (使用RMT)...");
 | 
				
			||||||
    Serial.print("信号长度: ");
 | 
					    Serial.printf("载波频率: %d Hz\n", signal.carrierFreq);
 | 
				
			||||||
    Serial.println(signal.length);
 | 
					    Serial.printf("mark数量: %d, space数量: %d\n", signal.markCount, signal.spaceCount);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // 禁用中断以确保精确的时序
 | 
					    // 计算需要的RMT项目数量
 | 
				
			||||||
    noInterrupts();
 | 
					    int maxCount = max(signal.markCount, signal.spaceCount);
 | 
				
			||||||
 | 
					    size_t item_count = maxCount;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    bool state = LOW; // 红外信号通常以低电平开始
 | 
					    // 分配RMT项目数组
 | 
				
			||||||
    
 | 
					    rmt_item32_t* items = (rmt_item32_t*)malloc(item_count * sizeof(rmt_item32_t));
 | 
				
			||||||
    for (int i = 0; i < signal.length; i++) {
 | 
					    if (items == nullptr) {
 | 
				
			||||||
        digitalWrite(IR_SEND_PIN, state);
 | 
					        Serial.println("RMT项目内存分配失败");
 | 
				
			||||||
        delayMicroseconds(signal.data[i]);
 | 
					        return false;
 | 
				
			||||||
        state = !state; // 切换状态
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // 确保最后是低电平
 | 
					    // 构建RMT数据项
 | 
				
			||||||
    digitalWrite(IR_SEND_PIN, LOW);
 | 
					    for (int i = 0; i < maxCount; i++) {
 | 
				
			||||||
 | 
					        items[i].level0 = 1;  // mark期间为高电平(载波调制)
 | 
				
			||||||
 | 
					        items[i].duration0 = (i < signal.markCount) ? signal.markTimes[i] : 0;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        items[i].level1 = 0;  // space期间为低电平(无载波)
 | 
				
			||||||
 | 
					        items[i].duration1 = (i < signal.spaceCount) ? signal.spaceTimes[i] : 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // 重新启用中断
 | 
					    // 发送RMT数据
 | 
				
			||||||
    interrupts();
 | 
					    esp_err_t err = rmt_write_items(RMT_TX_CHANNEL, items, item_count, true);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    Serial.println("信号发送完成");
 | 
					    if (err != ESP_OK) {
 | 
				
			||||||
 | 
					        Serial.printf("RMT发送失败: %s\n", esp_err_to_name(err));
 | 
				
			||||||
 | 
					        free(items);
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // 等待发送完成
 | 
				
			||||||
 | 
					    err = rmt_wait_tx_done(RMT_TX_CHANNEL, pdMS_TO_TICKS(1000));
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (err != ESP_OK) {
 | 
				
			||||||
 | 
					        Serial.printf("RMT发送等待超时: %s\n", esp_err_to_name(err));
 | 
				
			||||||
 | 
					        free(items);
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    free(items);
 | 
				
			||||||
 | 
					    Serial.println("RMT信号发送完成");
 | 
				
			||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void freeIRSignal(IRSignal& signal) {
 | 
					void freeIRSignal(IRSignal& signal) {
 | 
				
			||||||
    if (signal.data != nullptr) {
 | 
					    if (signal.markTimes != nullptr) {
 | 
				
			||||||
        free(signal.data);
 | 
					        free(signal.markTimes);
 | 
				
			||||||
        signal.data = nullptr;
 | 
					        signal.markTimes = nullptr;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    signal.length = 0;
 | 
					    if (signal.spaceTimes != nullptr) {
 | 
				
			||||||
 | 
					        free(signal.spaceTimes);
 | 
				
			||||||
 | 
					        signal.spaceTimes = nullptr;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    signal.markCount = 0;
 | 
				
			||||||
 | 
					    signal.spaceCount = 0;
 | 
				
			||||||
 | 
					    signal.carrierFreq = 0;
 | 
				
			||||||
    signal.isValid = false;
 | 
					    signal.isValid = false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
IRSignal copyIRSignal(const IRSignal& source) {
 | 
					IRSignal copyIRSignal(const IRSignal& source) {
 | 
				
			||||||
    IRSignal copy;
 | 
					    IRSignal copy;
 | 
				
			||||||
    copy.data = nullptr;
 | 
					    copy.markTimes = nullptr;
 | 
				
			||||||
    copy.length = 0;
 | 
					    copy.spaceTimes = nullptr;
 | 
				
			||||||
 | 
					    copy.markCount = 0;
 | 
				
			||||||
 | 
					    copy.spaceCount = 0;
 | 
				
			||||||
 | 
					    copy.carrierFreq = 0;
 | 
				
			||||||
    copy.isValid = false;
 | 
					    copy.isValid = false;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (!isValidIRSignal(source)) {
 | 
					    if (!isValidIRSignal(source)) {
 | 
				
			||||||
        return copy;
 | 
					        return copy;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // 分配内存
 | 
					    // 复制mark时间数组
 | 
				
			||||||
    copy.data = (unsigned int*)malloc(source.length * sizeof(unsigned int));
 | 
					    if (source.markCount > 0 && source.markTimes != nullptr) {
 | 
				
			||||||
    if (copy.data == nullptr) {
 | 
					        copy.markTimes = (unsigned int*)malloc(source.markCount * sizeof(unsigned int));
 | 
				
			||||||
        Serial.println("复制信号时内存分配失败");
 | 
					        if (copy.markTimes == nullptr) {
 | 
				
			||||||
        return copy;
 | 
					            Serial.println("复制mark时间数组时内存分配失败");
 | 
				
			||||||
 | 
					            return copy;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        for (int i = 0; i < source.markCount; i++) {
 | 
				
			||||||
 | 
					            copy.markTimes[i] = source.markTimes[i];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        copy.markCount = source.markCount;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // 复制数据
 | 
					    // 复制space时间数组
 | 
				
			||||||
    for (int i = 0; i < source.length; i++) {
 | 
					    if (source.spaceCount > 0 && source.spaceTimes != nullptr) {
 | 
				
			||||||
        copy.data[i] = source.data[i];
 | 
					        copy.spaceTimes = (unsigned int*)malloc(source.spaceCount * sizeof(unsigned int));
 | 
				
			||||||
 | 
					        if (copy.spaceTimes == nullptr) {
 | 
				
			||||||
 | 
					            Serial.println("复制space时间数组时内存分配失败");
 | 
				
			||||||
 | 
					            if (copy.markTimes != nullptr) {
 | 
				
			||||||
 | 
					                free(copy.markTimes);
 | 
				
			||||||
 | 
					                copy.markTimes = nullptr;
 | 
				
			||||||
 | 
					                copy.markCount = 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return copy;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        for (int i = 0; i < source.spaceCount; i++) {
 | 
				
			||||||
 | 
					            copy.spaceTimes[i] = source.spaceTimes[i];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        copy.spaceCount = source.spaceCount;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    copy.length = source.length;
 | 
					    copy.carrierFreq = source.carrierFreq;
 | 
				
			||||||
    copy.isValid = true;
 | 
					    copy.isValid = true;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    return copy;
 | 
					    return copy;
 | 
				
			||||||
@@ -176,33 +330,56 @@ void printIRSignal(const IRSignal& signal, int maxPrint) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    Serial.println("=== 红外信号数据 ===");
 | 
					    Serial.println("=== 红外信号数据 ===");
 | 
				
			||||||
    Serial.print("信号长度: ");
 | 
					    Serial.print("载波频率: ");
 | 
				
			||||||
    Serial.println(signal.length);
 | 
					    Serial.print(signal.carrierFreq);
 | 
				
			||||||
 | 
					    Serial.println(" Hz");
 | 
				
			||||||
 | 
					    Serial.print("mark数量: ");
 | 
				
			||||||
 | 
					    Serial.println(signal.markCount);
 | 
				
			||||||
 | 
					    Serial.print("space数量: ");
 | 
				
			||||||
 | 
					    Serial.println(signal.spaceCount);
 | 
				
			||||||
    Serial.print("信号有效: ");
 | 
					    Serial.print("信号有效: ");
 | 
				
			||||||
    Serial.println(signal.isValid ? "是" : "否");
 | 
					    Serial.println(signal.isValid ? "是" : "否");
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    int printCount = (maxPrint == 0) ? signal.length : min(maxPrint, signal.length);
 | 
					    // 打印mark时间
 | 
				
			||||||
    
 | 
					    int markPrintCount = (maxPrint == 0) ? signal.markCount : min(maxPrint, signal.markCount);
 | 
				
			||||||
    Serial.println("原始数据 (微秒):");
 | 
					    Serial.println("Mark时间 (微秒):");
 | 
				
			||||||
    for (int i = 0; i < printCount; i++) {
 | 
					    for (int i = 0; i < markPrintCount; i++) {
 | 
				
			||||||
        Serial.print("Index ");
 | 
					        Serial.print("Mark ");
 | 
				
			||||||
        Serial.print(i);
 | 
					        Serial.print(i);
 | 
				
			||||||
        Serial.print(": ");
 | 
					        Serial.print(": ");
 | 
				
			||||||
        Serial.print(signal.data[i]);
 | 
					        Serial.print(signal.markTimes[i]);
 | 
				
			||||||
        Serial.print(" us (");
 | 
					        Serial.println(" us");
 | 
				
			||||||
        Serial.print((i % 2 == 0) ? "LOW" : "HIGH");
 | 
					 | 
				
			||||||
        Serial.println(")");
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (printCount < signal.length) {
 | 
					    if (markPrintCount < signal.markCount) {
 | 
				
			||||||
        Serial.print("... 还有 ");
 | 
					        Serial.print("... 还有 ");
 | 
				
			||||||
        Serial.print(signal.length - printCount);
 | 
					        Serial.print(signal.markCount - markPrintCount);
 | 
				
			||||||
        Serial.println(" 个数据点未显示");
 | 
					        Serial.println(" 个mark数据点未显示");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // 打印space时间
 | 
				
			||||||
 | 
					    int spacePrintCount = (maxPrint == 0) ? signal.spaceCount : min(maxPrint, signal.spaceCount);
 | 
				
			||||||
 | 
					    Serial.println("Space时间 (微秒):");
 | 
				
			||||||
 | 
					    for (int i = 0; i < spacePrintCount; i++) {
 | 
				
			||||||
 | 
					        Serial.print("Space ");
 | 
				
			||||||
 | 
					        Serial.print(i);
 | 
				
			||||||
 | 
					        Serial.print(": ");
 | 
				
			||||||
 | 
					        Serial.print(signal.spaceTimes[i]);
 | 
				
			||||||
 | 
					        Serial.println(" us");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (spacePrintCount < signal.spaceCount) {
 | 
				
			||||||
 | 
					        Serial.print("... 还有 ");
 | 
				
			||||||
 | 
					        Serial.print(signal.spaceCount - spacePrintCount);
 | 
				
			||||||
 | 
					        Serial.println(" 个space数据点未显示");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    Serial.println("==================");
 | 
					    Serial.println("==================");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool isValidIRSignal(const IRSignal& signal) {
 | 
					bool isValidIRSignal(const IRSignal& signal) {
 | 
				
			||||||
    return (signal.data != nullptr && signal.length > 0 && signal.isValid);
 | 
					    return (signal.isValid && 
 | 
				
			||||||
 | 
					            ((signal.markTimes != nullptr && signal.markCount > 0) || 
 | 
				
			||||||
 | 
					             (signal.spaceTimes != nullptr && signal.spaceCount > 0)) &&
 | 
				
			||||||
 | 
					            signal.carrierFreq > 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										36
									
								
								ir_control.h
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								ir_control.h
									
									
									
									
									
								
							@@ -2,12 +2,17 @@
 | 
				
			|||||||
#define IR_CONTROL_H
 | 
					#define IR_CONTROL_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <Arduino.h>
 | 
					#include <Arduino.h>
 | 
				
			||||||
 | 
					#include "driver/rmt.h"
 | 
				
			||||||
 | 
					#include "driver/gpio.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 红外信号结构体
 | 
					// 红外信号结构体
 | 
				
			||||||
struct IRSignal {
 | 
					struct IRSignal {
 | 
				
			||||||
    unsigned int* data;     // 原始信号数据数组(微秒)
 | 
					    unsigned int* markTimes;    // mark时间数组(微秒)
 | 
				
			||||||
    int length;            // 信号长度
 | 
					    unsigned int* spaceTimes;   // space时间数组(微秒)
 | 
				
			||||||
    bool isValid;          // 信号是否有效
 | 
					    int markCount;             // mark数量
 | 
				
			||||||
 | 
					    int spaceCount;            // space数量
 | 
				
			||||||
 | 
					    unsigned int carrierFreq;   // 载波频率(Hz)
 | 
				
			||||||
 | 
					    bool isValid;              // 信号是否有效
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 配置参数
 | 
					// 配置参数
 | 
				
			||||||
@@ -16,6 +21,22 @@ struct IRSignal {
 | 
				
			|||||||
#define MAX_SIGNAL_LENGTH 1000
 | 
					#define MAX_SIGNAL_LENGTH 1000
 | 
				
			||||||
#define RECEIVE_TIMEOUT_US 1000000  // 1秒接收超时
 | 
					#define RECEIVE_TIMEOUT_US 1000000  // 1秒接收超时
 | 
				
			||||||
#define SIGNAL_END_TIMEOUT_US 50000 // 50ms信号结束判断
 | 
					#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     // 接收空闲阈值(微秒)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 初始化红外控制模块
 | 
					 * 初始化红外控制模块
 | 
				
			||||||
@@ -33,9 +54,12 @@ bool checkIRSignalStart();
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 接收红外信号
 | 
					 * 接收红外信号
 | 
				
			||||||
 * @return IRSignal 包含原始红外信号数据的结构体
 | 
					 * @return IRSignal 包含红外信号mark/space时序和载波频率的结构体
 | 
				
			||||||
 *         - data: 指向信号数据数组的指针
 | 
					 *         - markTimes: 指向mark时间数组的指针
 | 
				
			||||||
 *         - length: 信号数据长度
 | 
					 *         - spaceTimes: 指向space时间数组的指针
 | 
				
			||||||
 | 
					 *         - markCount: mark数量
 | 
				
			||||||
 | 
					 *         - spaceCount: space数量
 | 
				
			||||||
 | 
					 *         - carrierFreq: 载波频率
 | 
				
			||||||
 *         - isValid: 是否成功接收到有效信号
 | 
					 *         - isValid: 是否成功接收到有效信号
 | 
				
			||||||
 * 
 | 
					 * 
 | 
				
			||||||
 * 注意:调用者需要在使用完毕后调用 freeIRSignal() 释放内存
 | 
					 * 注意:调用者需要在使用完毕后调用 freeIRSignal() 释放内存
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user