این ریموت کنترل جایگزین همه ریموت کنترل های لوازم خانگی همچون کولر، تلویزیون، دستگاه پخش دی وی دی، سیستم موسیقی و لوازم هوشمند است. آن هر دستگاهی را که با ریموت کنترل مادون قرمز کار کند را کنترل میکند. گوشی هوشمند به عنوان واسط اصلی برای ارسال فرامین IR استفاده می شود و برد ویموس به عنوان ریموت کنترل این فرامین را اجر می کند.

 

نیازمندی های این پروژه

سخت افزار

  •   ماژول فرستنده مادون قرمز
  •   ماژول گیرنده مادون قرمز
  •   برد توسعه Wemos D1 Mini

نرم افزار

 

نکته: اگر موفق به تهیه شیلد کنترلر 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 تغییر دهید بنابراین از این پس هر بار که آن را فشار دهید کدی که در مرحله قبل رمز گشایی شده بود را ارسال میکند.

 

حالا برگردید و تنظیمات اعمال شده را تائید کنید.

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

نحوه تست پروژه با اپ گوشی با تلویزیون سامسونگ را میتوانید در ویدیوی زیر ببینید.

موفق باشید.

  نظرات

جهت ثبت نظر وارد سایت شوید

راهنمای استفاده از کد در کامنت
````
insert your code
``
علی صدیقی
سه شنبه 22 مهر 1399 ,07:09 ب.ظ

سلام وقت بخیر

سخت افزار مشکلی نداره تست کردمشون

سورس برنامه مشکل نداره؟ تست کردید خودتون؟

کلید کنترل میزنم چراغ گیرنده و چراغ esp روشن میشه ولی توی سریال مانیتورینگ اتفاقی نمیوفته حتی موقه ارسال وقتی کلید توی گوشی میزنم ال ای دی فرسنده روشن نمیشه اصلا

مهدی ادهم
پنجشنبه 24 مهر 1399 ,03:17 ب.ظ

سلام، پروژه آپدیت شده و هم اکنون ریموت های ناشناس هم به صورت داده های خام، لرن و ذخیره می کند. پروژه تست شده و روی ریموت تلویزیون سامسونگ و رسیور آزمایش شده ویدیوی تست آن در همین پست و هم در کانال یوتیوب تکفورال قابل مشاهده است

جهت ثبت پاسخ وارد سایت شوید
علی صدیقی
جمعه 18 مهر 1399 ,02:05 ب.ظ

سلام پروژه کار نمیکنه

مود1 میزنم ک کد ذخیره کنه قسمت سریال مانیتورینگ

Working receive mode...

مینویسه یسره ولی وقتی ریموت تلویزیون میزنم اتفاقی نمیوفته بعد زدم رو مد 2

device: 1

key: 1

mode: 2

Send Key 1 Of Device 1

device: 1

key: 1

mode: 2

Send Key 1 Of Device 1

مینویسه لی اتفاقی نیوفته ممنون میشم راهنمایی کنید به این پروژه نیاز دارم

تکفورال (ادمین)
شنبه 19 مهر 1399 ,10:10 ق.ظ

سلام، وقتی Working receive رو دارین بنابراین اتصال شما با ماژول با موفقیت انجام شده و دستور ارسالی شما از سوی اپ به درستی شناخته می شود اگر به کد دقت کنید ما یک شی از کلاس IRrecv به نام irrecv ایجاد کردیم روی پین RECV_PIN که ما رو قادر میکند تا به متد decode دسترسی داشته باشیم که اگر سیگنال مادون قرمز را دریافت کند مقدار 1 بر می گرداند ما آن را در loop برنامه بعد شرط if (_mode == LEARN) قرار دادیم تا در حالت مد لرن سیگنال را دریافت و دیکود کند.حال شما با ارسال کد از سمت اپ وارد این مد می شوید اما متد مقدار 1 را بر نمی گرداند. بررسی کنید و مطمئن شوید که قسمت ماژول گیرنده مادون قرمز سیگنال را به درستی دریافت و پین ماژول آن را دریافت می کند

جهت ثبت پاسخ وارد سایت شوید