Продовжуємо робити різні смарт/розумні/bluetooth девайси на ардуїно. У минулих статтях я розповідав про bluetooth машинку і bluetooth вольтметр. сьогодні йтиметься про щось на зразок bluetooth пульта для телевізора. Голосування на найбільш вдалу назву для такого девайса буде в кінці статті, а для початку пропоную подивитися відео як же цей девайс працює.
У статті я розповім чому, як і з чого збирав цей девайс, про переваги і недоліки його використання, а також пару слів про існуючі аналоги.
Спочатку про те, чому я вирішив зробити подібний девайс. Це, як мені здається, дуже важливе питання, тому що більшість друзів, яким я розповідав про цей пристрій питають в першу чергу не про те, як він працює, а про те, для чого я взагалі зробив цей девайс. Почалося все з того, що після довгої перерви, пов'язаної з появою у мене високошвидкісного інтернету, я вирішив включити телевізор і дізнатися, чи там що-небудь за ті кілька років, що я його не включав. Виявляється змінилося. Насамперед у мене на телевізорі виявилося 63 канали, замість 7-8 каналів, що були раніше. Це здалося хорошою новиною, поки я не зрозумів, що дивитися я зможу лише стільки каналів з цих 63, скільки їх номерів я зможу запам'ятати. Тобто, якщо Ви не пам'ятаєте, на якому каналі налаштований Discovery, подивитися Ви його фоктично не зможете, поки не перелистаєте канали по порядку. Навіть якщо Ви пам'ятаєте номер потрібного каналу, потрібно ще виловчитися натиснути 2 кнопки пульта за певний (короткий) час, потрапивши по іноді стертих кнопках пульта ДУ в темряві. Загалом це пекло, і тому я вирішив щось з цим зробити.
Тепер перейдемо безпосередньо до девайсу, який вийшло зробити. Схема досить проста:
Компоненти:
Arduino nano
Bluetooth Module
ІК світлодіод
Принцип роботи теж дуже простий. Запускаємо додаток на смартфоні, або планшеті, він відправляє інформацію з номером каналу на заздалегідь сполучений bluetooth модуль. Цей модуль передає номер каналу на ардуїно, а ардуїно генерує потрібний сигнал на 3 пін, імітуючи тим самим штатний пульт ДУ. Треба сказати, що тема управління різними побутовими приладами по ВК каналу з ардуїно розвинена досить добре, і є бібліотека IRremote для ардуїно, яка підтримує більшість телевізорів та іншої техніки з ІК управлінням.
Тепер до процесу виготовлення bluetooth пульта. Щоб дізнатися, які сигнали ардуїно повинна відсилати на телевізор, потрібно спочатку відсканувати штатний пульт ДУ за допомогою стандартного скетчу бібліотеки IRremote і ІК приймача. Пульт від мого телевізора LG вийшло відсканувати відразу. Ці коди я прописав в
скетче
#include <IRremote.h>
IRsend irsend;
unsigned long a;
void setup() {
Serial.begin(9600);
Serial.setTimeout(4);
pinMode(ledPin, OUTPUT);
}
void S1() {irsend.sendNEC(0x20DF8877, 32);delay(200);}
void S2() {irsend.sendNEC(0x20DF48B7, 32);delay(200);}
void S3() {irsend.sendNEC(0x20DFC837, 32);delay(200);}
void S4() {irsend.sendNEC(0x20DF28D7, 32);delay(200);}
void S5() {irsend.sendNEC(0x20DFA857, 32);delay(200);}
void S6() {irsend.sendNEC(0x20DF6897, 32);delay(200);}
void S7() {irsend.sendNEC(0x20DFE817, 32);delay(200);}
void S8() {irsend.sendNEC(0x20DF18E7, 32);delay(200);}
void S9() {irsend.sendNEC(0x20DF9867, 32);delay(200);}
void S0() {irsend.sendNEC(0x20DF08F7, 32);delay(200);}
void Son() {irsend.sendNEC(0x20DF10EF, 32);}
void loop()
{
if (Serial.available())
{ a = Serial.parseInt();
if (a==1) {S1();}
if (a==2) {S2();}
if (a==3) {S3();}
if (a==4) {S4();}
if (a==5) {S5();}
if (a==6) {S6();}
if (a==7) {S7();}
if (a==8) {S8();}
if (a==9) {S9();}
if (a==10) {S1();S0();}
if (a==11) {S1();S1();}
if (a==12) {S1();S2();}
if (a==13) {S1();S3();}
if (a==14) {S1();S4();}
if (a==15) {S1();S5();}
if (a==16) {S1();S6();}
if (a==17) {S1();S7();}
if (a==18) {S1();S8();}
if (a==19) {S1();S9();}
if (a==20) {S2();S0();}
if (a==21) {S2();S1();}
if (a==22) {S2();S2();}
if (a==23) {S2();S3();}
if (a==24) {S2();S4();}
if (a==25) {S2();S5();}
if (a==26) {S2();S6();}
if (a==27) {S2();S7();}
if (a==28) {S2();S8();}
if (a==29) {S2();S9();}
if (a==30) {S3();S0();}
if (a==31) {S3();S1();}
if (a==32) {S3();S2();}
if (a==33) {S3();S3();}
if (a==34) {S3();S4();}
if (a==35) {S3();S5();}
if (a==36) {S3();S6();}
if (a==37) {S3();S7();}
if (a==38) {S3();S8();}
if (a==39) {S3();S9();}
if (a==40) {S4();S0();}
if (a==41) {S4();S1();}
if (a==42) {S4();S2();}
if (a==43) {S4();S3();}
if (a==44) {S4();S4();}
if (a==45) {S4();S5();}
if (a==46) {S4();S6();}
if (a==47) {S4();S7();}
if (a==48) {S4();S8();}
if (a==49) {S4();S9();}
if (a==50) {S5();S0();}
if (a==51) {S5();S1();}
if (a==52) {S5();S2();}
if (a==53) {S5();S3();}
if (a==54) {S5();S4();}
if (a==55) {S5();S5();}
if (a==56) {S5();S6();}
if (a==57) {S5();S7();}
if (a==58) {S5();S8();}
if (a==59) {S5();S9();}
if (a==60) {S6();S0();}
if (a==61) {S6();S1();}
if (a==62) {S6();S2();}
if (a==63) {S6();S3();}
if (a==64) {S6();S4();}
if (a==65) {S6();S5();}
if (a==66) {Son();}
if (a = = 67) {irsend.sendNEC (0x807F48B7, 32); }//додати звук
if (a = = 68) {irsend.sendNEC (0x807FC837, 32); }//зменшити звук
}
}
Як з'ясувалося потім, ці коди підходять і до інших телевізорів LG.
Трохи пізніше я зробив такий же bluetooth пульт для телевізора Sony. Коди кнопок пультів Sony теж зчитуються легко, але потрібно знати, що у цієї марки кожен сигнал повторюється 3 рази, а стандартний скетч для зчитування бібліотеки IRremote цього не «помічає». Тому в скетчі потрібно їх повторити 3 рази. Скетч для роботи з телевізором Sony
тут
#include <IRremote.h>
IRsend irsend;
int ledPin = 13;
unsigned long a;
void setup() {
Serial.begin(9600);
Serial.setTimeout(4);
pinMode(ledPin, OUTPUT);
}
void S1() {irsend.sendSony(0x10, 12);delay(100);irsend.sendSony(0x10, 12);delay(100);irsend.sendSony(0x10, 12);delay(1000);}
void S2() {irsend.sendSony(0x810, 12);delay(100);irsend.sendSony(0x810, 12);delay(100);irsend.sendSony(0x810, 12);delay(1000);}
void S3() {irsend.sendSony(0x410, 12);delay(100);irsend.sendSony(0x410, 12);delay(100);irsend.sendSony(0x410, 12);delay(1000);}
void S4() {irsend.sendSony(0xC10, 12);delay(100);irsend.sendSony(0xC10, 12);delay(100);irsend.sendSony(0xC10, 12);delay(1000);}
void S5() {irsend.sendSony(0x210, 12);delay(100);irsend.sendSony(0x210, 12);delay(100);irsend.sendSony(0x210, 12);delay(1000);}
void S6() {irsend.sendSony(0xA10, 12);delay(100);irsend.sendSony(0xA10, 12);delay(100);irsend.sendSony(0xA10, 12);delay(1000);}
void S7() {irsend.sendSony(0x610, 12);delay(100);irsend.sendSony(0x610, 12);delay(100);irsend.sendSony(0x610, 12);delay(1000);}
void S8() {irsend.sendSony(0xE10, 12);delay(100);irsend.sendSony(0xE10, 12);delay(100);irsend.sendSony(0xE10, 12);delay(1000);}
void S9() {irsend.sendSony(0x110, 12);delay(100);irsend.sendSony(0x110, 12);delay(100);irsend.sendSony(0x110, 12);delay(1000);}
void S0() {irsend.sendSony(0x910, 12);delay(100);irsend.sendSony(0x910, 12);delay(100);irsend.sendSony(0x910, 12);delay(1000);}
void Son() {irsend.sendSony(0xA90, 12);delay(100);irsend.sendSony(0xA90, 12);delay(100);irsend.sendSony(0xA90, 12);delay(1000);}
void loop()
{
if (Serial.available())
{ a = Serial.parseInt();
if (a==1) {S1();}
if (a==2) {S2();}
if (a==3) {S3();}
if (a==4) {S4();}
if (a==5) {S5();}
if (a==6) {S6();}
if (a==7) {S7();}
if (a==8) {S8();}
if (a==9) {S9();}
if (a==10) {S1();S0();}
if (a==11) {S1();S1();}
if (a==12) {S1();S2();}
if (a==13) {S1();S3();}
if (a==14) {S1();S4();}
if (a==15) {S1();S5();}
if (a==16) {S1();S6();}
if (a==17) {S1();S7();}
if (a==18) {S1();S8();}
if (a==19) {S1();S9();}
if (a==20) {S2();S0();}
if (a==21) {S2();S1();}
if (a==22) {S2();S2();}
if (a==23) {S2();S3();}
if (a==24) {S2();S4();}
if (a==25) {S2();S5();}
if (a==26) {S2();S6();}
if (a==27) {S2();S7();}
if (a==28) {S2();S8();}
if (a==29) {S2();S9();}
if (a==30) {S3();S0();}
if (a==31) {S3();S1();}
if (a==32) {S3();S2();}
if (a==33) {S3();S3();}
if (a==34) {S3();S4();}
if (a==35) {S3();S5();}
if (a==36) {S3();S6();}
if (a==37) {S3();S7();}
if (a==38) {S3();S8();}
if (a==39) {S3();S9();}
if (a==40) {S4();S0();}
if (a==41) {S4();S1();}
if (a==42) {S4();S2();}
if (a==43) {S4();S3();}
if (a==44) {S4();S4();}
if (a==45) {S4();S5();}
if (a==46) {S4();S6();}
if (a==47) {S4();S7();}
if (a==48) {S4();S8();}
if (a==49) {S4();S9();}
if (a==50) {S5();S0();}
if (a==51) {S5();S1();}
if (a==52) {S5();S2();}
if (a==53) {S5();S3();}
if (a==54) {S5();S4();}
if (a==55) {S5();S5();}
if (a==56) {S5();S6();}
if (a==57) {S5();S7();}
if (a==58) {S5();S8();}
if (a==59) {S5();S9();}
if (a==60) {S6();S0();}
if (a==61) {S6();S1();}
if (a==62) {S6();S2();}
if (a==63) {S6();S3();}
if (a==64) {S6();S4();}
if (a==65) {
irsend.sendSony(0x290, 12); // Sony TV mute code
delay(100);
irsend.sendSony(0x290, 12); // Sony TV mute code
delay(100);
irsend.sendSony(0x290, 12); // Sony TV mute code
delay(100);
}
if (a==66) {
irsend.sendSony(0xa90, 12); // Sony TV power code
delay(100);
irsend.sendSony(0xa90, 12); // Sony TV power code
delay(100);
irsend.sendSony(0xa90, 12); // Sony TV power code
delay(100);
}
if (a==67) {
irsend.sendSony(0x490, 12); // Sony TV vol+
delay(100);
irsend.sendSony(0x490, 12); // Sony T
delay(100);
irsend.sendSony(0x490, 12); // Sony TV vol+
delay(100);
}
if (a==68) {
irsend.sendSony(0xc90, 12); // Sony TV vol-
delay(100);
irsend.sendSony(0xc90, 12); // Sony T
delay(100);
irsend.sendSony(0xc90, 12); // Sony TV vol-
delay(100);
}
if (a==69) {S6();S9();}
if (a==70) {S7();S0();}
if (a==71) {S7();S1();}
if (a==72) {S7();S2();}
if (a==73) {S7();S3();}
if (a==74) {S7();S4();}
if (a==75) {S7();S5();}
if (a==76) {S7();S6();}
if (a==77) {S7();S7();}
if (a==78) {S7();S8();}
if (a==79) {S7();S9();}
if (a==80) {S8();S0();}
if (a==81) {S8();S1();}
if (a==82) {S8();S2();}
if (a==83) {S8();S3();}
if (a==84) {S8();S4();}
if (a==85) {S8();S5();}
if (a==86) {S8();S6();}
if (a==87) {S8();S7();}
if (a==88) {S8();S8();}
if (a==89) {S8();S9();}
if (a==90) {S9();S0();}
if (a==91) {S9();S1();}
if (a==92) {S9();S2();}
if (a==93) {S9();S3();}
if (a==94) {S9();S4();}
if (a==95) {S9();S5();}
if (a==96) {S9();S6();}
if (a==97) {S9();S7();}
if (a==98) {S9();S8();}
if (a==99) {S9();S9();}
if (a==100) {Son();}
}
}
Відео з демонстрацією роботи з Sony:
З телевізорами samsung ситуація трохи складніша. бібліотека IRremote сигнали їх пультів не розпізнає, тому їх доводиться просто відсилати в тому ж вигляді, в якому вони приходять у форматі RAW.
Скетч для роботи з телевізором самсунг
#include <IRremote.h>
IRsend irsend;
unsigned long a;
void setup() {
Serial.begin(9600);
Serial.setTimeout(4);
pinMode(ledPin, OUTPUT);
}
unsigned int A_one[78]={4450,4550,400,1800,450,650,450,1800,450,600,500,650,450,650,450,700,450,650,450,1750,450,650,500,1750,450,650,450,650,500,650,450,650,450,700,450,650,450,650,450,1750,450,650,500,650,450,650,500,650,450,650,450,1750,450,1750,500,650,450,1700,500,1750,450,1750,450,1800,450,1700,450};
unsigned int A_two[78]={4450,4550,450,1750,450,650,500,1750,500,600,450,650,450,650,500,650,450,650,500,1700,500,650,450,1800,450,600,500,650,450,650,450,650,500,650,450,1750,450,650,500,1750,450,650,450,650,450,700,450,650,450,650,450,700,450,1750,450,650,450,1700,500,1750,500,1750,450,1750,500,1650,500};
unsigned int A_three[78]={4450,4500,450,1750,450,700,450,1750,450,650,450,650,500,650,450,650,450,650,500,1750,450,650,450,1750,500,600,500,650,450,650,450,650,500,650,450,650,450,1750,500,1750,450,650,450,650,500,650,450,650,450,650,450,1750,500,650,450,650,500,1700,450,1800,450,1700,500,1750,500,1650,500};
unsigned int A_four[78]={4450,4550,450,1750,450,700,450,1750,450,650,450,650,500,650,450,650,450,650,500,1700,500,650,450,1750,500,600,500,650,450,650,450,650,500,650,450,650,450,650,500,650,450,1700,500,600,500,650,450,650,500,600,500,1750,450,1750,500,1750,450,600,500,1750,500,1700,500,1750,500,1650,500};
unsigned int A_five[78]={4450,4550,450,1750,450,650,500,1750,450,650,450,650,500,650,450,650,450,650,500,1750,450,650,450,1750,500,600,500,650,450,650,450,650,500,650,450,1750,450,650,500,650,450,1700,500,650,450,650,450,650,450,700,450,650,450,1750,500,1750,450,650,450,1750,500,1750,450,1750,500,1650,500};
unsigned int A_six[78]={4400,4550,450,1800,400,700,400,1800,450,650,450,700,400,700,450,650,450,650,500,1750,450,650,450,1750,500,600,500,650,450,650,450,700,400,700,450,650,450,1750,500,650,450,1700,500,650,450,650,450,700,400,700,450,1750,450,650,450,1800,450,650,450,1750,500,1750,450,1750,450,1700,500};
unsigned int A_seven[78]={4450,4550,450,1750,450,650,450,1800,450,650,450,650,450,650,500,650,450,650,450,1750,500,600,500,1750,500,600,500,600,500,650,450,650,500,600,500,650,450,650,500,1750,450,1700,500,600,500,650,450,650,450,650,500,1750,450,1750,500,600,500,650,450,1700,550,1700,500,1750,450,1700,500};
unsigned int A_eight[78]={4400,4550,450,1750,450,650,450,1800,450,650,450,650,450,700,400,650,500,650,450,1750,450,700,450,1750,500,600,450,700,450,650,450,650,450,700,450,1750,450,650,450,1800,450,1700,500,650,450,650,450,700,450,600,500,650,450,1750,500,650,450,650,450,1750,450,1800,400,1800,450,1700,450};
unsigned int A_nine[78]={4450,4500,450,1750,500,650,450,1800,450,600,450,650,500,650,450,650,450,700,450,1750,450,650,450,1800,450,650,450,650,450,650,500,600,500,650,450,650,500,1750,450,1750,500,1700,450,650,500,650,450,650,450,650,450,1800,450,650,450,650,450,650,450,1800,450,1750,450,1750,500,1650,500};
unsigned int A_zero[78]={4450,4500,500,1750,450,650,450,1800,450,650,450,650,450,650,500,650,450,650,450,1750,450,650,500,1750,500,600,450,650,500,650,450,650,450,650,500,1750,450,650,450,650,500,650,450,1750,450,650,450,650,500,650,450,650,450,1750,500,1750,450,1750,450,650,450,1750,500,1750,450,1700,450};
unsigned int A_w[78]={4450,4550,450,1750,450,650,500,1750,450,650,450,650,450,650,500,650,450,650,500,1700,500,600,500,1750,500,600,500,650,450,650,450,650,500,650,450,650,450,650,500,600,500,600,500,1750,500,600,500,1700,500,650,450,1750,450,1800,450,1750,450,1750,450,650,450,1750,500,650,450,1700,500};
unsigned int A_on[78]={4450,4550,450,1750,450,650,450,1800,450,650,450,650,450,650,450,700,450,650,450,1750,450,700,450,1750,500,600,450,650,500,650,450,650,450,700,450,650,450,1750,450,650,450,700,450,650,450,650,500,650,450,650,450,1750,450,700,450,1750,450,1750,400,1800,450,1800,400,1800,450,1700,450};
void S1() {irsend.sendRaw(A_one,78,38);delay(500);}
void S2() {irsend.sendRaw(A_two,78,38);delay(500);}
void S3() {irsend.sendRaw(A_three,78,38);delay(500);}
void S4() {irsend.sendRaw(A_four,78,38);delay(500);}
void S5() {irsend.sendRaw(A_five,78,38);delay(500);}
void S6() {irsend.sendRaw(A_six,78,38);delay(500);}
void S7() {irsend.sendRaw(A_seven,78,38);delay(500);}
void S8() {irsend.sendRaw(A_eight,78,38);delay(500);}
void S9() {irsend.sendRaw(A_nine,78,38);delay(500);}
void S0() {irsend.sendRaw(A_zero,78,38);delay(500);}
void Son() {irsend.sendRaw(A_on,78,38);delay(500);}
void loop()
{
if (Serial.available())
{ a = Serial.parseInt();
if (a==101) {Son ();}
if (a==102) {S2();}
if (a==103) {S3();}
if (a==1) {S1();}
if (a==2) {S2();}
if (a==3) {S3();}
if (a==4) {S4();}
if (a==5) {S5();}
if (a==6) {S6();}
if (a==7) {S7();}
if (a==8) {S8();}
if (a==9) {S9();}
if (a==10) {S1();S0();}
if (a==11) {S1();S1();}
if (a==12) {S1();S2();}
if (a==13) {S1();S3();}
if (a==14) {S1();S4();}
if (a==15) {S1();S5();}
if (a==16) {S1();S6();}
if (a==17) {S1();S7();}
if (a==18) {S1();S8();}
if (a==19) {S1();S9();}
if (a==20) {S2();S0();}
if (a==21) {S2();S1();}
if (a==22) {S2();S2();}
if (a==23) {S2();S3();}
if (a==24) {S2();S4();}
if (a==25) {S2();S5();}
if (a==26) {S2();S6();}
if (a==27) {S2();S7();}
if (a==28) {S2();S8();}
if (a==29) {S2();S9();}
if (a==30) {S3();S0();}
if (a==31) {S3();S1();}
if (a==32) {S3();S2();}
if (a==33) {S3();S3();}
if (a==34) {S3();S4();}
if (a==35) {S3();S5();}
if (a==36) {S3();S6();}
if (a==37) {S3();S7();}
if (a==38) {S3();S8();}
if (a==39) {S3();S9();}
if (a==40) {S4();S0();}
if (a==41) {S4();S1();}
if (a==42) {S4();S2();}
if (a==43) {S4();S3();}
if (a==44) {S4();S4();}
if (a==45) {S4();S5();}
if (a==46) {S4();S6();}
if (a==47) {S4();S7();}
if (a==48) {S4();S8();}
if (a==49) {S4();S9();}
if (a==50) {S5();S0();}
if (a==51) {S5();S1();}
if (a==52) {S5();S2();}
if (a==53) {S5();S3();}
if (a==54) {S5();S4();}
if (a==55) {S5();S5();}
if (a==56) {S5();S6();}
if (a==57) {S5();S7();}
if (a==58) {S5();S8();}
if (a==59) {S5();S9();}
if (a==60) {S6();S0();}
if (a==61) {S6();S1();}
if (a==62) {S6();S2();}
if (a==63) {S6();S3();}
if (a==64) {S6();S4();}
if (a==65) {S6();S5();}
if (a==66) {S6();S6();}
if (a==67) {S6();S7();}
if (a==68) {S6();S8();}
if (a==69) {S6();S9();}
if (a==70) {S7();S0();}
if (a==71) {S7();S1();}
if (a==72) {S7();S2();}
if (a==73) {S7();S3();}
if (a==74) {S7();S4();}
if (a==75) {S7();S5();}
if (a==76) {S7();S6();}
if (a==77) {S7();S7();}
if (a==78) {S7();S8();}
if (a==79) {S7();S9();}
if (a==80) {S8();S0();}
if (a==81) {S8();S1();}
if (a==82) {S8();S2();}
if (a==83) {S8();S3();}
if (a==84) {S8();S4();}
if (a==85) {S8();S5();}
if (a==86) {S8();S6();}
if (a==87) {S8();S7();}
if (a==88) {S8();S8();}
if (a==89) {S8();S9();}
if (a==90) {S9();S0();}
if (a==91) {S9();S1();}
if (a==92) {S9();S2();}
if (a==93) {S9();S3();}
if (a==94) {S9();S4();}
if (a==95) {S9();S5();}
if (a==96) {S9();S6();}
if (a==97) {S9();S7();}
if (a==98) {S9();S8();}
if (a==99) {S9();S9();}
if (a==100) {S1();S0();S0(); }
}
}
Демонстрація роботи тут:
З ардуїно розібралися, тепер переходимо до Android. Додаток найпростіше робити використовуючи середовище візуальної розробки android-додатків App Inventor 2, хоча тут кому як зручніше. Додаток повинен володіти простим функціоналом: підключатися до сполученого bluetooth додатка і відправляти на нього номер каналу, на який потрібно перемкнути. Дизайн мого додатку вийшов дуже простий.
Якщо хтось захоче зробити такий же додаток, я зняв відео, в якому детально пояснюю як і що потрібно для цього робити. Розібратися зможе навіть той, хто ніколи не програмував під андроїд. (для перегляду потрібно перейти на ютуб)
https://www.youtube.com/watch?v=6PWuBdMC748
Тепер пара слів про переваги і недоліки мого bluetooth пульта ДУ. Корисність даного девайса для суспільства викликає серйозні сумніви, втім як і корисність інших смарт/розумних/bluetooth девайсів, таких, наприклад, як «розумна» рулетка, Bluetooth-стікер і «розумний» магніт на холодильник. Але особисто мені bluetooth пульт трохи полегшує життя. Якщо раніше я взагалі не дивився телевізор, то зараз вмикаю іноді, причому тільки зі смартфона або планшета, дивлячись що лежить під рукою.
Взагалі з подібною схемою можна керувати не тільки телевізором, а всіма приладами, які управляються, але це вже трохи інша історія.
P.S. Збірник з понад 100 навчальних матеріалів по ардуїно для початківців і профі тут
P.P.S. Онлайн курс по ардуїно на гіктаймс тут.
І закінчити хочу опитуванням, яке обіцяв на початку статті.
Тільки зареєстровані користувачі можуть брати участь в опитуванні. Увійдіть, будь ласка.
Як Ви вважаєте, як краще назвати цей девайс?
58.72% bluetooth пульт 64
20.18% смарт пульт 22
7.34% розумний пульт 8
7.34% «розумний» пульт 8
6.42% свій варіант у коментарях 7
Проголосували 109 користувачів. Утрималися 52 користувачі.














