ИК ретранслятор с заменой кода сигнала (в ардуинке новичек))

romiras
Offline
Зарегистрирован: 12.07.2015

Друзья, подскажите как правильно дописать код для ардуинки, принимающего сигнал по ИК с одного пульта, после обработки в нужный код сигнала от другого пульта - отправляет его на тв по ик.  Коды с пультов уже считаны. В моей реализации кода при повторном нажатии одной и тоже кнопки - сигнал не передается((( Я не программист, поэтому прошу помощи!))

вот код

#include <IRremote.h>
IRrecv irrecv(7); // указываем вывод, к которому подключен приемник
IRsend irsend;
decode_results results;
int lastPressedKey=0; 
void setup()
{
   irrecv.enableIRIn(); // запускаем прием
int lastPressedKey=0; //  тут будем запоминать последнюю нажатую клавишу, что-бы знать что делать, если пришел код повторения.
  }
void loop() {
  if ( irrecv.decode( &results )) { // если данные пришли
   int keyCode=results.value;
   if(keyCode==REPEAT) keyCode=lastPressedKey; // пришел код ПОВТОРЕНИЕ, значит нужно сделать вид что еще раз нажали предыдущую клавишу.
   else  lastPressedKey=keyCode; // запоминаем код реальной клавиши, для последнующего повторения<br>
  {
  if (results.value == 0x8C837) //код моей кнопки
  

    irsend.sendRC6(0x3D2D,20); // code
      
           
   
      } 
      irrecv.resume();
     
  }
}

 

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

После передачи, нужно снова переключиться на прием, т.е. выполнить команду из строки 08.

 

romiras
Offline
Зарегистрирован: 12.07.2015

Вставил, видимо не так(( Попробовал зацепить две кнопки, диод моргает, но сигнал не считывается

#include <IRremote.h>
IRrecv irrecv(7); // указываем вывод, к которому подключен приемник
IRsend irsend;
decode_results results;
int lastPressedKey=0; 
void setup()
{
   irrecv.enableIRIn(); // запускаем прием
int lastPressedKey=0; //  тут будем запоминать последнюю нажатую клавишу, что-бы знать что делать, если пришел код повторения.
  }
void loop() {
  if ( irrecv.decode( &results )) { // если данные пришли
   int keyCode=results.value;
   if(keyCode==REPEAT) keyCode=lastPressedKey; // пришел код ПОВТОРЕНИЕ, значит нужно сделать вид что еще раз нажали предыдущую клавишу.
   else  lastPressedKey=keyCode; // запоминаем код реальной клавиши, для последнующего повторения<br>
  {
  if (results.value == 0x8C837) //код моей кнопки
  

    irsend.sendRC6(0x3D2D,20); // code
      
       irrecv.enableIRIn(); // запускаем прием
      
    
     if (results.value == 0x8A857) //код моей кнопки
  

    irsend.sendRC6(0x13D2D,20); // code
      
       irrecv.enableIRIn(); // запускаем прием
     
      } 
      irrecv.resume();
     
  }
}

 

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

Не "бойтесь" окружать код фигурными скобками:

#include <IRremote.h>

IRrecv irrecv(7); // указываем вывод, к которому подключен приемник
IRsend irsend;
decode_results results;

unsigned long lastPressedKey = 0;

void setup()
{
  irrecv.enableIRIn(); // запускаем прием
}

void loop() {
  if ( irrecv.decode( &results )) { // если данные пришли
    unsigned long keyCode = results.value;
    irrecv.resume();
    if (keyCode == REPEAT)
    {
      keyCode = lastPressedKey; // пришел код ПОВТОРЕНИЕ, значит нужно сделать вид что еще раз нажали предыдущую клавишу.
    }
    else
    {
      lastPressedKey = keyCode; // запоминаем код реальной клавиши, для последнующего повторения
    }
    if (keyCode == 0x8C837) { //код моей кнопки
      irsend.sendRC6(0x3D2D, 20); // code
      irrecv.enableIRIn(); // запускаем прием
    }
    else if (keyCode == 0x8A857) { //код моей кнопки
      irsend.sendRC6(0x13D2D, 20); // code
      irrecv.enableIRIn(); // запускаем прием
    }
  }
}

Код не проверял.

UPD: И есть хорошее сочетание клавиш Ctrl-T, чтобы текст выглядел более читабельно. Бардак в скетче - бардак в голове.

 

romiras
Offline
Зарегистрирован: 12.07.2015

Спасибо, все работает! 

satelit
Offline
Зарегистрирован: 12.12.2015

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

команды вкл, выбор входа, канал плюс, канал минус, громкость плюс, громкость минус, ентер, и еще шесть на рассмотрение.

в нете ничего путного не нашел. заранее благодарен

satelit
Offline
Зарегистрирован: 12.12.2015

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

 

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

Запускаем калькулятор, стандартный, виндовый. Включаем режим "Программист", выбираем DEC режим, вводим число, например, "12345", переключаемся в HEX и видим 3039. В десятке еще легче.

Контроллеру глубоко по барабану, в десятичном виде или в шестнадцатеричном. Это всё для программиста, удобство представления. В контроллере двоичная информация.

int a = 12345;

и

int a = 0x3039;

абсолютно одинаково понимаются контроллером.

 

satelit
Offline
Зарегистрирован: 12.12.2015

коды с интернета не прошли, 0021, 0061 и тд, скорее всего не хватает начала кода, которое одинаковое. Закодировал только пару кнопок для начала, для проверки, должно все работать, тк проверял через камеру телефона, при нажатии первой  и второй кнопки ик мигает а при остальных молчит. 

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Напишите, какие у вас пульты, а я постараюсь помочь. Во-первых нужно будет установить более новую библиотеку (ссылку дам), затем удалить другую библиотеку, по моему robot control. Сначала напишите, какие у вас пульты и думаю решим вашу задачу, я недавно занимался этой темой. Помню еще использовал транзистор кт315. С ардуинки подавал сигнал на базу транзистора через сопротивление 3,3 кОм. Эмиттер транзистора на землю. Далее к коллектору подключил катод излучающего ИК диода, а анод диода через сопротивление 100 Ом на +5В. Также подключал анод диода на +5в без резистора 100 Ом, диод выдержал такое испытание, т.к. излучает не постоянно.

 

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Заходим на страницу https://github.com/z3t0/Arduino-IRremote

Находим кнопку download ZIP, нажимаем на неё и скачивается  файл           Arduino-IRremote-master.zip. Затем распаковывать архив и получившуюся папку Arduino-IRremote-master переименовать в IRremote. Затем перенести ее в папку libraries. И удалить библиотеку robot_control. Обычно она мешает, так как в ней тоже есть библиотека похожая на IRremote.

Затем загружаем скетч IRrecord.ino на ардуино и включаем на ПК монитор com-порта и считываем кнопки пульта. ИК приемник должен быть подкличен на pin 11. Записываем коды кнопок.

Делаем проверку: загружаем скетч IRsendDemo.ino.

В строке    “for (int i = 0; i < 2; i++) {“  наверно цифру 2 нужно заменить на 1, так как без такого изменения команда будет выполняться дважды, не знаю бывают такие пульты или нет. И если мы будем использовать для проверки код кнопки включения электропитания, то двойное выполнение команды не даст результата. Поэтому лучше для проверки использовать код команды переключения канала на шаг вверх или вниз, тогда в худшем случае переключение будет со сдвигом на два канала.

Далее: в моём случае использовался пульт Samsung BN59-01178B.  Тип кодировки пульта не определялся, была надпись code Type7, тип кодировки пульта ВВК определился правильно NEC, Sony тоже без проблем.

Следующую строчку в скетче IRsendDemo.ino я изменил для пульта Samsung так      irsend.sendSAMSUNG(0xE0E048B7, 32); здесь число 32 – это количество бит. Последние четыре разряда.

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Для satelit. Напишите адрес своей электронной почты и я вам отправлю коды кнопок пульта Samsung.

Вкл             - E0E040BF

канал плюс - E0E048B7

канал минус - E0E008F7

громкость+   - E0E0E01F

громкость-     - E0E0D02F

enter             -  E0E016E9

1  -   E0E020DF

2  -   E0E0A05F

3  -   E0E0609F

4  -   E0E010EF

5  -   E0E0906F

6  -   E0E050AF

7  -   E0E030CF

8  -   E0E0B04F

9  -   E0E0707F

0  -   E0E08877

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

 База кодов кнопок пультов есть на этой страничке  -   http://lirc-remotes.sourceforge.net/remotes-table.html

satelit
Offline
Зарегистрирован: 12.12.2015

Navigator. огромное спасибо за отзыв. сегодня ночью по тестю. 

satelit
Offline
Зарегистрирован: 12.12.2015

проверил, сайт кодов не лажовый, с моими считынами кодами от кларион совпали, интересно почему я вспотыкался на баяны коких то кодов . кстати, я подключал ик диод напрямую к ножке ардуино и граунд, без транзистора(на ютубе видел пример)-но ютубу не доверяю

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Нельзя напрямую светодиод подключать, долго не проработает. А может и порт попалит... Нужно через токоограничивающий резистор.

satelit
Offline
Зарегистрирован: 12.12.2015

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

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

satelit
Offline
Зарегистрирован: 12.12.2015

 romiras как у тебя получилось?

romiras
Offline
Зарегистрирован: 12.07.2015

satelit пишет:

 romiras как у тебя получилось?

С пульта от медиаплеера подавался ИК сигнал на ардуино, код кнопки менялся на необходимый код пульта ТВ и отправлялся с дуино по ИК на ТВ. Все было накидано на макетке (поигрался, разобрал). Кода, к сожалению не осталось.

satelit
Offline
Зарегистрирован: 12.12.2015

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

satelit
Offline
Зарегистрирован: 12.12.2015
Наконецто получилось воткнуть код.  списал его с первого поста и просто поменял значение кодов пульта на свои.
 
при нажатии кнопки ON на дополнительном пульте принимается ардуино, код в ардуино меняется и отправляется код кнопки ON от тв  на тв.
 
для проверки подключенил на ардуино вместо ик диода обыкновенный светодиод получилось. при нажатии кнопки ON на дополнительном пульте светодиод импульсно горит(передает сигнал) и при нажатии кнопки BND аналогично моргает, при нажатии остальных кнопок молчит. правильно, они не прописаны в скетче--- в итоге ретранслятор работает.
 
значит коды списанные с сайта не подходят к моему тв?
или где то прописывается битраж исходящего сигнала, может у меня код не полностью улетает?
 
 
#include <IRremote.h>
IRrecv irrecv(7); // указываем вывод, к которому подключен приемник
IRsend irsend;
decode_results results;
unsigned long lastPressedKey = 0;
 
void setup()
{
  irrecv.enableIRIn(); // запускаем прием
}
 
 
void loop() {
     if ( irrecv.decode( &results )) { // если данные пришли
 
        unsigned long keyCode = results.value;
 
       irrecv.resume();
 
    if (keyCode == REPEAT)
 
    {
 
      keyCode = lastPressedKey; // пришел код ПОВТОРЕНИЕ, значит нужно сделать вид что еще раз нажали предыдущую клавишу.
 
    }
 
    else
 
    {
 
      lastPressedKey = keyCode; // запоминаем код реальной клавиши, для последнующего повторения
 
    }
 
    if (keyCode == 0x6106C03F) { //код моей кнопки ON дополнительного пульта
 
      irsend.sendRC6(0xE0E040BF, 20); // code кнопки ON тв
 
      irrecv.enableIRIn(); // запускаем прием
 
    }
    else if (keyCode == 0x610650AF) { //код моей кнопки BND дополнительного пульта
 
      irsend.sendRC6(0xE0E040BF, 20); // code кнопки ON
 
      irrecv.enableIRIn(); // запускаем прием
 
    }
 
  }
 
}
 
Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

 Для Satelit.

Обратите внимание на эту строку:   irsend.sendRC6(0xE0E040BF, 20)

Здесь вы посылаете команду на вклучение телевизора(E0E040BF).

Если у вас телевизор Samsung, то у вас две ошибки.

Первая: неправильно указан протокол.

Вторая: неправильно указана длина посылки.

Передается только первая часть E0E04, а вторая часть 0BF обрезается.

Для телевизора Samsung она должна быть такой: irsend.sendSamsung(0xE0E040BF,32).

Для начала измените только вторую ошибку, замените 20 на 32. Если на поможет, тогда замените sendRC6 на sendSamsung.

 

 

 

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Для Satelit.

Я думаю, что вы сэкономите много времени, если сперва попробуйте управлять телевизором просто подавая команды с ардуины. А когда управление с ардуины заработает, только затем уже подавайте команды другого пульта и т.д. Также можно убрать из программы проверку на повторное получение команды с приемника, вам же это не требуется. Это нужно было romiras-у для конкретно его задачи.

Bahram
Offline
Зарегистрирован: 04.12.2015

Привет форумчане!!! Помогите доработать скетч:

/* урок от Дмитрия Осипова. http://www.youtube.com/user/d36073?feature=watch
 v.03 Розетки, Управление любым ИК пультом, (программируемые на лету)
 socket IR remote control 
Version 0.3 2013/06/29
====================================
идеология;
Для начала программирования розеток, нажимаем на заранее прописанную в скетче кнопку пульта, ИЛИ нажимаем физический кнопку на Arduino, запускается режим программирования,  последовательным нажатием на кнопки пульта мы программируем 8 розеток. Arduino Запоминает эти кнопки пульта. 
Далее мы можем управлять розетками, тем пультом котором мы программировали.
====================================
 
 изменение:
 1. Добавлена возможность самостоятельно прописывать коды кнопок своего пульта
 2. Кнопку butpin перенес с пин 10 на пин 14 (A0). Соседство с 9 пином иногда
 приводило к ложному срабатыванию. 
 Кнопкой этой я вообще не пользуюсь, заменил ее сигналом от ИК пульта
 // unsigned long Value100 = 0xEE008FD4;
 // if(results.value == Value100)digitalWrite(butpin, HIGH);digitalWrite(butpin, LOW);
 3. Добавил возможность включения сразу всех, и выключения сразу всех задействованных пинов
 
 ********************************************************************************
подробную видео инструкцию выложу здесь
v.03 Arduino Розетки, Управление любым ИК пультом (программируемые на лету) socket IR remote control 
=======================================
 v.01 Arduino Розетки, Управление любым ИК пультом, (программируемые на лету) socket IR remote control
 
 1/6 Управление Arduino с ИК пульта - начало http://www.youtube.com/watch?v=PjR9jlP4644
 
 4/6 как ? узнать код - кнопки своего пульта  http://www.youtube.com/watch?v=InZuGntH_wk
 
 Скачать библиотеку IRremote для ИК пульта
 
 скетч arduino чтобы узнать код кнопки пульта
 sketch arduino buttons on the remote to learn the code
 
 
 */
 
#include <IRremote.h> // это скачанная библиотека
 
int RECV_PIN = 11; //вход ИК приемника
 
IRrecv irrecv(RECV_PIN);
 
decode_results results;
 
 
unsigned long Value100 = 0xEE008FC0; // переменная для хранения кода кнопки пульта
 
//Этот блог дает возможность физический прописывать коды кнопок своего пульта
// (как альтернатива программирования на лету с пульта)
// ВАЖНО !!! (1000809) это код кнопки - моего пульта - у вашего пульта будет другой код - замените на свой 
 
unsigned long Value2 = 0x1000809;
unsigned long Value3 = 0x1008889;
unsigned long Value4 = 0x1004849;
unsigned long Value5 = 0x100C8C9;
unsigned long Value6 = 0x1002829;
unsigned long Value7 = 0x100A8A9;
unsigned long Value8 = 0x1006869;
unsigned long Value9 = 0x100E8E9;
unsigned long Value10 = 0x1001819;
unsigned long Value0 = 0x1009899;
 
 
unsigned long Value11 = 0x180C041;
unsigned long Value12 = 0x180A021;
unsigned long Value13 = 0x1801091;
unsigned long Value14 = 0x1809011;
unsigned long Value15 = 0x1000E0F;
unsigned long Value16 = 0x1008E8F;
unsigned long Value17 = 0x1004E4F;
unsigned long Value18 = 0x100CECF;
 
 
 
 
//можно подать положительный сигнал на пин 14 (A0)  для начала программирования 
//(как альтернатива начала программирования на лету с пульта)//unsigned long Value100 = 0xEE008FD4;
 
int butpin = 14;
 
 
//Даем имена пинам
int pultpin2 = 2;
int pultpin3 = 3;
int pultpin4 = 4;
int pultpin5 = 5;
int pultpin6 = 6;
int pultpin7 = 7;
int pultpin8 = 8;
int pultpin9 = 9;
//***
 
int ledpin[] = {
  2, 3, 4, 5, 6, 7, 8, 9}; // номера задействованных пинов, количество можно уменьшить или увеличить (по желанию)
int ledstate[] = {
  0, 0, 0, 0, 0, 0, 0, 0}; //количество  задействованных пинов, количество можно уменьшить или увеличить (по желанию)
int butrec = 0;
long prevcode[] = {
  1, 1, 1, 1, 1, 1, 1, 1}; //количество  задействованных пинов, количество можно уменьшить или увеличить (по желанию)
long prevM = 0;
long prevM1 = 0;
long timeEx = 0;
boolean expr = true;
 
void setup()
 
 
{
  for (int i=0; i <= 8; i++){   // цифру 8 и все восьмёрки ниже заменяем на цифру задействованных пинов (по желанию)
    pinMode(ledpin[i],OUTPUT);
  }
  for (int i=0; i <= 8; i++){  
  }
  pinMode(butpin, INPUT); 
  digitalWrite(butpin, LOW);
 
 
 
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
 
 
  {
    Serial.begin(9600);
    irrecv.enableIRIn(); // Start the receiver. включить приемник
  }
}
 
void loop()
 
 
{
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
 
 
  {
    if (irrecv.decode(&results)) {
      Serial.println(results.value, HEX);
    }
  }
 
 
  {
    if(results.value == Value100)digitalWrite(butpin, HIGH);
    digitalWrite(butpin, LOW); // кнопкой от пульта запускаем режим программируемые на лету
 
 
 
 
 
    //Управляем с заранее записанных кодов кнопок своего пульта
    //unsigned long Value2 = 0xF7283C77;
 
 
    if(results.value == Value2)digitalWrite(pultpin2, HIGH);
    if(results.value == Value3)digitalWrite(pultpin3, HIGH);
    if(results.value == Value4)digitalWrite(pultpin4, HIGH);
    if(results.value == Value5)digitalWrite(pultpin5, HIGH);
    if(results.value == Value6)digitalWrite(pultpin6, HIGH);
    if(results.value == Value7)digitalWrite(pultpin7, HIGH);
    if(results.value == Value8)digitalWrite(pultpin8, HIGH);
    if(results.value == Value9)digitalWrite(pultpin9, HIGH);
 
 
    if(results.value == Value10)digitalWrite(pultpin2, LOW);
    if(results.value == Value0)digitalWrite(pultpin3, LOW);
    if(results.value == Value11)digitalWrite(pultpin4, LOW);
    if(results.value == Value12)digitalWrite(pultpin5, LOW);
    if(results.value == Value13)digitalWrite(pultpin6, LOW);
    if(results.value == Value14)digitalWrite(pultpin7, LOW);
    if(results.value == Value15)digitalWrite(pultpin8, LOW);
    if(results.value == Value16)digitalWrite(pultpin9, LOW);
 
 
    //вКлючаем все 
    if(results.value == Value17)digitalWrite(pultpin9, HIGH)
      ,digitalWrite(pultpin2, HIGH),digitalWrite(pultpin3, HIGH)
        ,digitalWrite(pultpin4, HIGH),digitalWrite(pultpin5, HIGH)
          ,digitalWrite(pultpin6, HIGH),digitalWrite(pultpin7, HIGH)
            ,digitalWrite(pultpin8, HIGH),digitalWrite(pultpin9, HIGH);
 
    //вЫключаем все
    if(results.value == Value18)digitalWrite(pultpin9, LOW)
      ,digitalWrite(pultpin2, LOW),digitalWrite(pultpin3, LOW)
        ,digitalWrite(pultpin4, LOW),digitalWrite(pultpin5, LOW)
          ,digitalWrite(pultpin6, LOW),digitalWrite(pultpin7, LOW)
            ,digitalWrite(pultpin8, LOW),digitalWrite(pultpin9, LOW);
 
 
 
 
 
 
 
    {
      if (irrecv.decode(&results)){
        delay(150);
        for(int i=0; i<8; i++)    
          if (results.value == prevcode[i]){
            ledstate[i] = !ledstate[i];
            digitalWrite(ledpin[i], ledstate[i]);        
          }
 
      }
      butrec = digitalRead(butpin);
      if (butrec == HIGH){
        for (int i=0; i<8; i++){      
          ledstate[i] = 0;
          digitalWrite(ledpin[i], ledstate[i]);     
        }
        timeEx = millis() - prevM1;
        for (int i=0; i<8; i++){
          expr = true;
          timeEx = 0;
          prevM1 = millis();   
          // < 5000)время ожидания сигнала с пульта, для перехода к следующему пину (в момент программирования)              
          while (expr == true && timeEx < 5000){     
            timeEx = millis() - prevM1;
            if (millis() - prevM > 250){           
              prevM = millis();
              int ledstate1 = !ledstate1;
              digitalWrite(ledpin[i], ledstate1);
            }                                      
            if (irrecv.decode(&results)) {         
              delay(150);
              prevcode[i] = results.value;
              irrecv.resume();
              expr = !expr;
              prevM1 = millis();
 
            }                                      
          }
 
          digitalWrite(ledpin[i], LOW);
 
        }
      }
    }
  }
}
Все нормально, только мне нужно, чтобы светодиод через оределенное время  (допустим 1 мин.) отключался.  
satelit
Offline
Зарегистрирован: 12.12.2015

спасибо,я так и предпологал что код улетает не полностью (в 20 посту) собрал макетку которая посылает ИК код при нажатии кнопки. с телефона видно как код улетает( камера телефона видит как ик диод мерцает) а тв не включается.  

при компиляции строка irsend.sendRC6(0xE0E040BF, 20) выделялась красным 

Вчера купил пульт-оригинал, но макетку буду доделывать, добавлю в систему умного дома( собираю из старого системного блока- те в его корпусе и блок питания подходящий 3.3в, 5в, 12в все есть)

satelit
Offline
Зарегистрирован: 12.12.2015

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

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

вот какой код получился

 

#include <IRremote.h>
 
int RECV_PIN = 6; //вход ИК приемника
IRrecv irrecv(RECV_PIN);
decode_results results;
 
 
void setup()
 
{
irrecv.enableIRIn(); // включить приемник
}
 
void loop() {
 
if (irrecv.decode(&results))
{
   if (results.value ==0x6106C03F) //код моей кнопки ON дополнительного пульта
      irsend.sendSamsung(0xE0E040BF, 32); // code кнопки ON тв
 
      irrecv.enableIRIn(); // запускаем прием
 
 
    if (results.value == 0x610650AF)//код моей кнопки BND дополнительного пульта
     irsend.sendSamsung(0xE0E040BF, 32); // code кнопки ON
 irrecv.resume();
 irrecv.enableIRIn(); // включить приемник
}
}
 
что означает предпоследняя строка  irrecv.resume(); и нужна ли она
Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Для Satelit.

Извиняюсь, я сам тоже сделал ошибку в этой строке: irsend.sendSamsung(0xE0E040BF,32).

Должно быть так irsend.sendSAMSUNG(0xE0E040BF,32), в слове SAMSUNG все буквы должны быть заглавные.

Лучше я попробую написать скетч с комментариями, а потом выложу его здесь. Останется только заменить коды кнопок на коды вашего пульта, и команды телевизора на команды вашего телевизора. Я так понимаю, что вы уже считали коды вашего пульта? 

satelit
Offline
Зарегистрирован: 12.12.2015

спасибо, а то я уже голову сломал, компилятор ругается как раз на эту строку

не стал, второй пост создавать, написал продолжением

компилятор опять на нее ругается, в случае когда написано   irsend.sendRC6 , программа выделяет ее в цвете, но также не проходит компиляцию, а в случае SAMSUNG B samsung не выделяется в цвете и так же не проходит компиляцию

от пульта мне пока достаточно одного кода ON\OFF, пока в голове одна мысль сделать будильник(в случае с махинациями в удлиннителе под тв тумбочкой часы в тв сбиваются, и будильник не срабатывает, а тут будет его включать моя умная тумбочка

PS понакидайте идей что можно добавить в эту тумбочку, в наличие 4 дуинки и вай фай модуль + мелочуга

satelit
Offline
Зарегистрирован: 12.12.2015

бахрам, мне кажется тебе надо наити пример простого управления, т.е. не перепрограмуруемую, ты же не будешь каждую неделю конектить новый пульт.

а после исполнения HIGH поставь команду  delay(60000)- 60 сек

я новичек может быть не прав

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Для Satelit

Написал скетч, т.е. добавил задержки между приемом и излучением сигналов, а так же вывод в монитор порта принятых ардуиной команд. Повтор команды не прописывал. Проверил, управлял телевизорами SAMSUNG, два всегда отлично, а третий неустойчиво, когда с первого нажатия, а когда и с пятого. Также хорошо управлялся ТВ тюнер "BBK".

/*********************************************************************
 *         Замена принятого кода ИК пульта SONY-ADU048               *
 *              на коды управления телевизором SAMSUNG               *
*                             IR_change                              *
 *                        ИК приемник - PIN 11                       *
 *                           ИК диод - PIN 3                         *
 *                          Светодиод - PIN 12                       *
 *                              19.02.216г.                          *
 *********************************************************************/

#include <IRremote.h>

int RECV_PIN = 11;
int LED_PIN = 12;
unsigned long ON_OFF = 0x540A; // Кнопка пульта SONY-ADU048  включение
unsigned long VOL_Up = 0x240A; // Кнопка пульта SONY-ADU048  VOL+
unsigned long VOL_Dn = 0x640a; // Кнопка пульта SONY-ADU048  VOL-
//Аналогично можно прописывать остальные кнопки пульта
IRrecv irrecv(RECV_PIN);
decode_results results;
IRsend irsend;

void setup()
{
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    if ( results.value != ON_OFF && results.value != VOL_Up && results.value != VOL_Dn) {
      // Исключили из принятого ненужное, оставили только прописанные команды пульта
      //digitalWrite(LED_PIN, HIGH);
      delay(200);/*без этой строки неустойчивое управление,
       значение подбираем: чем больше значение - тем больше задержка,
       чем меньше значение - тем хуже управление, у меня от 100 до 200*/
      //digitalWrite(LED_PIN, LOW);
      Serial.print("Not declared command - ");
      irrecv.enableIRIn();
    }

    if ( results.value==ON_OFF ) {
      //digitalWrite(LED_PIN, HIGH);
      delay(200);
      //digitalWrite(LED_PIN, LOW);
      Serial.print("ON_OFF - ");
      irsend.sendSAMSUNG(0xE0E040BF, 32); // Передаем команду вкл/выкл
      delay(100);
      irrecv.enableIRIn();
    };

    if //( y==results.value ) {
    ( results.value == VOL_Up ) {
      //digitalWrite(LED_PIN, HIGH);
      delay(200);
      Serial.print("CH_Up - ");
      //digitalWrite(LED_PIN, LOW);
      irsend.sendSAMSUNG(0xE0E048B7, 32); // Передаем команду канал вверх
      delay(100);
      irrecv.enableIRIn();
    };

    if ( results.value==VOL_Dn ) {
      //digitalWrite(LED_PIN, HIGH);
      delay(200);
      Serial.print("CH_Dn - ");
      //digitalWrite(LED_PIN, LOW);
      irsend.sendSAMSUNG(0xE0E008F7, 32); // Передаем команду канал вниз
      delay(100);
      irrecv.enableIRIn();
    };


    Serial.println(results.value, HEX);

  }
  delay(40);
}

 

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Bahran. Возможно delay вам не подойдет, так как во время выполнения delay программа не может выполнять другие действия. Может подойдет функция millis? Вот пример http://arduino.ru/tutorials/BlinkWithoutDelay

satelit
Offline
Зарегистрирован: 12.12.2015

спасибо за скетч. первые пол часа тормозил, я так и не понял что это было, даже в мониторе порта писалось что такому коду команда не задана или что то вроде того(английский не знаю) а потом все отлично заработало. хотел все это уже заталкать в системник, но как всегда в голову пришла еще одна мысль-- есть свободный вай фай модуль. попробую подружить

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Это прописано в строке 30. Там перечислены прописанные команды, и если принята другая команда, а также принята неправильно, тогда в монитор порта и выдается данное сообщение. По русски будет - НЕОБЪЯВЛЕННАЯ КОМАНДА. Если будем добавлять еще команды, тогда в эту строку также добавляем:

                     И                   ЕСЛИ ПРИНЯТАЯ КОМАНДА                НЕ РАВНА                             ЗНАЧЕНИЮ...

                      &&                 results.value                    !=       (например)      DVD_MENU

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Но в начале скетча сперва объявляем эту переменную (как в строках 15-17)

unsigned long DVD_MENU = 0x58108; // Кнопка пульта SONY-ADU048  DVD_MENU

Потом между строками 73-75 создаем еще один IF

if ( results.value==DVD_MENU ) {
        //digitalWrite(LED_PIN, HIGH);
        delay(200);
        Serial.print("MENU - ");
        //digitalWrite(LED_PIN, LOW);
        irsend.sendSAMSUNG(0xE0E058A7, 32); // Передаем команду MENU ТВ SAMSUNG
        delay(100);
        irrecv.enableIRIn();
      };

 

satelit
Offline
Зарегистрирован: 12.12.2015

эта болезнь сама прошла, сначала через раз так писала, а через пол часа сама прошла( только решил delay в некоторых местах поменять, заработало как надо) . большое спасибо НАВИГАТОР. 

satelit
Offline
Зарегистрирован: 12.12.2015

только я так и не понял почему мой второй скетч не проходит компиляцию-- получается я не задавал значения до сетапа

doc_bravn
Offline
Зарегистрирован: 26.08.2017

Хочу сделать ретранслятор ИК команд с пульта одного устройства на другое и при этом включать и выключать нагрузку с помощью реле. Использовал для этого такой код:

 

01 #include <IRremote.h>
02  
03 int RECV_PIN = 2;
04 int RELAY_PIN = 5;
05 unsigned long ON_OFF = 0xFDC23D; // Кнопка пульта Dune HD TV-102  включение
06 //Аналогично можно прописывать остальные кнопки пульта
07 IRrecv irrecv(RECV_PIN);
08 decode_results results;
09 IRsend irsend;
10  
11 void setup()
12 {
13   pinMode(RELAY_PIN, OUTPUT);
14   digitalWrite(RELAY_PIN,LOW);
15   Serial.begin(9600);
16   irrecv.enableIRIn(); // Start the receiver
17 }
18  
19 void loop() {
20   if (irrecv.decode(&results)) {
21     if ( results.value != ON_OFF) {
22       // Исключили из принятого ненужное, оставили только прописанные команды пульта
23       delay(200);/*без этой строки неустойчивое управление,
24        значение подбираем: чем больше значение - тем больше задержка,
25        чем меньше значение - тем хуже управление, у меня от 100 до 200*/
26       Serial.print("Not declared command - ");
27       irrecv.enableIRIn();
28     }
29  
30     if ( results.value==ON_OFF ) {
31       delay(200);
32       Serial.print("ON_OFF - ");
33       irsend.sendSAMSUNG(0xE0E040BF, 32); // Передаем команду вкл/выкл
34       digitalWrite(RELAY_PIN, !digitalRead(RELAY_PIN));
35       delay(100);
36       irrecv.enableIRIn();
37     };
38  
39     Serial.println(results.value, HEX);
40  
41   }
42   delay(40);
43 }

Команду с пульта принимает, реле включается и выключается. Но вот команда на другое устройство(телевизор Samsung) не реагирует. Посмотрел камерой смартфона на ИК диод. Он ничего не излучает. Уже даже диод купил новый пошел и подключил. Не помогает. Попробовал залил скетч пример IRsendDemo. Снова смотрю на светодиод камерой смартфона и не видно никакого излучения. Неужели два новых ИК диода и оба неисправные?

Диоды использовал такие:

http://robotdyn.ru/catalog/led/infrared_led_module/

и такой:

https://www.chipdip.ru/product/troyka-ir-transmitter-5mm-led

Подскажите пожалуйста что не так делаю? Почему диоды не работают и ничего не излучают?