Доброго времени суток всем мозгодрузьям! В копилку универсальных пультов добавляю свое мозгоруководство о том, как научить свой смартфон контролировать вашу бытовую технику.
Реализовав шаги данного проекта, который состоит из двух частей: получение сигналов ДУ и сборка передающего модуля, вы сможете управлять вашими телевизором, 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-