ИК ретранслятор с заменой кода сигнала (в ардуинке новичек))
- Войдите на сайт для отправки комментариев
Вс, 12/07/2015 - 12:13
Друзья, подскажите как правильно дописать код для ардуинки, принимающего сигнал по ИК с одного пульта, после обработки в нужный код сигнала от другого пульта - отправляет его на тв по ик. Коды с пультов уже считаны. В моей реализации кода при повторном нажатии одной и тоже кнопки - сигнал не передается((( Я не программист, поэтому прошу помощи!))
вот код
#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(); } }
После передачи, нужно снова переключиться на прием, т.е. выполнить команду из строки 08.
Вставил, видимо не так(( Попробовал зацепить две кнопки, диод моргает, но сигнал не считывается
Не "бойтесь" окружать код фигурными скобками:
Код не проверял.
UPD: И есть хорошее сочетание клавиш Ctrl-T, чтобы текст выглядел более читабельно. Бардак в скетче - бардак в голове.
Спасибо, все работает!
пришлите пожалуйста коды от тв самсунгг не смарт, хотябы основные кнопки. родной пульт перестал работать, а у меня есть в запасах ардуино и пульт от старой магнитолы.
команды вкл, выбор входа, канал плюс, канал минус, громкость плюс, громкость минус, ентер, и еще шесть на рассмотрение.
в нете ничего путного не нашел. заранее благодарен
нашел только в десятиричной, но мне кажется они должны быть в 16, сегодня ночью попробую переделать код и собрать все это хозяйство, жаль не научился сюда код прикреплять, а то бы выложил эскизы первоначального кода
Запускаем калькулятор, стандартный, виндовый. Включаем режим "Программист", выбираем DEC режим, вводим число, например, "12345", переключаемся в HEX и видим 3039. В десятке еще легче.
Контроллеру глубоко по барабану, в десятичном виде или в шестнадцатеричном. Это всё для программиста, удобство представления. В контроллере двоичная информация.
int a = 12345;
и
int a = 0x3039;
абсолютно одинаково понимаются контроллером.
коды с интернета не прошли, 0021, 0061 и тд, скорее всего не хватает начала кода, которое одинаковое. Закодировал только пару кнопок для начала, для проверки, должно все работать, тк проверял через камеру телефона, при нажатии первой и второй кнопки ик мигает а при остальных молчит.
Напишите, какие у вас пульты, а я постараюсь помочь. Во-первых нужно будет установить более новую библиотеку (ссылку дам), затем удалить другую библиотеку, по моему robot control. Сначала напишите, какие у вас пульты и думаю решим вашу задачу, я недавно занимался этой темой. Помню еще использовал транзистор кт315. С ардуинки подавал сигнал на базу транзистора через сопротивление 3,3 кОм. Эмиттер транзистора на землю. Далее к коллектору подключил катод излучающего ИК диода, а анод диода через сопротивление 100 Ом на +5В. Также подключал анод диода на +5в без резистора 100 Ом, диод выдержал такое испытание, т.к. излучает не постоянно.
Заходим на страницу 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 – это количество бит. Последние четыре разряда.
Для 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
База кодов кнопок пультов есть на этой страничке - http://lirc-remotes.sourceforge.net/remotes-table.html
Navigator. огромное спасибо за отзыв. сегодня ночью по тестю.
проверил, сайт кодов не лажовый, с моими считынами кодами от кларион совпали, интересно почему я вспотыкался на баяны коких то кодов . кстати, я подключал ик диод напрямую к ножке ардуино и граунд, без транзистора(на ютубе видел пример)-но ютубу не доверяю
Нельзя напрямую светодиод подключать, долго не проработает. А может и порт попалит... Нужно через токоограничивающий резистор.
идея говно, нужно строить экран(что бы ик приемник не получал коды от дополнительного пульта) или вскрывать тв и ик приемник с ик диодом от ардуины в одну коробочку.
ик приемник тв принимает одновременно коды пульта и коды ардуино. но есть идея сделать паузу на ардуино. после получения сигнала от пульта сделать перекодировку, сделать паузу а потом только передачу производить
romiras как у тебя получилось?
romiras как у тебя получилось?
С пульта от медиаплеера подавался ИК сигнал на ардуино, код кнопки менялся на необходимый код пульта ТВ и отправлялся с дуино по ИК на ТВ. Все было накидано на макетке (поигрался, разобрал). Кода, к сожалению не осталось.
я с кодом разобрался, но почему то не работает, значит коды пультов не совпадают. кстати надо попробовать у соседей( у них то хоть пульт рабочий, коды можно считать)
Для Satelit.
Обратите внимание на эту строку: irsend.sendRC6(0xE0E040BF, 20)
Здесь вы посылаете команду на вклучение телевизора(E0E040BF).
Если у вас телевизор Samsung, то у вас две ошибки.
Первая: неправильно указан протокол.
Вторая: неправильно указана длина посылки.
Передается только первая часть E0E04, а вторая часть 0BF обрезается.
Для телевизора Samsung она должна быть такой: irsend.sendSamsung(0xE0E040BF,32).
Для начала измените только вторую ошибку, замените 20 на 32. Если на поможет, тогда замените sendRC6 на sendSamsung.
Для Satelit.
Я думаю, что вы сэкономите много времени, если сперва попробуйте управлять телевизором просто подавая команды с ардуины. А когда управление с ардуины заработает, только затем уже подавайте команды другого пульта и т.д. Также можно убрать из программы проверку на повторное получение команды с приемника, вам же это не требуется. Это нужно было romiras-у для конкретно его задачи.
Привет форумчане!!! Помогите доработать скетч:
спасибо,я так и предпологал что код улетает не полностью (в 20 посту) собрал макетку которая посылает ИК код при нажатии кнопки. с телефона видно как код улетает( камера телефона видит как ик диод мерцает) а тв не включается.
при компиляции строка irsend.sendRC6(0xE0E040BF, 20) выделялась красным
Вчера купил пульт-оригинал, но макетку буду доделывать, добавлю в систему умного дома( собираю из старого системного блока- те в его корпусе и блок питания подходящий 3.3в, 5в, 12в все есть)
получается все так просто, осталось коды кнопок размножить
пока времени нет, вечером считаю остальные коды кнопок и попробую
вот какой код получился
Для Satelit.
Извиняюсь, я сам тоже сделал ошибку в этой строке: irsend.sendSamsung(0xE0E040BF,32).
Должно быть так irsend.sendSAMSUNG(0xE0E040BF,32), в слове SAMSUNG все буквы должны быть заглавные.
Лучше я попробую написать скетч с комментариями, а потом выложу его здесь. Останется только заменить коды кнопок на коды вашего пульта, и команды телевизора на команды вашего телевизора. Я так понимаю, что вы уже считали коды вашего пульта?
спасибо, а то я уже голову сломал, компилятор ругается как раз на эту строку
не стал, второй пост создавать, написал продолжением
компилятор опять на нее ругается, в случае когда написано irsend.sendRC6 , программа выделяет ее в цвете, но также не проходит компиляцию, а в случае SAMSUNG B samsung не выделяется в цвете и так же не проходит компиляцию
от пульта мне пока достаточно одного кода ON\OFF, пока в голове одна мысль сделать будильник(в случае с махинациями в удлиннителе под тв тумбочкой часы в тв сбиваются, и будильник не срабатывает, а тут будет его включать моя умная тумбочка
PS понакидайте идей что можно добавить в эту тумбочку, в наличие 4 дуинки и вай фай модуль + мелочуга
бахрам, мне кажется тебе надо наити пример простого управления, т.е. не перепрограмуруемую, ты же не будешь каждую неделю конектить новый пульт.
а после исполнения HIGH поставь команду delay(60000)- 60 сек
я новичек может быть не прав
Для Satelit
Написал скетч, т.е. добавил задержки между приемом и излучением сигналов, а так же вывод в монитор порта принятых ардуиной команд. Повтор команды не прописывал. Проверил, управлял телевизорами SAMSUNG, два всегда отлично, а третий неустойчиво, когда с первого нажатия, а когда и с пятого. Также хорошо управлялся ТВ тюнер "BBK".
Bahran. Возможно delay вам не подойдет, так как во время выполнения delay программа не может выполнять другие действия. Может подойдет функция millis? Вот пример http://arduino.ru/tutorials/BlinkWithoutDelay
спасибо за скетч. первые пол часа тормозил, я так и не понял что это было, даже в мониторе порта писалось что такому коду команда не задана или что то вроде того(английский не знаю) а потом все отлично заработало. хотел все это уже заталкать в системник, но как всегда в голову пришла еще одна мысль-- есть свободный вай фай модуль. попробую подружить
Это прописано в строке 30. Там перечислены прописанные команды, и если принята другая команда, а также принята неправильно, тогда в монитор порта и выдается данное сообщение. По русски будет - НЕОБЪЯВЛЕННАЯ КОМАНДА. Если будем добавлять еще команды, тогда в эту строку также добавляем:
И ЕСЛИ ПРИНЯТАЯ КОМАНДА НЕ РАВНА ЗНАЧЕНИЮ...
&& results.value != (например) DVD_MENU
Но в начале скетча сперва объявляем эту переменную (как в строках 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();
};
эта болезнь сама прошла, сначала через раз так писала, а через пол часа сама прошла( только решил delay в некоторых местах поменять, заработало как надо) . большое спасибо НАВИГАТОР.
только я так и не понял почему мой второй скетч не проходит компиляцию-- получается я не задавал значения до сетапа
Хочу сделать ретранслятор ИК команд с пульта одного устройства на другое и при этом включать и выключать нагрузку с помощью реле. Использовал для этого такой код:
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
Подскажите пожалуйста что не так делаю? Почему диоды не работают и ничего не излучают?