Помогите, пожалуйста!!! ИК передатчик на arduino.

alexaggs
Offline
Зарегистрирован: 19.01.2017

У меня есть плата Ардуино Уно, ИК светодиод и ИК приемник. С помощью ИК приемника я считал код с пульта (пульт не от телевизора). Мне надо этот же код передать через ИК светодиод на устройство. Облезал весь интернет, никак не могу найти скетч ((( Помогите, пожалуйста!!! Код с приемника - A25313D1.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

alexaggs пишет:

Облезал весь интернет, никак не могу найти скетч

Прямо весь?

Ну, а примеры к самой ходовой библиотеке IRremote смотрели? Там есть IRsendDemo, IRsendRawDemo и ещё штуки три.

alexaggs
Offline
Зарегистрирован: 19.01.2017
#include <IRremote.h>

IRsend irsend;

void setup()
{
}

void loop() {
	for (int i = 0; i < 3; i++) {
		irsend.sendSony(0xA25313D1, 12);
		delay(40);
	}
	delay(5000); //5 second delay between each signal burst
}

Если смотреть через камеру - сведодиод горит, но устройство сигнал не распозноет. Что делать?

 

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Ну хорошо, пример вы нашли, теперь как и куда подключен ИК диод, да и что за диод ?.

alexaggs
Offline
Зарегистрирован: 19.01.2017

Обычный ИК диод. Подключен к 3 пину

alexaggs
Offline
Зарегистрирован: 19.01.2017
A25313D1
Unknown encoding: A25313D1 (32 bits)
Raw (10): 12900 -600 2100 -550 750 -1900 800 -1900 750 
 
alexaggs
Offline
Зарегистрирован: 19.01.2017

Ураааааа!!!

Как всё было просто!!! Заглянул в примеры и всё получилось! Спасибо!

alexaggs
Offline
Зарегистрирован: 19.01.2017

Подскажите, пожалуйста, я могу в одной программе считывать информацию с ИК приемник и посылать через ик светодиод?

Как это записать?

#include <IRremote.h>

IRrecv irrecv(8);

IRrecv irsend;

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

по той же ссылке два примера IRrecvDemo и IRSendDemo, обьедините их.

alexaggs
Offline
Зарегистрирован: 19.01.2017

У меня зависает. Не могу понять почему.

if (results.value==0xFF4AB5){//8

int khz = 38; // 38kHz carrier frequency for the NEC protocol
unsigned int irSignal[] = {12900,600,2100,550,750,1900,800,1900,750}; //AnalysIR Batch Export (IRremote) - RAW
irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); //Note the approach used to automatically calculate the size of the array.

};

 

alexaggs
Offline
Зарегистрирован: 19.01.2017

При нажатия на кнопку (FF4AB5) ардуино полностью зависает. 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

alexaggs пишет:

Подскажите, пожалуйста, я могу в одной программе считывать информацию с ИК приемник и посылать через ик светодиод?

Да, кто ж Вас знает, можете Вы или нет?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Какими то не понятными кусками кидаетесь и просите о помощи.

В сервис приходите тоже со шнуром зарядки и просите починить телефон ?

alexaggs
Offline
Зарегистрирован: 19.01.2017
#include <IRremote.h>
#include <IRremoteInt.h>
IRsend irsend;

IRrecv irrecv(8);
decode_results results;
int re = 0;
void setup() {
 
  Serial.begin(9600);   
  irrecv.enableIRIn();    
}

void loop() {
 if(re == 1){
  int khz = 38; // 38kHz carrier frequency for the NEC protocol
unsigned int irSignal[] = {12900,600,2100,550,750,1900,800,1900,750}; //AnalysIR Batch Export (IRremote) - RAW
irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); //Note the approach used to automatically calculate the size of the array.
re = 0;
 };

   if ( irrecv.decode( &results )) { 
    Serial.println(results.value, HEX);
    
if (results.value==0xFF38C7){//5
re=1;
//delay(100);
}; 
 results.value=0;
     irrecv.resume();  
}; 
}

Вот исходный код.

Мне надо чтобы при нажатии на кнопку FF38C7 на пульте, ИК светодиод посылал код (12900,600,2100,550,750,1900,800,1900,750) на плеер. Вместо этого ardulino зависает.

3 порт - ИК светодиод, 8 порт - ИК приемник.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Как Вы определяете что зависает ?

Прошейте это 

#include <IRremote.h>
#include <IRremoteInt.h>

IRsend irsend;
IRrecv irrecv(8);
decode_results results;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop() {
  if ( irrecv.decode( &results )) {
    Serial.println(results.value, HEX);
    if (results.value == 0xFF38C7) {
      Serial.println("Send ...");
      int khz = 38; // 38kHz carrier frequency for the NEC protocol
      unsigned int irSignal[] = {12900, 600, 2100, 550, 750, 1900, 800, 1900, 750}; 
      irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); 
      Serial.println("End send ...");
    };
    results.value = 0;
    irrecv.resume();
  };
}

