A/C не обнаруживает ИК-коды, отправленные из Arduino
Есть ИК-приемник и ИК-светодиод, которые я достал из комплекта (у меня нет спецификаций для них).
Я загрузил скетч Arduino, чтобы записать свои ИК-коды A/Cs. Это были закодированные NEC 32-битные целые числа.
Записав коды, я попробовал их ретранслировать. Кондиционер не смог обнаружить эти сигналы.
Немного поискав неисправности, я отправил код с Arduino на скетч приемника с предыдущего шага - он их успешно получил.
Во всех вышеперечисленных шагах использовалась библиотека IRremote Arduino
Вопрос в том, чем можно объяснить такое поведение? Несколько возможностей, которые я имел в виду:
- ИК-частота. Может быть, схема обнаружения работала с настройками по умолчанию, а передача-нет?
- Длина волны ИК-излучения. Есть ли шанс, что сторона кондиционера вообще не обнаружит мои ИК-импульсы?
- Декодирование/кодирование протокола NEC в IRremote. Если нет стандарта для протокола NEC, то реализация Arduino и A/C может немного отличаться.
@omribahumi, 👍3
Обсуждение1 ответ
Привет, я сделал то же самое. Я использовал это, чтобы получить коды переменного тока для переменного тока GREE. Я нахожу это с двухнедельной борьбой и форумом под названием AnalysIR. Если вы обнаружите какие-либо проблемы в этом коде ниже или методе, дайте мне знать.
Коды переменного тока обычно длинные, и они не соответствуют коду, который вы использовали выше, поэтому я даю вам пример кода для запуска в скетче Arduino, чтобы вы могли протестировать.
#define LEDPIN 13
//вы можете увеличить это значение на ардуино с объемом памяти более 2 кб
#define maxLen 800
volatile unsigned int irBuffer[maxLen];
//сохраняет временные интервалы - изменчивые, потому что изменены ISR
volatile unsigned int x = 0;
//Указатель через irBuffer - изменчив, потому что изменен ISR
void setup() {
Serial.begin(115200); //при необходимости измените скорость передачи данных
attachInterrupt(0, rxIR_Interrupt_Handler, CHANGE);
//настройка ISR для приема ИК-сигнала
}
void loop() {
Serial.println(F("Нажмите кнопку на пульте дистанционного управления сейчас - только один раз"));
delay(5000); // пауза 5 секунд
if (x) { //если сигнал записан
digitalWrite(LEDPIN, HIGH);//визуальный индикатор того, что сигнал получен
Serial.println();
Serial.print(F("Raw: (")); //формат необработанного заголовка дампа - для
Serial.print((x - 1));
Serial.print(F(") "));
detachInterrupt(0);//остановить прерывания и захват до завершения здесь
for (int i = 1; i < x; i++) { //now dump the times
if (!(i & 0x1)) Serial.print(F("-"));
Serial.print(irBuffer[i] - irBuffer[i - 1]);
Serial.print(F(", "));
}
x = 0;
Serial.println();
Serial.println();
digitalWrite(LEDPIN, LOW);//конец визуального индикатора, для этого времени
attachInterrupt(0, rxIR_Interrupt_Handler, CHANGE);///повторно включите ISR для приема ИК-сигнала
}
}
void rxIR_Interrupt_Handler() {
if (x > maxLen) return; //игнорировать, если irBuffer уже заполнен
irBuffer[x++] = micros(); //просто постоянно записывайте временную метку переходов сигналов
}
Как только это будет сделано, вы получите правильный код, чтобы отправить его в AC.
Немного хитрая часть
как только вы получите коды необработанных значений, вам придется немного изменить их, например, я получил необработанные значения и преобразовал их в массив.
Что я получил, например Сырье (16): -27750, 4464, 696, 1612, 692, 516, 688, 516, 688, 1620, 692, 512, 692, 1612, 696, 1612, 692, 512, 692, 516, 688, 1616, 696, 1612, 692, 512, 696, 512, 692, 512, 692, 512, 696, 512, 692, 512, 692, 512, 696, 512, 692, 512, 692, 512, 696, 1612, 692, 1612, 692, 516, 688, 516, 692, 516, 688, 516, 688, 516, 692, 1612, 692, 516, 688, 1620, 688, 516, 688, 520, 684, 1620, 660, 544, 664, 19960, 628, 1680, 628, 1676, 628, 580, 628, 1676, 628, 580, 624, 580, 628, 576, 628, 580, 628, 584, 620, 576, 628, 580, 628, 576, 628, 576, 628, 580, 624, 1680, 628, 580, 624, 580, 628, 580, 624, 580, 628, 576, 628, 580, 624, 580, 628, 576, 628, 580, 628, 576, 628, 580, 624, 580, 628, 576, 628, 1680, 624, 580, 628, 1676, 628, 1680, 628
Чтобы преобразовать вышеуказанные необработанные значения в массив, удалите первое значение -27750 и вместо него поставьте 3800. Ниже приведен образец массива.**
беззнаковый инт сведения[] = {3800, 4464, 696, 1612, 692, 516, 688, 516, 688, 1620, 692, 512, 692, 1612, 696, 1612, 692, 512, 692, 516, 688, 1616, 696, 1612, 692, 512, 696, 512, 692, 512, 692, 512, 696, 512, 692, 512, 692, 512, 696, 512, 692, 512, 692, 512, 696, 1612, 692, 1612, 692, 516, 688, 516, 692, 516, 688, 516, 688, 516, 692, 1612, 692, 516, 688, 1620, 688, 516, 688, 520, 684, 1620, 660, 544, 664, 19960, 628, 1680, 628, 1676, 628, 580, 628, 1676, 628, 580, 624, 580, 628, 576, 628, 580, 628, 584, 620, 576, 628, 580, 628, 576, 628, 576, 628, 580, 624, 1680, 628, 580, 624, 580, 628, 580, 624, 580, 628, 576, 628, 580, 624, 580, 628, 576, 628, 580, 628, 576, 628, 580, 624, 580, 628, 576, 628, 1680, 624, 580, 628, 1676, 628, 1680, 628, };
Теперь, отправляя эти значения на ИК-передатчик, используйте следующий код.
#include<IRremote.h>
IRsend irsend;
int KHz = 38; // частота по умолчанию
unsigned int data[] = {3800, 4464, 696, 1612, 692, 516, 688, 516, 688, 1620, 692, 512, 692, 1612, 696, 1612, 692, 512, 692, 516, 688, 1616, 696, 1612, 692, 512, 696, 512, 692, 512, 692, 512, 696, 512, 692, 512, 692, 512, 696, 512, 692, 512, 692, 512, 696, 1612, 692, 1612, 692, 516, 688, 516, 692, 516, 688, 516, 688, 516, 692, 1612, 692, 516, 688, 1620, 688, 516, 688, 520, 684, 1620, 660, 544, 664, 19960, 628, 1680, 628, 1676, 628, 580, 628, 1676, 628, 580, 624, 580, 628, 576, 628, 580, 628, 584, 620, 576, 628, 580, 628, 576, 628, 576, 628, 580, 624, 1680, 628, 580, 624, 580, 628, 580, 624, 580, 628, 576, 628, 580, 624, 580, 628, 576, 628, 580, 628, 576, 628, 580, 624, 580, 628, 576, 628, 1680, 624, 580, 628, 1676, 628, 1680, 628,
};
void setup()
{
Serial.begin(9600);
irsend.enableIROut(38);
}
void loop()
{
for (int i=0; i<1 ; i++){
irsend.sendRaw(data, sizeof(data) / sizeof(int),38 );
delay(40);
}
}
- Нужна помощь с функцией отправки Arduino IR Remote
- Использование VS1838B с Arduino
- Как запомнить значения переменных после перезагрузки платы Arduino Uno R3
- Как выбрать вывод передачи в библиотеке IRremote для Arduino Uno?
- Как увеличить расстояние обнаружения на датчике обхода препятствий Arduino KY-032?
- Ошибка "collect2.exe: error: ld returned 1 exit status"
- Ethernet nodemcu
- Как подключить ИК-передатчик и модуль приемника?
Это кондиционер NEC? Я думаю, что в ИК - библиотеке есть "сырой" режим-вы могли бы попробовать его, который более точно воспроизводит то, что он получил. Я думаю, что ваши решения (1) и (2) немного маловероятны, но выполнимы., @Nick Gammon
Вы можете попробовать другую библиотеку: http://tech.cyborg5.com/irlib/, @Nick Gammon
4. диапазон. Ик-светодиод, который вы используете, может быть намного слабее, чем тот, что находится на пульте дистанционного управления. Попробуйте поместить arduino прямо рядом с блоком переменного тока., @Gerben
@NickGammon Это не кондиционер NEC. Он просто использует ИК-протокол NEC. Что касается вашего предложения о режиме RAW, то я попробовал его использовать, но приемник raw генерирует как отрицательные, так и положительные значения. Я попробую сделать это еще раз и попробую также в другой библиотеке. Спасибо!, @omribahumi
ПРИВЕТ Я поставил свой ответ по ссылке ниже. https://stackoverflow.com/questions/44528781/clone-remote-using-arduino-with-the-irremote-library/45955124#45955124 Пожалуйста, дайте мне знать, если это работает для вас. Дай мне знать, если тебе понадобится помощь., @Ourang-Zeb Khan
Простая яркость также является проблемой. Пробовали ли вы различные положения светодиода по отношению к датчику? Понижение значения токоограничивающего резистора?, @Lee Daniel Crocker