این ریموت کنترل جایگزین همه ریموت کنترل های لوازم خانگی همچون کولر، تلویزیون، دستگاه پخش دی وی دی، سیستم موسیقی و لوازم هوشمند است. آن هر دستگاهی را که با ریموت کنترل مادون قرمز کار کند را کنترل میکند. گوشی هوشمند به عنوان واسط اصلی برای ارسال فرامین IR استفاده می شود و برد ویموس به عنوان ریموت کنترل این فرامین را اجر می کند.
نیازمندی های این پروژه
سخت افزار
نرم افزار
Visual Studio Codeدانلود
افزونهPlatformioنحوه نصب افزونه درVScode
نکته: اگر موفق به تهیه شیلد کنترلر IR لولین شدید آن را جایگزین دو ماژول اول کنید این شیلد روی ماژول ویموس قرار می گیرد
ریموت کنترل همه کاره با ماژول وای فای ESP8266
برای ساخت این ریموت کنترل،هرآنچه که شما نیاز دارید یک بورد توسعهWemos D1 Mini (ماژول وای فای ESP-12)، ماژول فرستنده (برای ارسال کدهای IR) و گیرنده (جهت رمزگشایی از ریموت هایی که قرار است کنار گذاشته شوند) و تلفن اندرویدی است.

برای این پروژه به این شکل متصل می کنیم :
- GPIO0 یا D3 به DAT ماژول فرستنده وصل می شود
- GPIO2 یا D4 به DAT ماژول گیرنده وصل می شود
- GND(ازرویبرد توسعهWemos D1 Mini) بهGNDهر دو ماژول وصل می شود
- 3.3ولت (از رویبرد توسعهWemos D1 Mini) بهVccهر دو ماژول وصل می شود
کد در Wemos D1 Mini
قبل از هر چیز به این نکته اشاره کنیم که کدها را در محیط ویرایشگرVS Codeکه افزونهPlatform IOرا روی آن نصب شده باشد وارد می کنیم.
یکپروژه جدید در Platform IOایجاد کنید (البته یادتون باشه که بورد رابایدwemos d1 mini liteانتخاب کنید)
بعد از آن نیاز به لایبرری IRremoteESP8266داریم. این لایبرری شما را قادر می سازد با استفاده از LED های IR و ماژول های گیرنده IR, سیگنال های مادون قرمز را در ESP8266 یا ESP32 با استفاده از فریمورک Arduino ارسال و دریافت کنید.
برای نصب آن در Platform IO در قسمت Quick Access روی Libraries کلیک کرده در پنجره اصلی در کادر جستجو کلمه IRremoteESP8266 را وارد کنید اولین ردیف در نتایج جستجو را دانلود و نصب کنید.

