Прием и передача ик сигнала (библиотекой IRremote)
- Войдите на сайт для отправки комментариев
Сб, 02/05/2015 - 22:22
Необходимо с помощью одного пульта управлять другими устройствами с помощью ИК сигнала. Написал программку, но она почему то один раз выполняет одну команду и все. После не каких действий не производит. Подскажите в чем ошибся?
#include <IRremote.h> IRsend irsend; int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); } unsigned int menu[68]={9892, 8850, 4450, 550, 600, 500, 600, 500, 600, 500, 650, 450, 650, 500, 600, 500, 1700, 500, 650, 450, 1700, 550, 1700, 500, 1750, 500, 1700, 500, 1700, 500, 1700, 550, 600, 500, 1700, 500, 1700, 550, 600, 500, 1700, 500, 1700, 500, 650, 500, 600, 500, 1700, 500, 650, 450, 650, 500, 1700, 500, 600, 500, 600, 500, 1750, 500, 1700, 500, 600, 500, 1750, 500}; unsigned int up[68]={18450, 8900, 4450, 500, 650, 500, 600, 500, 600, 500, 600, 500, 600, 500, 650, 500, 1700, 500, 600, 500, 1750, 500, 1700, 500, 1750, 450, 1750, 500, 1700, 500, 1750, 450, 650, 500, 1700, 500, 1750, 450, 1750, 500, 600, 550, 1700, 450, 650, 500, 600, 500, 600, 500, 600, 500, 650, 450, 650, 500, 1700, 500, 600, 500, 1750, 500, 1700, 500, 1700, 500, 1750, 500}; unsigned int down[68]={10370, 8900, 4450, 500, 650, 500, 600, 500, 600, 500, 600, 550, 550, 500, 650, 500, 1700, 500, 600, 500, 1750, 450, 1750, 500, 1700, 500, 1750, 500, 1700, 500, 1700, 500, 650, 500, 1700, 500, 600, 550, 600, 450, 1750, 500, 1700, 500, 600, 500, 650, 450, 1750, 500, 600, 500, 1700, 500, 1750, 500, 600, 500, 600, 500, 1750, 500, 1700, 500, 600, 500, 1700, 500}; unsigned int exi[68]={10328, 8900, 4450, 500, 600, 500, 650, 500, 550, 550, 600, 500, 600, 500, 600, 500, 1700, 550, 600, 500, 1700, 500, 1700, 550, 1700, 500, 1700, 500, 1700, 550, 1700, 500, 600, 500, 1700, 550, 600, 500, 1700, 500, 650, 500, 1700, 500, 600, 500, 600, 500, 650, 500, 550, 550, 1700, 500, 600, 500, 1700, 550, 600, 500, 1700, 500, 1700, 550, 1700, 500, 1750, 450}; //unsigned int prog_up[68]={}; //unsigned int prog_down[68]={}; //void(* resetFunc) (void) = 0; void loop() { if (irrecv.decode(&results)) { //delay(300); if (results.value == 0xDE8D48A3){irsend.sendRaw(menu,68,38);} if (results.value == 0x20DF02FD){irsend.sendRaw(up,68,38);} if (results.value == 0x20DF827D){irsend.sendRaw(down,68,38);} if (results.value == 0x3D90959F){irsend.sendRaw(exi,68,38);} if (results.value == 0x4FBB847){irsend.sendRaw(menu,68,38);} if (results.value == 0x4FBC23D){irsend.sendRaw(up,68,38);} if (results.value == 0x4FBA25D){irsend.sendRaw(down,68,38);} if (results.value == 0xE7ED801F){irsend.sendRaw(exi,68,38);} { delay(100); } //resetFunc(); irrecv.resume(); } }
Попробуйте перед (или после) irrecv.resume(); сделать irrecv.enableIRIn();
В принципе достаточно irrecv.enableIRIn(), потому что он внутри делает в том числе то же, что и resume, однако это не очень хорошо.
В целом, могу предложить почти всегда использовать следующий вариант:
ну и, как уже сказал maksim, после вывода IR кода нужно всегда переключаться на прием, т.е. выполнять в конце цикла enableIRIn(), поскольку выдача IR кода отключает режим приема.
Спасибо за подсказку. Вставил irrecv.enableIRIn(); после irrecv.resume(); т.к. если поставить до, сигнал считывается не с первого раза.
kisoft
А можно по подробнее, на примере моей программы предоставить,
Необходимо считать код пульта, для дальнейшего управления им ардуино. Но при считывании кода пульта библиотекой IRremote скетчем iRrecvDump (пробовал и другими программами) каждый раз выдаются разные коды.
При нажатии одной и той же кнопки:
Unknown encoding: 9BDB47E3 (32 bits)
Raw (68): 3844 8750 -4550 450 -650 450 -650 450 -650 450 -700 400 -650 450 -1850 400 -650 400 -700 450 -1800 400 -1750 450 -1750 500 -1700 450 -1750 500 -650 450 -1800 400 -1750 500 -1800 400 -650 450 -1750 450 -1750 450 -1750 450 -700 400 -700 450 -650 450 -650 450 -1750 450 -700 400 -700 400 -650 450 -1800 450 -1750 450 -1750 450
56606B9
Unknown encoding: 56606B9 (32 bits)
Raw (68): 8092 8750 -4500 450 -750 400 -650 450 -700 400 -650 450 -650 450 -1800 400 -650 500 -650 400 -1800 450 -1750 450 -1750 450 -1750 500 -1700 500 -700 350 -1750 500 -1750 450 -1800 400 -650 500 -1800 400 -1750 450 -1750 450 -650 450 -650 500 -650 450 -700 400 -1750 450 -650 450 -650 450 -650 450 -1750 450 -1850 400 -1750 450
E2334DF0
Unknown encoding: E2334DF0 (32 bits)
Raw (68): -9196 8800 -4550 400 -700 400 -700 400 -700 450 -650 400 -700 450 -1750 450 -700 400 -650 500 -1700 450 -1800 450 -1750 450 -1750 450 -1800 400 -650 450 -1800 450 -1700 500 -1800 450 -650 400 -1800 450 -1750 450 -1750 450 -700 400 -750 350 -650 450 -700 400 -1800 450 -650 450 -650 450 -600 500 -1750 500 -1750 400 -1800 450
6DAC90CB
Unknown encoding: 6DAC90CB (32 bits)
Raw (68): 23598 8800 -4550 400 -700 450 -650 450 -750 350 -600 550 -650 400 -1750 450 -700 450 -650 450 -1750 500 -1650 550 -1750 400 -1800 450 -1750 450 -650 500 -1700 450 -1800 400 -1800 450 -650 450 -1800 400 -1700 550 -1750 400 -700 450 -650 450 -650 450 -650 450 -1800 400 -700 400 -700 400 -700 400 -1800 450 -1750 450 -1750 450
43F8861D
Unknown encoding: 43F8861D (32 bits)
Raw (64): -28366 8750 -4550 50 -100 150 -2050 300 -900 100 -1000 200 -750 350 -2050 150 -850 200 -1050 100 -2050 150 -2050 200 -4250 100 -2050 200 -850 250 -2000 200 -2050 200 -1950 250 -950 50 -2100 150 -2000 300 -2050 150 -850 150 -1000 100 -1050 150 -3000 300 -750 400 -800 250 -900 200 -2100 100 -2050 200 -1950 250
Как правильно считать коды?
С большой долей вероятности, частоты передатчика и приемника различны. Потому коды разные. Плюс ещё показателем разных частот может являться малое расстояние срабатывания, т.е. чем они дальше друг от друга, тем меньше срабатываний.
То есть, правильно считать код невозможно?
Если частоты совпадают, то можно. Попробуйте пульты разных брендов и увидите разницу.
На устройстве, с пульта которого я пытаюсь считать ir код, стоит такой же ir приемник, что и у меня на ардуино. Но при считывании все равно каждый раз разные коды выходят. Может дело в чем то другом?
Схема подключения с номиналами?
Пульт какого бренда?
Я пока не встречался с ситуацией, когда всё корректно подключено, а код считывается нестабильно. Обычно это передатчик и приёмник с разными частотами.
Ещё, пальцем в небо, для передатчика указана не корректная частота в скетче.
Я приемник на прямую в 5v. подключаю.
А где частоту для приемника указывать?
Вот скетч из стандартной библиотеке, я им и считываю:
Использую библиотеко IRremode для робота
Скачал скетч:
#include <IRemote.h>
Стал компилировать, выдаёт ошбку:
А где частоту для приемника указывать?
Нигде и никак.
Проблему с разными кодами я решил, добавил к приемнику конденсатор и сопротивление. Пробовал разные пульты, при повторном нажатие на кнопки, коды всегда одинаковые.
Считываю стандартным скетчем IRrecvDump.
Но появилась другая проблема при считывании кода с пульта кондиционера. Там значение Raw больше 100. Изменил в IRremote.h значение #define RAWBUF 100 на 255. Но все равно он почти всегда выдает значение Raw (100). При этом кондей не реагирует. Каким то не понятным мне способом, при считывании ir кода тем же скетчем, он мне выдал значение Raw (200). При таком раскладе кондей стал включаться. НО это было один раз и больше IR более Raw (100) не выдает.
Подскажите может есть какие то хитрости при считывании, когда Raw должно быть больше 100?
Подскажите пожалуйста, я вводил вот этот код:
#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
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
}
}
Мне выдаёт ошибку
C:\Program Files\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp:5: error: 'TKD2' was not declared in this scope
Не понимаю в чём проблема ,
Заранее спасибо.)))
Доброго времени задача такая с блютус модуля приходит сигнал в виде цифры далее с ардуины отправляется код кнопки пульта
во пример скетча но проблема в том что код отправляется не 1 раз в цикле а пока висит команда с блютус как это исправить?? новичёк в програмировании так что не кидайте тапками )))
заранее спасибо))