Что монитор порта выдает ?

alexaggs
Offline
Зарегистрирован: 19.01.2017

При нажатии на кнопку монитор порта выводит  FF38C7. Светодиод так и не загорается, а все последующие команды игнорируются.

alexaggs
Offline
Зарегистрирован: 19.01.2017

Это ответ на первый вопрос.

alexaggs
Offline
Зарегистрирован: 19.01.2017

xDriver пишет:

Что монитор порта выдает ?

FF38C7
Send ...
End send ...
 
 
 
А потом также зависает.
alexaggs
Offline
Зарегистрирован: 19.01.2017

Но светодиод не загорается...

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

поехали дальше

#include <IRremote.h>
#include <IRremoteInt.h>

IRsend irsend;
IRrecv irrecv(8);
decode_results results;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop() {
  if ( irrecv.decode( &results )) {
    Serial.println(results.value, HEX);
    if (results.value == 0xFF38C7) {
      Serial.println("Send ...");
      int khz = 38; // 38kHz carrier frequency for the NEC protocol
      unsigned int irSignal[] = {12900, 600, 2100, 550, 750, 1900, 800, 1900, 750}; 
      irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); 
      Serial.println("End send ...");
    };
    irrecv.resume();
  };
  delay(100);
};

 

alexaggs
Offline
Зарегистрирован: 19.01.2017

Тоже самое...

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

xDriver, не мучтесь. Или Вам надо самому писать или ТС надо "слушать валенки". Там требуется не такая квалификация, как у ТС.

Приёмник и передатчик используют один и тот же таймер, причём конфигурируют его по-разному. Чтобы они могли работать, надо чётко разделить по времени приём и передачу.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ЕвгенийП пишет:

xDriver, не мучтесь. Или Вам надо самому писать или ТС надо "слушать валенки". Там требуется не такая квалификация, как у ТС.

Приёмник и передатчик используют один и тот же таймер, причём конфигурируют его по-разному. Чтобы они могли работать, надо чётко разделить по времени приём и передачу.

Да спасибо, я как то и не подумал пристально глянуть в эту библу, а там во оно что...

alexaggs
Offline
Зарегистрирован: 19.01.2017
#include <IRremote.h>
#include <IRremoteInt.h>
IRsend irsend;

IRrecv irrecv(8);
decode_results results;
int re = 0;
void setup() {
 
  Serial.begin(9600);   
  irrecv.enableIRIn();    
}

void loop() {
 if(re == 1){
  int khz = 38; // 38kHz carrier frequency for the NEC protocol
unsigned int irSignal[] = {12900,600,2100,550,750,1900,800,1900,750}; //AnalysIR Batch Export (IRremote) - RAW
irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); //Note the approach used to automatically calculate the size of the array.
re = 0;
 };

   if ( irrecv.decode( &results )) { 
    Serial.println(results.value, HEX);
    
if (results.value==0xFF38C7){//5
re=1;
delay(1000);
}; 
 results.value=0;
     irrecv.resume();  
}; 
}

 

alexaggs
Offline
Зарегистрирован: 19.01.2017

Здесь приемник получает код, ждет 10 секунд и включает светодиод, но arduino всё равно зависает. Почему так?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

я так понял задержку надо ставить после отправки, чтобы успели уйти данные по таймеру

после 18 строки сделайте задержку в 500-1000 ms

это кривой подход, но просто интересно.

alexaggs
Offline
Зарегистрирован: 19.01.2017

xDriver пишет:

я так понял задержку надо ставить после отправки, чтобы успели уйти данные по таймеру

после 18 строки сделайте задержку в 500-1000 ms

это кривой подход, но просто интересно.


Не помогло....

alexaggs
Offline
Зарегистрирован: 19.01.2017

Задержка 5 сек

alexaggs
Offline
Зарегистрирован: 19.01.2017

Светодиод я выпоял из пульта управления, если что

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

alexaggs пишет:
Светодиод я выпоял из пульта управления, если что

а, резистор откуда выпоял?

alexaggs
Offline
Зарегистрирован: 19.01.2017

резистор взял из набора ардуино 220R

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Насколько помню, если в скетче есть прием и отправка кодов, то нужно выполнять irrecv.enableIRIn(); перед приемом, иначе прием не будет работать. Они одновременно НЕ работают.

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015
alexaggs
Offline
Зарегистрирован: 19.01.2017

kisoft пишет:

Насколько помню, если в скетче есть прием и отправка кодов, то нужно выполнять irrecv.enableIRIn(); перед приемом, иначе прием не будет работать. Они одновременно НЕ работают.

 

Большое спасибо!!!!!

Добавил irrecv.enableIRIn(); и заработало.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

xDriver пишет:

точно

https://geektimes.ru/post/271860/