حالا به پروژه برگردید و فولدرsrcرا باز کنید و فایلmain.cppرا دانلود کنید و درفولدرsrcکپی کنید.
قبل از توضیحات مربوط به کدها, فلوچارت رنامه را مرور کنیم, که ما را از عملکرد اصلی برنامه آگاه می کند.
توضیحات کد
const char *ssid = "ssid";
const char *password = "12345678";
اینجاSSIDوPasswordشبکه را وارد می کنید. قبل از آپلودکد رویWemosD1Miniمطمئن شوید که مقادیر باSSIDوPasswordشبکهWiFi(هات اسپات گوشی) یکی باشد.
// Wait for connection
Serial.printf("Connecting to %s ", ssid);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
منتظر می ماند تاباSSIDوPasswordاز پیش تعریف شده به شبکهWiFi(هات اسپات گوشی) وصل شود
void sendIR()
{
if(_decode_type[_device] == UNKNOWN)
{
Serial.print("Send UNKNOWN: ");
irsend.sendRaw(raw_array, size, 38000);
}
else if (_decode_type[_device] == NEC)
{
Serial.print("Send NEC: ");
irsend.sendNEC(DeviceIRValue[_device][_key], size);
}
else if (_decode_type[_device] == SONY)
{
Serial.print("Send SONY: ");
irsend.sendSony(DeviceIRValue[_device][_key], size);
}
else if (_decode_type[_device] == RC5)
{
Serial.print("Send RC5: ");
irsend.sendRC5(DeviceIRValue[_device][_key], size);
}
else if ( _decode_type[_device] == LG)
{
Serial.print("Send LG: ");
irsend.sendLG(DeviceIRValue[_device][_key], size);
}
/*
.
.
.
*/
}
تابع ارسال کد, در این تابع نوع رمزگشایی (decode_type) بررسی می شود تا متد مربوط به آن اجرا شود.توجه داشته باشید که هر چه تعداد اینdecode_type ها بیشتر باشد ریموت های بیشتری را پشتیبانی خواهد کرد.
void handleIr()
{
for (uint8_t i = 0; i < server.args(); i++)
{
if (server.argName(i) == "device")
{
Serial.println("");
_device = strtoul(server.arg(i).c_str(), NULL, 10);
Serial.print("device: ");
Serial.print(_device);
}
if (server.argName(i) == "key")
{
_key = strtoul(server.arg(i).c_str(), NULL, 10);
Serial.print(" key: ");
Serial.print(_key);
}
if (server.argName(i) == "mode")
{
_mode = strtoul(server.arg(i).c_str(), NULL, 10);
//Serial.print(" mode: ");
//Serial.print(_mode);
if(_mode == 1)
Serial.println(" [receive mode]");
else
Serial.println(" [Transmit mode]");
}
}
handleRoot();
}
تابع هندلر ir, این تابع زمانی که یک درخواست HTTP باشد (اینجا از طریق اپ گوشی خواهد بود که در ادامه گفته شده) اجرا می شود و در آن محتوای device, key, mode در متغیرهای_device, _key, _modeذخیره می شود.
نکته: من متغیرها را در حافظه ذخیره نکرده ام بنابراین شما می توانید برای بهبود عملکرد برنامه مقادیر دکمه ها رو در حافظه ذخیره کنید تا پس از قطع برق همچنان آن ها را داشته باشید.
void loop(void)
{
server.handleClient();
//Learning
if (_mode == LEARN)
{
if (irrecv.decode(&results))
{
raw_array = resultToRawArray(&results);
size = results.bits;
dump(&results);
DeviceIRValue[_device][_key] = results.value; //save device value
_decode_type[_key] = results.decode_type;
_mode = NORMAL;
irrecv.resume(); //Receive the next value
}
}
else if (_mode == SEND)
{
sendIR();
_mode = NORMAL;
}
}
با توجه به داده های دریافتی, فرمانرمزگشایییاارسالکدبررسی می شود و آن را اجرا می کند.
HTTP REQUEST SHORTCUTرا از Google PlayStore دانلود و نصب کنید
HTTP REQUEST SHORTCUT یک برنامه ساده اندرویدی است که به شما امکان می دهد میانبرها و ویجت هایی را ایجاد کنید که می توانید در صفحه اصلی خود قرار دهید. هر میانبر، در صورت کلیک، درخواست HTTP را ایجاد می کند. در این پروژه ما کد کلید را با درخواست HTTP ایجاد خواهیم کرد و برد ویموس از طریق شبکه وای فای آن را دریافت می کند و سیگنال IR متناسب با آن را ارسال میکند.

آدرس IP را در تصویر بالا می بینید ممکن است آدرس آی پی شما متفاوت باشد آن را در اپ گوشی نیاز داریم.آدرسIPرا می توانیدبعد از آپلود برنامه,هنگامی که به شبکه وای فای متصل شد در ترمینالPlatform IOببینید.
حالا برنامه اندرویدی را باز کنید و یک Shortcut را اضافه کنید. می توانید یک آیکون از بین آیکون های برنامه برای آن انتخاب کنید و همچنین یک نام برای آن انتخاب کنید مثلا TV POWER.



در قسمت Basic Request setting متد GET و در قسمت URL, آدرسhttp://192.168.43.162/ir?device=1&key=1&mode=1را وارد کنید. زمانی که دکمه را فشار دهید این درخواست ایجاد می شود. (دقت کنید که آدرس IP لوکال ,برای شما ممکن است متفاوت باشد)
- device(دستگاه مربوطه تلویزیون کولر و ... که هر کدام عدد مربوط به خود را دارند اینجا تلویزیون 1 است)
- key(شماره دکمه ریموت مثلا اینجا دکه پاور تلویزیون 1 است)
- mode(اگر 1 باشد مد گیرنده خواهد بود و ریموتی که قرار است کنار گذاشته شود را رمز گشایی میکند و اگر 2 بود مد فرستنده خواهد بود و همان دکمه ریموتی که رمز گشایی کرده بود را ارسال میکند)
نکته: با توجه به توضیح بالا برای هر دکمه دو مرحله وجود دارد :
- رمز گشایی: در این مرحله در قسمت آدرس URL شماره mode برابر با 1 باشد این باعث می شود تا برد فرمان رمزگشایی را اجرا کند حالا باید آن دکمه ریموت را فشار دهید تا برد آن را رمزگشایی و ذخیره کند.
- ارسال کد: در این مرحله قسمت آدرس URL شماره mode را به 2 تغییر دهید بنابراین از این پس هر بار که آن را فشار دهید کدی که در مرحله قبل رمز گشایی شده بود را ارسال میکند.
حالا برگردید و تنظیمات اعمال شده را تائید کنید.

اگر دو مرحله بالا را برای دکمه پاور انجام دادید بنابراین دکمه پاور تلویزیون آماده است آن را تست کنید با هر بار فشار دادن, تلویزیون خاموش و روشن می شود.
نحوه تست پروژه با اپ گوشی با تلویزیون سامسونگ را میتوانید در ویدیوی زیر ببینید.
موفق باشید.



