Доброго времени суток всем мозгодрузьям! В копилку универсальных пультов добавляю свое мозгоруководство о том, как научить свой смартфон контролировать вашу бытовую технику.
Реализовав шаги данного проекта, который состоит из двух частей: получение сигналов ДУ и сборка передающего модуля, вы сможете управлять вашими телевизором, DVD и аудио-системой с непосредственно со смартфона. Понадобится для этого приложение написанное в App Inventor и еще несколько компонентов:
- Arduino One — 1шт.
- макетная плата — 1шт.
- ИК-приемник Tsop1838 или эквивалентный — 1шт. (в проекте используется лишь для захвата управляющих сигналов)
- ИК-светодиоды — 2шт.
- Bluetooth-модуль НС-05 — 1шт.
- резистор 220 Ом — 2шт.
- кабели с разъемами
- пульт ДУ — используется лишь для захвата сигнала
Шаг 1: Сборка считывающего устройства
Первым делом необходимо получить управляющие сигналы на которые «откликается» техника. Для этого собираем простую электроцепь ориентируясь на мозгорисунок.
ИК-приемник имеет три контакта, первый из которых подключаем к 11-му контакту Arduino, второй на массу, а третий к +5В. Кстати, ИК-сенсоры, такие как Tsop1838 можно подключать к любому цифровому входному контакту.
Далее скачиваем библиотеку IRremote, которая позволяет получать и отправлять ИК-сигналы различных протоколов, таких как Nec, Philips RC5, RC6 Philips и т.п. После этого скачиваем сам код для ArduinoprobarCodigosRaw.
#include
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
}
// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v)
{ // decode_results *results = (decode_results *)v
void dump(decode_results *results)
{ int count = results->rawlen;
if (results->decode_type == UNKNOWN)
{ Serial.print(«Unknown encoding: «);
}
else if (results->decode_type == NEC)
{ Serial.print(«Decoded NEC: «);
} else if (results->decode_type == SONY)
{ Serial.print(«Decoded SONY: «);
}
else if (results->decode_type == RC5)
{ Serial.print(«Decoded RC5: «); }
else if (results->decode_type == RC6)
{ Serial.print(«Decoded RC6: «); }
else if (results->decode_type == PANASONIC)
{ Serial.print(«Decoded PANASONIC – Address: «);
Serial.print(results->panasonicAddress,HEX);
Serial.print(» Value: «); }
else if (results->decode_type == JVC)
{ Serial.print(«Decoded JVC: «); }
Serial.print(results->value, HEX);
Serial.print(» («);
Serial.print(results->bits, DEC);
Serial.println(» bits)»);
Serial.print(«Raw («);
Serial.print(count, DEC);
Serial.print(«): «);
for (int i = 0; i < count; i++)
{ if ((i % 2) == 1)
{ Serial.print(results->rawbuf[i]*USECPERTICK, DEC); }
else
{ Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC); }
Serial.print(» «); }
Serial.println(«»); }
void loop()
{
if (irrecv.decode(&results))
{
Serial.println(results.value, HEX);
dump(&results);
irrecv.resume(); // Receive the next value
}
}
Шаг 2: Захват сигналов
После того как считывающее устройство поделки собрано, открываем в Arduino IDE окно последовательного монитора и на пульте ДУ от вашей техники нажимаем нужную кнопку, при этом Arduino должен получать данные, то есть считывать протокол, сигнал и необработанные данные.
На фото представлены данные которые получает моя самоделка при нажатии кнопок «power» и «open/closed» на пульте от DVD.
Таким образом сохраняем или копируем все сигналы от нужных кнопок, которые потом планируете использовать для управления своей техникой.
В своем коде я использовал следующие кнопки:
- для телевизора — power, громкость+, громкость-, канал +, канал- и режим TV/Dvd
- для DVD — power, open/close, play and stop
- для аудио-системы — power, play cd и кнопка preset
Сигналы этих кнопок будут прописаны в коде.
Шаг 3: Передающее устройство
Для создания передатчика нужны всего лишь:
- Arduino
- Bluetooth-модуль
- ИК-светодиоды (количество светодиодов зависит от расположения вашей техники в доме, мне хватило и двух)
Замечу, что ИК-светодиоды необходимо подключить к 3-му контакту Arduino, потому что именно его задействует библиотека.
На Arduino в этой мозгоподелке используются лишь три контакта:
№ 3 — для светодиодов
№ 0 — Bluetooth-модуль, контакт Tx
№ 1 — Bluetooth-модуль, контакт Rx
!!! При загрузке кода на Arduino модуль Bluetooth должен быть отключен!
Шаг 4: Загрузка кода
Кликаем DomoArdu для начала загрузки или копируем следующие строки:
#include «<\IrRemote.h\>»;
IRsend ir;
int estado=0;
char dato;
//These codes are for controlling the Audio System
unsigned int powerEquipo[32]={300,750,300,1800,300,700,350,700,350,1750,350,700,300,1800,250,1800,350,700,300,1800,350,700,300,700,350,700,350,1750,300,750,300}; //unsigned int chEmisoraUp[32]= {300,750,300,750,300,1750,250,800,300,750,300,750,250,800,300,750,250,1800,250,1850,300,750,250,800,200,800,300,1800,300,750,300}; unsigned int chEmisoraUp[32] ={300,750,300,750,300,1800,200,850,300,750,250,750,300,750,300,750,300,1800,300,1750,300,750,300,750,300,750,300,1800,250,750,300}; unsigned int chEmisoraDown[32] = {350,700,400,650,300,1750,350,700,350,700,350,700,300,750,300,700,350,700,300,750,350,1750,400,650,300,700,350,1750,300,750,300};
unsigned int playCd[32] = {400,650,400,650,350,1750,350,700,350,650,350,1750,350,1750,300,1750,400,1700,350,1750,350,700,350,650,400,650,350,1750,450,600,350};
//These codes are for controlling the Tv
unsigned int pwrTv[68]={4600,4350,700,1550,650,1550,650,1600,650,450,650,450,650,450,650,450,700,400,700,1550,650,1550,650,1600,650,450,650,450,650,450,700,450,650,450,650,450,650,1550,700,450,650,450,650,450,650,450,650,450,700,400,650,1600,650,450,650,1550,650,1600,650,1550,650,1550,700,1550,650,1550,650}; // volume up unsigned int volUpTv[68]={4600,4350,650,1550,700,1500,700,1550,700,400,700,400,700,450,650,450,700,400,700,1500,700,1550,650,1550,700,400,700,400,700,450,650,450,700,400,700,1500,700,1550,650,1550,700,400,700,450,700,400,700,400,700,400,700,450,650,450,650,450,650,1550,700,1500,700,1550,700,1500,700,1550,650}; // volume down unsigned int volDownTv[68]={4600,4350,700,1550,650,1550,700,1500,700,450,650,450,700,400,700,400,700,400,700,1550,700,1500,700,1550,700,400,700,400,700,400,700,450,650,450,650,1550,700,1500,700,450,650,1550,700,400,700,400,700,450,700,400,700,400,700,400,700,1550,700,400,700,1500,700,1500,700,1550,700,1500,700}; // channel up unsigned int chUpTv[68]={4600,4350,700,1500,700,1500,700,1550,700,450,650,400,700,450,650,450,700,400,700,1500,700,1550,650,1550,700,450,650,450,700,400,700,400,700,400,700,400,700,1550,700,400,700,400,700,1550,650,450,700,400,700,400,700,1550,650,450,650,1600,650,1550,650,450,700,1500,700,1500,700,1550,650}; // channel down unsigned int chDownTv[68]={4650,4300,700,1550,700,1500,700,1550,700,400,700,400,700,400,700,450,650,450,650,1550,700,1500,700,1550,700,400,700,400,700,400,700,450,700,400,700,400,700,400,700,450,650,450,650,1550,700,400,700,450,650,400,700,1550,700,1500,700,1550,700,1500,700,400,700,1550,650,1550,700,1500,700};
// Tv/Video unsigned int videoTv[68]={4500,4300,650,1600,650,1550,650,1600,650,500,600,500,650,500,650,500,650,500,600,1650,600,1600,650,1550,650,500,650,500,650,500,600,500,650,500,650,1600,600,500,650,500,650,500,650,500,600,550,600,500,650,500,650,500,650,1550,650,1600,650,1550,650,1600,650,1550,650,1600,650,1550,650};
void setup()
{
Serial.begin(9600);
}
void loop()
{
if(Serial.available()>0)
{ dato=Serial.read();
switch (dato)
{ case ‘R’:
ir.sendRaw(powerEquipo,32,38);
delay(500);
break;
case ‘T’:
ir.sendRaw(chEmisoraUp,32,38);
delay(100);
break;
case ‘U’:
ir.sendRaw(chEmisoraDown,32,38);
delay(100);
break;
case ‘V’:
ir.sendRaw(playCd,32,38);
delay(100);
break;
case ‘K’:
//Power the TV
ir.sendRaw(pwrTv,68,38);
delay(100);
break;
case ‘L’:
//Volume +
ir.sendRaw(volUpTv,68,38);
delay(100);
break;
case ‘M’:
//Volume —
ir.sendRaw(volDownTv,68,38);
delay(100);
break;
case ‘N’:
//Channel +
ir.sendRaw(chUpTv,68,38);
delay(100);
break;
case ‘O’:
//Channel —
ir.sendRaw(chDownTv,68,38);
delay(100);
break;
case ‘P’:
// Tv/Video
ir.sendRaw(videoTv,68,38);
delay(100);
break;
case ‘A’:
for (int i = 0; i < 3; i++)
{
ir.sendNEC(0xFF30CF, 32); // Power the DVD
delay(40);
}
break;
case ‘B’:
for (int i = 0; i < 3; i++)
{
ir.sendNEC(0xFF00FF, 32); // Open /Close
delay(40);
}
break;
case ‘C’:
for (int i = 0; i < 3; i++)
{
ir.sendNEC(0xFF52AD, 32); // Play
delay(40);
}
break;
case ‘D’:
for (int i = 0; i < 3; i++)
{
ir.sendNEC(0xFF728D, 32); // Stop
delay(40);
} break;
} // fin del switch
} //fin del if
}//fin del loop
Шаг 5: Приложение для смартфона
На рисунке представлена блоковая диаграмма приложения самоделки созданного в App Inventor 2. Само же приложение Domo-Ardu, которое нужно просто загрузить в смартфон, использует Bluetooth-клиент, несколько кнопок, этикеток и наклеек, а для его работы нужно установить Bluetooth-соединение, выбрать устройство и нажать одну из возможных кнопок управления.
Вот такое небольшое, но надеюсь полезное мозгоруководство у меня получилось.
Благодарю за внимание и удачи в творчестве!
( Специально для МозгоЧинов #Control-your-Tv-Dvd-and-Audio-system-with-Arduino-
хай мене пофарбують. замість звичайного пульта треба тягати смарт, повинен бути запущений блютус то ірда інтерфейс. для загального розвитку — цілком, а от для використання: смарт важчий і більший дісташки, для того щоб перемкнути канал потрібно: увімкнути зуб *жре як не в себе, і акумулятор не гірше ввафая садть, запустити прогу, а тоді перемкнути канал. та простіше сідницю відірвати від ліжка, або знайти пульт.
в свій час намагався розібратись з системою команд пульта ДУ. щось не вийшло і просто закинув. може натхнення з’явиться і ще раз спробую на готовому прикладі