Блин, так я же вчера ещё писал Вам, что они по-разному таймер конфигурируюти что разделять надо.

Вроде ж понятно, дернул за запись, она сконфигурировала таймер под себя. Надо читать - заново переинициализируй, чтобы таймер сконфигурировать. Я как-то непонятно написал? Впредь по другому формулировать?

alexaggs
Offline
Зарегистрирован: 19.01.2017

Если вдруг надо будет, вот код:

#include <IRremote.h>
#include <IRremoteInt.h>
IRsend irsend;

IRrecv irrecv(8);
decode_results results;
int re = 0;
void setup() {
 
  Serial.begin(9600);   
  irrecv.enableIRIn();    
}

void loop() {
 if(re == 1){
  int khz = 38; // 38kHz carrier frequency for the NEC protocol
unsigned int irSignal[] = {12900,600,2100,550,750,1900,800,1900,750}; //AnalysIR Batch Export (IRremote) - RAW
irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); //Note the approach used to automatically calculate the size of the array.
re = 0;
irrecv.enableIRIn();
 };

   if ( irrecv.decode( &results )) { 
    Serial.println(results.value, HEX);
    
if (results.value==0xFF38C7){//5
re=1;
}; 
 results.value=0;
     irrecv.resume();  
}; 

}

 

avens
Offline
Зарегистрирован: 14.09.2017
Как переводить/узнать код IR кнопки типа 0xFF4AB5 в значиние: "12900,600,2100,550,750,1900,800,1900,750"  ?
unsigned int irSignal[] = {12900,600,2100,550,750,1900,800,1900,750}; //AnalysIR Batch Export (IRremote) - RAW

 

 
len261187
Offline
Зарегистрирован: 06.11.2019

Добрый день!

Сталкнулся с аналогичной проблемой. Имеется код, сформированный при помощи программы FLprog. При отправки сигала с пульта, плата реагирует, светодиод моргает, после отправки сигнала с ИК передатчика платы, плата встает. Не могу понять, куда нужно вставить enableIRIn(), если дело в нем...

Есть у кого решение? спасибо!


[

[code]
#include <IRremote.h>
IRrecv irRessPin12(12);
decode_results irRessPin12Res;
bool irRessPin12807F807F = 0;
bool irRessPin12807FC03F = 0;

IRsend _IR_Sender;
bool _IR_Sender_1_TOI_27295198 = 0;
bool _IR_Sender_1_TOI_152559420 = 0;
bool _trgt1 = 0;
bool _trgt1I = 0;
void setup()
{
pinMode(8, INPUT_PULLUP); 
pinMode(4, OUTPUT); 

irRessPin12.enableIRIn();
}
void loop()
{ if (irRessPin12.decode(&irRessPin12Res)) {
irRessPin12FillVar(&irRessPin12Res);
irRessPin12.resume(); }else {irRessPin12ResVar(); }





//Плата:1
if (!( (digitalRead (8)))) {if (!(_IR_Sender_1_TOI_27295198)) {_irSend(0x807F807F, NEC, 32);}
_IR_Sender_1_TOI_27295198 = 1;} else {_IR_Sender_1_TOI_27295198 =0;}
if (0) {if (!(_IR_Sender_1_TOI_152559420)) {_irSend(0x807FC03F, NEC, 32);}
_IR_Sender_1_TOI_152559420 = 1;} else {_IR_Sender_1_TOI_152559420 =0;}
bool  _tmp1 = irRessPin12807F807F;
if (_tmp1)  { if (! _trgt1I) _trgt1 = ! _trgt1; } 
_trgt1I = _tmp1; 
digitalWrite(4, !(_trgt1));




}
void irRessPin12FillVar(decode_results *irRessPin12Res) {
long tempRes;
byte tempType;
tempRes=(irRessPin12Res->value); 
tempType=(irRessPin12Res->decode_type); 
if(!(tempRes == -1)) {if ((tempRes == (0x807F807F))&&(tempType == NEC)) {irRessPin12807F807F = 1;} else {irRessPin12807F807F=0;}
if ((tempRes == (0x807FC03F))&&(tempType == NEC)) {irRessPin12807FC03F = 1;} else {irRessPin12807FC03F=0;}
}}
void irRessPin12ResVar() {
irRessPin12807F807F = 0;
irRessPin12807FC03F = 0;
}

void _irSend(long code, byte manufactureCode, byte length)
{
switch (manufactureCode) {
    case NEC :
_IR_Sender.sendNEC(code, length) ;
    break;
  }}
[/code]


 

sadman41
Offline
Зарегистрирован: 19.10.2016

if (0) - это, вообще, что?

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

sadman41 пишет:

if (0) - это, вообще, что?

Или Вас что-то смущает? Вполне законный оператор, спросите у Рабиновича.

sadman41
Offline
Зарегистрирован: 19.10.2016

Я таки переживаю, зачем он стоит там, вместо того, чтобы быть на строке #1.