این ریموت کنترل جایگزین همه ریموت کنترل های لوازم خانگی همچون کولر، تلویزیون، دستگاه پخش دی وی دی، سیستم موسیقی و لوازم هوشمند است. آن هر دستگاهی را که با ریموت کنترل مادون قرمز کار کند را کنترل میکند. گوشی هوشمند به عنوان واسط اصلی برای ارسال فرامین IR استفاده می شود و برد ویموس به عنوان ریموت کنترل این فرامین را اجر می کند.
نیازمندی های این پروژه
سخت افزار
- ماژول فرستنده مادون قرمز
- ماژول گیرنده مادون قرمز
- برد توسعه Wemos D1 Mini
نرم افزار
- 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 شبکه را وارد می کنید. قبل از آپلود کد روی Wemos D1 Mini مطمئن شوید که مقادیر با 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 تغییر دهید بنابراین از این پس هر بار که آن را فشار دهید کدی که در مرحله قبل رمز گشایی شده بود را ارسال میکند.
حالا برگردید و تنظیمات اعمال شده را تائید کنید.
اگر دو مرحله بالا را برای دکمه پاور انجام دادید بنابراین دکمه پاور تلویزیون آماده است آن را تست کنید با هر بار فشار دادن, تلویزیون خاموش و روشن می شود.
نحوه تست پروژه با اپ گوشی با تلویزیون سامسونگ را میتوانید در ویدیوی زیر ببینید.
موفق باشید.