Библиотека "мрачная", ужасная и т.п. Если у Вас UNO, то к 3 пину цепляем передатчик. В других случаях, смотрите в библиотеке, пойду вымою руки после её просмотра. Буду знать, что точно не нужно использовать. Наследование через жопу - такого я еще не видел никогда.
Leonardo, 9 пин.
Универсальная библиотека - да IRremote. Для исследований нормально, но занимает немало места.
Наверняка найдутся ещё либы, которые тоже нормальные.
Лично я использовал бы IRremote на начальном этапе, а потом для уже известного протокола нашёл бы простую реализацию.
Хотя все это философия, пользуйтесь тем, что удобнее лично Вам.
А насчет подключения не просветите? Я подключил к 9 пину. И он у меня посылает сигнал. Аж видно голубой огонек в момент посыла. Это нормально? И резистор я правильно между 9-м пином и передатчиком на 100 Ом поставил?
У меня кондей все равно код не принимает. Я вот думаю, может в аппаратной части где ошибся. Если нет, то буду либу менять.
Долго мучался с своей сплит системой(electrolux пульт YACIFBI), пока не нашел на просторах инета скетч
#define LEDPIN 11
//you may increase this value on Arduinos with greater than 2k SRAM
#define maxLen 800
volatile unsigned int irBuffer[maxLen]; //stores timings - volatile because changed by ISR
volatile unsigned int x = 0; //Pointer thru irBuffer - volatile because changed by ISR
void setup() {
Serial.begin(9600); //change BAUD rate as required
attachInterrupt(0, rxIR_Interrupt_Handler, CHANGE);//set up ISR for receiving IR signal
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println(F("Press the button on the remote now - once only"));
delay(5000); // pause 5 secs
if (x) { //if a signal is captured
digitalWrite(LEDPIN, HIGH);//visual indicator that signal received
Serial.println();
Serial.print(F("Raw: (")); //dump raw header format - for library
Serial.print((x - 1));
Serial.print(F(") "));
detachInterrupt(0);//stop interrupts & capture until finshed here
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);//end of visual indicator, for this time
attachInterrupt(0, rxIR_Interrupt_Handler, CHANGE);//re-enable ISR for receiving IR signal
}
}
void rxIR_Interrupt_Handler() {
if (x > maxLen) return; //ignore if irBuffer is already full
irBuffer[x++] = micros(); //just continually record the time-stamp of signal transitions
}
Ir data подключается ко второму pin
Получил на выходе код во много раз превышающий буфер Ir Remote
Нашел что между сигналами проходит около 20 и 40 милисекунд(не уверен точно в чем там исчесляется) и тут получился следующий код использующий библиотеку Ir Remote
#include <IRremote.h>
IRsend irsend;
//int incomingByte = 0; // for incoming serial data
//char character;
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}
int x;
String str;
void loop()
{
//while(Serial.available() > 0)
int a=0;
while (a==0)
{
unsigned int r11[73] = {9048,4468,680,1624,672,536,672,532,680,1628,672,540,676,528,676,528,676,532,676,532,672,532,672,536,672,1636,672,532,672,536,680,524,672,536,680,524,680,524,672,536,680,528,676,528,676,532,672,1640,672,532,672,532,684,528,676,528,668,536,680,1628,680,528,676,1628,680,528,680,528,676,1632,676,528,676
};
unsigned int r12[65] = {676,528,680,528,676,528,676,532,672,536,672,532,672,536,668,536,672,536,680,524,680,528,676,528,676,532,676,1628,680,528,676,532,672,536,672,536,668,536,680,528,676,528,676,528,680,532,672,532,672,532,676,532,672,532,672,536,672,1632,676,528,676,1636,672,1636,672};
unsigned int r13[73] = {9004,4464,672,1636,676,532,672,536,668,1640,668,536,672,536,676,528,680,528,676,528,668,536,680,528,676,1632,676,528,676,532,676,528,676,532,672,532,676,532,672,532,672,536,680,528,676,532,676,1628,680,528,676,528,680,532,672,528,676,532,672,1636,676,1632,672,1632,676,532,676,532,672,1632,676,532,672};
unsigned int r14[65] = {680,528,676,528,680,528,676,532,672,532,672,536,672,532,672,536,680,528,676,528,680,528,676,532,672,532,672,536,672,532,672,536,668,540,676,528,680,524,680,528,676,532,676,524,680,532,672,532,672,532,676,532,672,532,676,528,676,1636,672,1636,672,536,668,1636,672};
irsend.sendRaw(r11,73,38);
delay(20);
irsend.sendRaw(r12,65,38);
delay(40);
irsend.sendRaw(r13,73,38);
delay(20);
irsend.sendRaw(r14,65,38);
delay(5000);
}
}
Естественно код для теста, но передает суть. Надеюсь поможет тем кто будет решать данную проблему с кондеями и прочими системами которые посылают сразу с несколько сигналов с маленьким разрывом
Вот так же считайте код, который посылаете своим передатчиком. А уже когда будет получен правильный код, можно и кондиционером заняться.
Кондиционер - не каждый может завести, там проблем может быть много, потому что посылка там далеко не такая короткая, как Вам кажется.
Поищите на форуме, тем с кондиционерами было не так уж и много. У кого то получилось.
Попробовал считать код со своего передатчика. Приемник молчит. Типа передатчик ничего не передает. Хотя ИК передатчик моргает голубым светом однократно. Но сигнал походу не посылает. Ресивер ничего не пишет в буфер, хотя когда в него пультом от кондея тычу, всё прекрасно реагирует. Начал думать. Может я схему неправильно собрал? На зарубежном блоге mySensors чел собрал передатчик из 5-ти диодов. У него в схеме транзистор использовался NPN (ох уж эти дырки и переходы мне в универе тяжело давались) и сопротивление 1КОм. У меня же 1 диод. Подключен к 3-му пину Ардуины Нано через резистор 100 Ом. Всё как написано тут. Может, я в схеме что-то напутал? Или по какой другой схеме надо подключать, объясните, зачем тут транзистор, идля чего он нужен?
минус подсоединяем к большому лепестку светика(это минус, ну и второй плюс естественно), т.е если полярность перепутали- нечего не будет. ир приемник помоему на трех ножках...т.е берем заведомо исправный пульт, собираем приемник и смотрим...а потом уже вещаем второй ардуино и смотрим что принимаем...
ну да, передатчик. Который ничего не отсылает. Приемник висит на той же ардуине. "Заведомо исправным пультом" всё шлется в приемник и коды в сериал выводит. А этим ir передатчиком глухо как в танке. Проблема в вещании. Попробую конечно полярность поменять, но склоняюсь уже взять передатчик с обвязкой типа такого: http://www.ebay.com/itm/3W-Infrared-Ray-IR-Transmission-Module-940nm-LED...
Как то я тоже пытался сделать на одной ардуино и приемник и передатчик, вообщем у меня не получилось..(может я что то не правильно делал...) работало или приемник или передатчик. В итоге сделал- на одной ардуине передатчик, на второй ардуине приемник и все заработало...может вам тоже пойти по этому пути?...
Ну вообще должно работать и на одной ардуине. В скетче прописан
// Start receiving ir again...
irrecv.enableIRIn();
То есть ардуина возвращается в режим приема сигналов. Плюс еще в той теме, что Вы мне посоветовали на куартинке что-то воткнуто перед ИК передатчиком. Но картинка мелкая - не разглядеть.
Ничего вам ардуина не должна, с данной библиотекой,свой собственный сигнал принимать она не может. Светодиод не должен гореть никаким светом, если горит значит у вас не ИК светодиод. Да и вообще, вы когда откуда то взяли этот светодиод о нем была какая то информация, что это именно ИК светодиод?
Выключать прием нет никакого смысла, потому что он автоматически отключается при выдаче кода, поскольку прием и передача используют один и тот же таймер.
Выключать прием нет никакого смысла, потому что он автоматически отключается при выдаче кода, поскольку прием и передача используют один и тот же таймер.
Ну и? Что из этого следует?
Мы наверное не понимаем друг друга. Если вы пыаетесь принять ИК сигнал передавемый этой же дуиной, то ничего не получится. Если же речь идет о том, что дуина всегда "слушает" - ожидает сигнала и переодически еще куда то передает сигнал, при этом в этот момент она перестает "слушать", то да это работает.
Но судя по вашим постам, вы проверяете как дуина передает сигнал пытаясь принять его этой же дуиной, и естественно ничего не принимается, потому что одновременно с этой библиотекой нельзя принимать свой же передаваемый сигнал.
ir светодиод это тот же самый светодиод,только он вещает в другом спектре(не видим человеческому глазу). а ir приемник принимает этот переданный пакет информации(света). посмотреть на работу можно только фотоаппаратом(телефонного к примеру) - будет видно мерцание. Если ваш светик видно как моргает в живую при наличии ограничивающего ризистора- то по идее у вас или не тот светик или напруга завышена. нечего видно быть не должно, возьмите обычный пульт и посмотрите телефоном как ваш пульт мерцает при нажатии кнопки...у вас так же должно быть.
с ирда приемником всё более-менее понятно. Я хотел выяснить по поводу передатчика. на сколько резистор подтягивать, полярность и вообще тот ли мне светодиод подсунули. Теперь, в общем, заказал передатчик с обвязкой и буду на разных дуинах тестировать. Понятно, что когда она посылает сигнал, считывать он не может. И на этом спасибо.
PS: Пора FAQ на форуме делать. Много смежных тем раскидано по всему форуму.
Спасти от жары сможет аварийная кнопка включения, которая обычно находитсяпод лицевой панелью где-то, ну на крайний случай универсальный пульт для кондеев.
Коды работают. Я правда не считывал пока все так как жду детелей из китая (долго жду). Если очень надо могу считать коды.
У меня просто в планах нарисовать универсальный пуль с управлением через комп(возможно голосом) и по средствам инета. Едешь домой включил кондей, зашел домой запустил телек.
не заработало через "Raw" и через "sendJVC" не включался даже если три или два раза отправлять код:
irsend.sendJVC(ConditionerOn,16,0);
Во-вторых, при считывании, нажимая вкл. на пульте несколько раз, увидел три разных кода и решил, что все эти три кода нужны для включения. Вставил эти коды и кондер включился...)
Проблема с скетчем для включения кондея по сетке. Взял скетч для реле отсюда(ENC28J60 Enternet HR911105A Pin ON OF Relays) не нужное убрал и добавил IR. Но при отправки команды на кондей (вижу как моргает дион на IR датчике) кондей издает звук и не включается. Как будто отправляет не все три команды irsend.sendRaw...
#include <EtherCard.h> // Подключаем скачанную библиотеку. https://yadi.sk/d/R57sVoglbhTRN
#include "IRremote.h"
IRsend irsend;
// MAC Address должен быть уникальным в вашей сети. Можно менять.
static byte mymac[] = {
0x5A,0x5A,0x5A,0x5A,0x5A,0x5A };
// ip статический / постоянный Address нашей Web страницы.
static byte myip[] = {
192,168,0,198 };
// Буфер, чем больше данных на Web странице, тем больше понадобится значения буфера.
byte Ethernet::buffer[900];
BufferFiller bfill;
// Массив задействованных номеров Pins Arduino, для управления например 8 реле.
int LedPins[] = {
2};
// Массив для фиксации изменений.
boolean PinStatus[] = {
1};
//-------------
const char http_OK[] PROGMEM =
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"Pragma: no-cache\r\n\r\n";
const char http_Found[] PROGMEM =
"HTTP/1.0 302 Found\r\n"
"Location: /\r\n\r\n";
const char http_Unauthorized[] PROGMEM =
"HTTP/1.0 401 Unauthorized\r\n"
"Content-Type: text/html\r\n\r\n"
"<h1>401 Unauthorized</h1>";
//------------
// Делаем функцию для оформления нашей Web страницы.
void homePage()
{
bfill.emit_p(PSTR("$F"
"<title>ArduinoPIN Webserver</title>"
"ArduinoPIN 1: <a href=\"?ArduinoPIN1=$F\">$F</a><br />"),
http_OK,
PinStatus[1]?PSTR("off"):PSTR("on"),
PinStatus[1]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"));
}
//------------------------
void setup()
{
Serial.begin(9600);
// По умолчанию в Библиотеке "ethercard" (CS-pin) = № 8.
// if (ether.begin(sizeof Ethernet::buffer, mymac) == 0).
// and change it to: Меняем (CS-pin) на 10.
// if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0).
if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0);
if (!ether.dhcpSetup());
// Выводим в Serial монитор IP адрес который нам автоматический присвоил наш Router.
// Динамический IP адрес, это не удобно, периодический наш IP адрес будет меняться.
// Нам придётся каждый раз узнавать кой адрес у нашей страницы.
ether.printIp("My Router IP: ", ether.myip); // Выводим в Serial монитор IP адрес который нам присвоил Router.
// Здесь мы подменяем наш динамический IP на статический / постоянный IP Address нашей Web страницы.
// Теперь не важно какой IP адрес присвоит нам Router, автоматический будем менять его, например на "192.168.1.222".
ether.staticSetup(myip);
ether.printIp("My SET IP: ", ether.myip); // Выводим в Serial монитор статический IP адрес.
//-----
for(int i = 0; i <= 8; i++)
{
pinMode(LedPins[i],OUTPUT);
PinStatus[i]=false;
}
}
unsigned int ConditionerOn1[60] = {8350, 4200, 550, 1650, 550, 500, 550, 550, 550, 550, 550, 1600, 550, 500, 600, 500, 600, 500, 550, 500, 550, 550, 550, 550, 550, 500, 550, 550, 550, 550, 550, 500, 550, 550, 600, 500, 550, 1600, 550, 550, 550, 1600, 550, 500, 550, 1650, 550, 500, 600, 500, 600, 1550, 600, 500, 500, 600, 500, 1650, 550};
unsigned int ConditionerOn2[60] = {8400, 4150, 600, 1550, 600, 500, 600, 450, 600, 500, 600, 1550, 600, 500, 600, 500, 600, 450, 600, 1550, 600, 1600, 600, 450, 600, 500, 600, 500, 600, 450, 600, 500, 600, 500, 600, 450, 600, 500, 600, 500, 600, 450, 600, 500, 600, 1550, 600, 500, 600, 1550, 600, 500, 600, 450, 600, 500, 600, 1550, 600};
unsigned int ConditionerOn3[60] = {8450, 4200, 550, 1550, 600, 500, 600, 450, 650, 450, 600, 1550, 650, 450, 600, 450, 650, 450, 650, 450, 600, 500, 600, 450, 650, 500, 550, 450, 650, 450, 650, 450, 600, 500, 600, 500, 600, 1550, 600, 450, 650, 1500, 650, 450, 600, 1600, 650, 400, 600, 450, 650, 1550, 600, 500, 600, 450, 600, 1600, 600};
// --------------------------------------
void loop()
{
delay(1); // Дёргаем микроконтроллер.
word len = ether.packetReceive(); // check for ethernet packet / проверить ethernet пакеты.
word pos = ether.packetLoop(len); // check for tcp packet / проверить TCP пакеты.
if (pos) {
bfill = ether.tcpOffset();
char *data = (char *) Ethernet::buffer + pos;
if (strncmp("GET /", data, 5) != 0) {
bfill.emit_p(http_Unauthorized);
}
else {
data += 5;
if (data[0] == ' ') {
homePage(); // Return home page Если обнаружено изменения на станице, запускаем функцию.
for (int i = 0; i <= 7; i++)digitalWrite(LedPins[i],PinStatus[i+1]);
}
// "16" = количество символов "?ArduinoPIN1=on ".
else if (strncmp("?ArduinoPIN1=on ", data, 16) == 0) {
PinStatus[1] = true;
bfill.emit_p(http_Found);
irsend.sendRaw(ConditionerOn1,60,38);
delay(1*10);
irsend.sendRaw(ConditionerOn2,60,38);
delay(1*10);
irsend.sendRaw(ConditionerOn3,60,38);
}
//------------------------------------------------------
else if (strncmp("?ArduinoPIN1=off ", data, 17) == 0) {
PinStatus[1] = false;
bfill.emit_p(http_Found);
irsend.sendRaw(ConditionerOn1,60,38);
delay(1*10);
irsend.sendRaw(ConditionerOn2,60,38);
delay(1*10);
irsend.sendRaw(ConditionerOn3,60,38);
}
//---------------------------
else {
// Page not found
bfill.emit_p(http_Unauthorized);
}
}
ether.httpServerReply(bfill.position()); // send http response
}
}
Подключил MEGA 2560... Cкетч залился без ошибок и теперь не пишется о не хватки памяти. Но сетка не заводится... Не загораются диоды на ENC28J60 Enternet. На UNO помогало быстрое переключение по питанию т.е. выключение питания UNO и резкое включение (менее чем через 1сек). Пробовал внешним питанием на 2А не помогло... У кого нибудь такое было? Что может быть?
Поделюсь немного теорией которую нашел в интернете.
Последовательный IR интерфейс представляет собой комбинацию вспышек светодиода в инфракрасном диапазоне. Это диапазон выбран для повышения помехоустойчивости. Замечу сразу, пару приемник-передачик нужно брать одинакового диапазона. Обычно 940 нм, но встречаются и другие.
Идея в протоколе заложена такая: логическая единица передается импульсом определенной длины и паузой, которая обычно длинее импульса в два раза.
Известные фирмы NEC, SONY, PANASONIC взяли такую модуляцию за основу и придумали протоколы под свои гаджеты.
Так вот, всем известная библиотека IRremote, вначале определяет соотношение импульса и паузы, вычисляя таким образом чей это протокол, затем преобразует поток импульсов в логические единицы и показывает нам принятый дамп в виде HEX кода.
Когда что-то не укладывается в рамки классического протокола, она (библиотека) сообщает нам UNKNOWN и выводит на монитор просто набор длительностей импульсов и пауз разделенных запятой, а для наглядности ставит минус перед длительностью паузы. Так называемый DAMP.
На заре вычислительной техники, протоколы мало чем отличались и представляли 2-х байтовые посылки. Только PANASONIC еще всегда добавлял впереди команды адрес устройства. Все это наша библиотека легко распознает и оборачивает в удобочитаемую компактную форму. Для кодировки десятка кнопок пульта этого вполне достаточно. Поэтому так легко настраивается самопальное управление телевизорами.
Но поперли кондиционеры и им для эффективного управления стало тесно в 16-разрядном поле. Поэтому дамп стал быстро расти и на моем кондишине он имеет уже массив на одну команду в 226 ячеек. Такой массив, библиотека уже не может переварить в силу программных ограничений. И это приводит в ступор многих. Вроде бы команда определилась, а устройством не рулит. Потому как хвост от команды потерялся.
Теперь следующая проблема.
Если тупо собрать все дампы команд и попытаться их в прямом виде запихнуть в скеч - компиляция сорвется из-за нехватки памяти.
Из выше изложенной теории известно что дамп - это набор нулей и единиц записанных программой как длительности импеульсов и пауз, поробуем подготовить дамп по другому. Запишем длительности из нашего дампа типа 500- это единица, а 1000 это ноль.
Массив становится компактней, но все равно упираемся в не хватку памяти. Надо уходить от массивов. И вот тут нужен анализатор протокола. Промышленный аппарат для таких задач за 20 килотонн зеленых рублей. На просторах инета может и можно найти протоколы, но мне под свой кондей - не удалось. Тогда....
Засучиваем рукова, закидываем все команды в Эксель и и тупо вычисляем закономерности. Скажу вам сразу, очень любопытно смотреть как работала логика профессионального разработчика.
Ну обратная задача, заменить в стандартном дампе отдельные биты, уже не представляет сложности.
Jon2013, вы смотрели сигнал от своего пульта на осциллографе, или это сейчас просто теоритические размышления были? Я смотрел, и тут-же писал протокол обработки. Поэтому и говорю что так удобно.
Как можно в наборе последовательных импульсов увидеть логику работы целого дивайса? Тем более, что команда одна от другой отличаются парой битов в посылке из десятка байтов? Не, даже не пытался подключать лог.анализатор, тем более осцил. Я же не ремонтировал устройство, а искал закономерности в гиганском потоке последовательных посылок. Я еще могу себе представить команды для телевизора, там посылка из 16 битов. Настроить лог.анализатор чтобы он показывал все это в HEX-коде и тупо соображать в чем там хитрость. По мне так это изврат какой-то.
Тем более что библиотека как раз всю эту логику сама переваривает и дает дамп посылки.
Jon2013, а какая у вас задача то? Тот способ, о котором я говорю облегчает работу по эмуляции посылки полного пакета. Т.е. точно воспроизвести нечто полученное как магнитофон не пользуясь никакими библиотеками. Можно конечно и побайтово разбирать, соотносить что за что отвечает( и энтузиасты были!), но это долго и очень муторно. Проще заказать дополнительный пульт, и "нажимать" ардуиной его кнопки.
Мне нужен пульт для кондиционера фирмы McQuay который бы полностью копировал команды родного пульта. Я делаю пульт с привязкой через WiFi к сотовому телефону. Ну чтобы через интернет можно было бы включить кондишин до приезда домой. Готовые пульты эту задачу не решают. Похожие по функционалу стоят от $50 до $250.
А резистор подтягивать? И подключать как на картинке на первой странице данной темы?
И что означает значение 20 в строке
My_Sender.send(NEC,0x12181110, 20)
Библиотека "мрачная", ужасная и т.п. Если у Вас UNO, то к 3 пину цепляем передатчик. В других случаях, смотрите в библиотеке, пойду вымою руки после её просмотра. Буду знать, что точно не нужно использовать. Наследование через жопу - такого я еще не видел никогда.
Я про либу, которая здесь https://github.com/cyborg5/IRLib. Описание есть здесь http://tech.cyborg5.com/irlib/docs/1-irlib-reference/1-4-hardware-considerations/1-4-1-supported-hardware-platforms/ там можно посмотреть, какие пины нужно использовать. Удачи. Брр
У меня Леонардо. А какую тогда лучше библиотеку использовать? IRremote?
Leonardo, 9 пин.
Универсальная библиотека - да IRremote. Для исследований нормально, но занимает немало места.
Наверняка найдутся ещё либы, которые тоже нормальные.
Лично я использовал бы IRremote на начальном этапе, а потом для уже известного протокола нашёл бы простую реализацию.
Хотя все это философия, пользуйтесь тем, что удобнее лично Вам.
А насчет подключения не просветите? Я подключил к 9 пину. И он у меня посылает сигнал. Аж видно голубой огонек в момент посыла. Это нормально? И резистор я правильно между 9-м пином и передатчиком на 100 Ом поставил?
У меня кондей все равно код не принимает. Я вот думаю, может в аппаратной части где ошибся. Если нет, то буду либу менять.
C пульта считал код. Оказался: Received NEC Value:0x12181110
Вот так же считайте код, который посылаете своим передатчиком. А уже когда будет получен правильный код, можно и кондиционером заняться.
Кондиционер - не каждый может завести, там проблем может быть много, потому что посылка там далеко не такая короткая, как Вам кажется.
Поищите на форуме, тем с кондиционерами было не так уж и много. У кого то получилось.
Долго мучался с своей сплит системой(electrolux пульт YACIFBI), пока не нашел на просторах инета скетч
#define LEDPIN 11 //you may increase this value on Arduinos with greater than 2k SRAM #define maxLen 800 volatile unsigned int irBuffer[maxLen]; //stores timings - volatile because changed by ISR volatile unsigned int x = 0; //Pointer thru irBuffer - volatile because changed by ISR void setup() { Serial.begin(9600); //change BAUD rate as required attachInterrupt(0, rxIR_Interrupt_Handler, CHANGE);//set up ISR for receiving IR signal } void loop() { // put your main code here, to run repeatedly: Serial.println(F("Press the button on the remote now - once only")); delay(5000); // pause 5 secs if (x) { //if a signal is captured digitalWrite(LEDPIN, HIGH);//visual indicator that signal received Serial.println(); Serial.print(F("Raw: (")); //dump raw header format - for library Serial.print((x - 1)); Serial.print(F(") ")); detachInterrupt(0);//stop interrupts & capture until finshed here 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);//end of visual indicator, for this time attachInterrupt(0, rxIR_Interrupt_Handler, CHANGE);//re-enable ISR for receiving IR signal } } void rxIR_Interrupt_Handler() { if (x > maxLen) return; //ignore if irBuffer is already full irBuffer[x++] = micros(); //just continually record the time-stamp of signal transitions }Ir data подключается ко второму pin
Получил на выходе код во много раз превышающий буфер Ir Remote
Нашел что между сигналами проходит около 20 и 40 милисекунд(не уверен точно в чем там исчесляется) и тут получился следующий код использующий библиотеку Ir Remote
#include <IRremote.h> IRsend irsend; //int incomingByte = 0; // for incoming serial data //char character; void setup() { Serial.begin(9600); // opens serial port, sets data rate to 9600 bps } int x; String str; void loop() { //while(Serial.available() > 0) int a=0; while (a==0) { unsigned int r11[73] = {9048,4468,680,1624,672,536,672,532,680,1628,672,540,676,528,676,528,676,532,676,532,672,532,672,536,672,1636,672,532,672,536,680,524,672,536,680,524,680,524,672,536,680,528,676,528,676,532,672,1640,672,532,672,532,684,528,676,528,668,536,680,1628,680,528,676,1628,680,528,680,528,676,1632,676,528,676 }; unsigned int r12[65] = {676,528,680,528,676,528,676,532,672,536,672,532,672,536,668,536,672,536,680,524,680,528,676,528,676,532,676,1628,680,528,676,532,672,536,672,536,668,536,680,528,676,528,676,528,680,532,672,532,672,532,676,532,672,532,672,536,672,1632,676,528,676,1636,672,1636,672}; unsigned int r13[73] = {9004,4464,672,1636,676,532,672,536,668,1640,668,536,672,536,676,528,680,528,676,528,668,536,680,528,676,1632,676,528,676,532,676,528,676,532,672,532,676,532,672,532,672,536,680,528,676,532,676,1628,680,528,676,528,680,532,672,528,676,532,672,1636,676,1632,672,1632,676,532,676,532,672,1632,676,532,672}; unsigned int r14[65] = {680,528,676,528,680,528,676,532,672,532,672,536,672,532,672,536,680,528,676,528,680,528,676,532,672,532,672,536,672,532,672,536,668,540,676,528,680,524,680,528,676,532,676,524,680,532,672,532,672,532,676,532,672,532,676,528,676,1636,672,1636,672,536,668,1636,672}; irsend.sendRaw(r11,73,38); delay(20); irsend.sendRaw(r12,65,38); delay(40); irsend.sendRaw(r13,73,38); delay(20); irsend.sendRaw(r14,65,38); delay(5000); } }Естественно код для теста, но передает суть. Надеюсь поможет тем кто будет решать данную проблему с кондеями и прочими системами которые посылают сразу с несколько сигналов с маленьким разрывом
Вот так же считайте код, который посылаете своим передатчиком. А уже когда будет получен правильный код, можно и кондиционером заняться.
Кондиционер - не каждый может завести, там проблем может быть много, потому что посылка там далеко не такая короткая, как Вам кажется.
Поищите на форуме, тем с кондиционерами было не так уж и много. У кого то получилось.
Попробовал считать код со своего передатчика. Приемник молчит. Типа передатчик ничего не передает. Хотя ИК передатчик моргает голубым светом однократно. Но сигнал походу не посылает. Ресивер ничего не пишет в буфер, хотя когда в него пультом от кондея тычу, всё прекрасно реагирует. Начал думать. Может я схему неправильно собрал? На зарубежном блоге mySensors чел собрал передатчик из 5-ти диодов. У него в схеме транзистор использовался NPN (ох уж эти дырки и переходы мне в универе тяжело давались) и сопротивление 1КОм. У меня же 1 диод. Подключен к 3-му пину Ардуины Нано через резистор 100 Ом. Всё как написано тут. Может, я в схеме что-то напутал? Или по какой другой схеме надо подключать, объясните, зачем тут транзистор, идля чего он нужен?
Фотка для наглядности.
минус подсоединяем к большому лепестку светика(это минус, ну и второй плюс естественно), т.е если полярность перепутали- нечего не будет. ир приемник помоему на трех ножках...т.е берем заведомо исправный пульт, собираем приемник и смотрим...а потом уже вещаем второй ардуино и смотрим что принимаем...
у вас на фотграфии ir передатчик
ну да, передатчик. Который ничего не отсылает. Приемник висит на той же ардуине. "Заведомо исправным пультом" всё шлется в приемник и коды в сериал выводит. А этим ir передатчиком глухо как в танке. Проблема в вещании. Попробую конечно полярность поменять, но склоняюсь уже взять передатчик с обвязкой типа такого: http://www.ebay.com/itm/3W-Infrared-Ray-IR-Transmission-Module-940nm-LED...
Пробовал полярность менять. Все без толку. Вроде длинный это плюс (анод), а короткий - минус (катод).
Камерой мобильника гляньте: отсылает - не отсылает......
Нет, через камеру ничего не видно.
Как то я тоже пытался сделать на одной ардуино и приемник и передатчик, вообщем у меня не получилось..(может я что то не правильно делал...) работало или приемник или передатчик. В итоге сделал- на одной ардуине передатчик, на второй ардуине приемник и все заработало...может вам тоже пойти по этому пути?...
посмотрите пост 70 и ниже, и вот тут я спрашивал про работу ir передатчика и приемника на одной ардуине
http://arduino.ru/forum/programmirovanie/ir-peredatchik#comment-61224
Ну вообще должно работать и на одной ардуине. В скетче прописан
То есть ардуина возвращается в режим приема сигналов. Плюс еще в той теме, что Вы мне посоветовали на куартинке что-то воткнуто перед ИК передатчиком. Но картинка мелкая - не разглядеть.
Ничего вам ардуина не должна, с данной библиотекой,свой собственный сигнал принимать она не может. Светодиод не должен гореть никаким светом, если горит значит у вас не ИК светодиод. Да и вообще, вы когда откуда то взяли этот светодиод о нем была какая то информация, что это именно ИК светодиод?
Ладно, куплю ИК передатчик с обвязкой, разнесу всё на разные ардуины, тогда попробую - отпишусь.
ИК диод шел в комплекте с пультом и ресивером: http://www.ebay.com/itm/HX1838-Infrared-Remote-Control-Module-Code-Infrared-Remote-Control-Code-/311144145200?pt=LH_DefaultDomain_0&hash=item4871a2e130
Из той же темы:
Значит не тот всетодиод вам прислали.
Из той же темы:
Мы наверное не понимаем друг друга. Если вы пыаетесь принять ИК сигнал передавемый этой же дуиной, то ничего не получится. Если же речь идет о том, что дуина всегда "слушает" - ожидает сигнала и переодически еще куда то передает сигнал, при этом в этот момент она перестает "слушать", то да это работает.
Но судя по вашим постам, вы проверяете как дуина передает сигнал пытаясь принять его этой же дуиной, и естественно ничего не принимается, потому что одновременно с этой библиотекой нельзя принимать свой же передаваемый сигнал.
ir светодиод это тот же самый светодиод,только он вещает в другом спектре(не видим человеческому глазу). а ir приемник принимает этот переданный пакет информации(света). посмотреть на работу можно только фотоаппаратом(телефонного к примеру) - будет видно мерцание. Если ваш светик видно как моргает в живую при наличии ограничивающего ризистора- то по идее у вас или не тот светик или напруга завышена. нечего видно быть не должно, возьмите обычный пульт и посмотрите телефоном как ваш пульт мерцает при нажатии кнопки...у вас так же должно быть.
В этой же ветке есть - и что такое ир светодиод и что такое ирда приемник и схемы и т.д
с ирда приемником всё более-менее понятно. Я хотел выяснить по поводу передатчика. на сколько резистор подтягивать, полярность и вообще тот ли мне светодиод подсунули. Теперь, в общем, заказал передатчик с обвязкой и буду на разных дуинах тестировать. Понятно, что когда она посылает сигнал, считывать он не может. И на этом спасибо.
PS: Пора FAQ на форуме делать. Много смежных тем раскидано по всему форуму.
Amdcooper, подскажи плиз, удалось ли наладить в итоге взаимодействие ардуино и кондея?
Потерял аналогичный пульт (YACIFBI), пытаюсь найти в инете описание кодов, так как запрограммировать с оригинального пульта возможности нет.
Если есть исходники программы, то просто супер, спасешь от жары!
Заренее спасибо
Спасти от жары сможет аварийная кнопка включения, которая обычно находитсяпод лицевой панелью где-то, ну на крайний случай универсальный пульт для кондеев.
Спасибо за совет! Кнопка действительно есть, но проблема в том, что он стоит на нагрев с зимних времен, и получается не очень прохладно(((
Коды работают. Я правда не считывал пока все так как жду детелей из китая (долго жду). Если очень надо могу считать коды.
У меня просто в планах нарисовать универсальный пуль с управлением через комп(возможно голосом) и по средствам инета. Едешь домой включил кондей, зашел домой запустил телек.
Спасибо за ответ!
Буду очень благодарен если скинешь коды на следующие функции:
- Вкл\выкл
- Температура вверх
- Температура вниз
- Переключение режимов
- Регулировка мощности
- Направление струи
Остальное не критично.
Готов отблагодирить за эту бесценную для меня в этот жаркий период инфу.
Чтобы не заспамить тему окончательно, предлагаю продолжить диалог по почте vergleb@yandex.ru
Спасибо
Поделюсь своим опытом для кондея LG.
Во-первых, у меня на включение выходил код:
8800
Decoded JVC: 8800 (16 bits)
Raw (60): {8400, 4150, 550, 1650, 500, 550, 550, 550, 600, 500, 550, 1600, 600, 450, 600, 500, 550, 550, 500, 550, 550, 550, 600, 500, 600, 450, 600, 500, 600, 500, 600, 450, 600, 500, 600, 500, 500, 1650, 600, 500, 600, 1550, 600, 450, 600, 1600, 600, 450, 600, 500, 500, 1650, 600, 500, 600, 450, 600, 1600, 600};
не заработало через "Raw" и через "sendJVC" не включался даже если три или два раза отправлять код:
irsend.sendJVC(ConditionerOn,16,0);
Во-вторых, при считывании, нажимая вкл. на пульте несколько раз, увидел три разных кода и решил, что все эти три кода нужны для включения. Вставил эти коды и кондер включился...)
irsend.sendRaw(ConditionerOn1,60,38);
delay(1*10);
irsend.sendRaw(ConditionerOn2,60,38);
delay(1*10);
irsend.sendRaw(ConditionerOn3,60,38);
delay(1*5000);
где, ConditionerOn1, ConditionerOn2, ConditionerOn3 - код кнопки включения.
И в-третьих диод пришлось подносить к кондею на расстояние 30см, чтобы он включился.
Ничего удивительного - пульты отправляют в кондиционеры не абстрактное "включись", а <b>все</b> параметры - сколько градусов, куда дуть и т.д.
Проблема с скетчем для включения кондея по сетке. Взял скетч для реле отсюда (ENC28J60 Enternet HR911105A Pin ON OF Relays) не нужное убрал и добавил IR. Но при отправки команды на кондей (вижу как моргает дион на IR датчике) кондей издает звук и не включается. Как будто отправляет не все три команды irsend.sendRaw...
увеличил ожидание до 1000 и обнаружил мигание диода на IR датчике не три раза а 12 раз. Почему?
заработало...))) уменьшил ожидание
Привет. Поздравляю. Сам всё и решил :)
Подключил MEGA 2560... Cкетч залился без ошибок и теперь не пишется о не хватки памяти. Но сетка не заводится... Не загораются диоды на ENC28J60 Enternet. На UNO помогало быстрое переключение по питанию т.е. выключение питания UNO и резкое включение (менее чем через 1сек). Пробовал внешним питанием на 2А не помогло... У кого нибудь такое было? Что может быть?
решилось внешним питанием...)
поделитесь пожалуйста кодами от жк тв самсунг, пульт перестал работать, хочу собрать ретранслятор с заменой кода и приспособить другой пульт
Интересно, автору текста не приходило в голову взять логический анализатор или осциллограф и посмотреть глазами закономерность? :)
....взять логический анализатор или осциллограф и посмотреть глазами закономерность? :)
И что я этими приборами увижу????? Какую закономерность?
Чем отличаются два десятка соседних импульсов?
Логическим анализатором обычно смотрят паралельные потоки импульсов. Их взаимное расположение.
На пример работу параллельного интерфейса.
Осцилографом - форму сигнала, помехи.
А вот анализатором протоколов выявляют закономерности в командах. И стоят они в районе $20 000.
Прежде чем предлагать прибор, надо все же представлять, что им хочется смотреть.
Jon2013, вы смотрели сигнал от своего пульта на осциллографе, или это сейчас просто теоритические размышления были? Я смотрел, и тут-же писал протокол обработки. Поэтому и говорю что так удобно.
Как можно в наборе последовательных импульсов увидеть логику работы целого дивайса? Тем более, что команда одна от другой отличаются парой битов в посылке из десятка байтов? Не, даже не пытался подключать лог.анализатор, тем более осцил. Я же не ремонтировал устройство, а искал закономерности в гиганском потоке последовательных посылок. Я еще могу себе представить команды для телевизора, там посылка из 16 битов. Настроить лог.анализатор чтобы он показывал все это в HEX-коде и тупо соображать в чем там хитрость. По мне так это изврат какой-то.
Тем более что библиотека как раз всю эту логику сама переваривает и дает дамп посылки.
Jon2013, а какая у вас задача то? Тот способ, о котором я говорю облегчает работу по эмуляции посылки полного пакета. Т.е. точно воспроизвести нечто полученное как магнитофон не пользуясь никакими библиотеками. Можно конечно и побайтово разбирать, соотносить что за что отвечает( и энтузиасты были!), но это долго и очень муторно. Проще заказать дополнительный пульт, и "нажимать" ардуиной его кнопки.
Мне нужен пульт для кондиционера фирмы McQuay который бы полностью копировал команды родного пульта. Я делаю пульт с привязкой через WiFi к сотовому телефону. Ну чтобы через интернет можно было бы включить кондишин до приезда домой. Готовые пульты эту задачу не решают. Похожие по функционалу стоят от $50 до $250.
Вот один из моих прототипов.
Так у тебя получилось или нет????
Все, разобрался и все работает.
тоже интересно стало. хотя я видел видео дмитрия осипова про управление через интернет