آموزش, اینترنت اشیاء, پروژه, پروژه آردوینو, توصیه شده, مقاله های سیسوگ

آموزش اتصال ربات تلگرام به آردوینو – قسمت دوم

آموزش اتصال ربات تلگرام به آردوینو

در قسمت اولِ آموزش، چگونگی ساخت ربات تلگرام را توضیح دادیم و به نحوه‌ی کارکرد و چگونگی برقراری ارتباط با آن پرداختیم. در این قسمت از آموزش سعی می‌کنیم که با استفاده از برد آردوینو، به ربات ساخته‌شده، جان ببخشیم. فرقی نمی‌کند از کدام مدل برد آردوینو استفاده کنیم. مهم این است که بستر اینترنت فعال باشد و ما قادر باشیم داده‌ها را از بستر اینترنت منتقل کنیم. راه‌های زیادی برای اتصال به اینترنت وجود دارد؛ مثل استفاده از بستر GPRS یا ADSL و راه‌های بسیارِ دیگر. ما سعی می‌کنیم ساده‌ترین راه ممکن را انتخاب کنیم تا از پیچیدگی‌های بی‌مورد کم کنیم. فکر می‌کنم ساده‌ترین و کم‌هزینه‌ترین راه ارتباطی، استفاده از بستر WIFI و ماژول ESP8266 باشد. این ماژول از یک پردازنده 80 یا 160 مگاهرتزی استفاده می‌کند که ما را قادر به برنامه‌نویسی مستقیم بر روی آن می‌کند.

برای اتصال و جان بخشیدن به ربات تلگرام با سیسوگ همراه باشد.

از چه آردوینویی استفاده خواهیم کرد؟

همان‌طور که قبلاً گفتیم فرقی نمی‌کند و شما به‌راحتی و با درک نحوه‌ی ارتباط، با هر برد دلخواهی، قادر به انجام این کار خواهید بود. تنها کافی است که بستر اینترنت را فراهم کنید. برای کاهش پیچیدگیِ کار ما از ماژول وای فای ESP8266 استفاده خواهیم کرد. ماژول ESP8266 یک ماژول Wifi ارزان‌قیمت است که امکان اتصال wifi را فراهم می‌کند. از این ماژول به دو صورت می‌توان در پروژه استفاده کرد:

در حالت اول ماژول را به برد آردوینو وصل می‌کنیم و با استفاده از دستورات AT و پورت سریال با آن ارتباط برقرار می کنیم. در این روش وجود یک برد پردازنده‌ی مستقل الزامی است.

شاید برای شما مفید باشد: پروژه های آردوینو

در حالت دوم، برنامه را بر روی حافظه ESP8266 بارگذاری می‌کنیم و برنامه توسط پردازنده ESP8266 اجرا می‌شود و نیازی به برد دیگری نیست. قطعاً این روش کم‌هزینه‌تر و سریع‌تر است. لازم نیست که حتماً از برد‌های آردوینو موجود استفاده کنید. می‌توانید ماژول را تهیه کرده و با چند رشته سیم به یک مبدل سریال وصل نمایید. خوب کار تمام است و فقط کافی است برنامه را بنویسید.

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

 

از چه ویرایشگری استفاده می‌کنیم؟

Sisoog Arduino IDE

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

برای جبران نقایص موجود در این ویرایشگر، تیم سیسوگ قبلاً یک ویرایشگر حرفه‌ای ایجاد و معرفی کرد که توصیه می‌کنیم حتماً از این ویرایشگر استفاده کنید. این ویرایشگر دارای قابلیت‌های زیادی از جمله کدکامپلیشن است که روند برنامه‌نویسی را بسیار تسریع می‌کند.

در این آموزش هم از ویرایشگر سیسوگ استفاده خواهیم کرد. نگران نباشید، اگر تمایلی به استفاده از این ویرایشگر ندارید همچنان سورس‌های نوشته‌شده را می‌توانید با ویرایشگر کلاسیک آردوینو کامپایل و از آن‌ها استفاده کنید.

ربات ما قرار است چه‌کار کند؟

در قسمت قبلی از آموزش‌ها نحوه‌ی ساخت ربات تلگرام را با استفاده از ربات پدرخوانده (botfather) آموزش دادیم و مقدمات ابتدایی در خصوص نحوه‌ی ارتباط با سرور تلگرام را توضیح دادیم. همان‌طور که در ابتدا گفته شد، در این مقاله قصد داریم که به ربات تلگرام جان‌بخشی کنیم؛ به صورتی که ربات ما قادر به تعامل با کاربران باشد و بتواند پیام های ارسال شده توسط کاربر را دریافت کند و بعد از پردازش، پاسخ صحیحی به آن‌ها بدهد.

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

توضیح متد‌های مورد‌استفاده

در نخستین گام ربات باید قادر باشد پیام کاربران را از سرور تلگرام دریافت کند. برای خواندن پیامِ کاربران، باید از متد getUpdates برای دریافت آخرین پیام‌ها استفاده کنیم.

همان‌طور که در سایت تلگرام توضیح داده و در عکس زیر مشخص است این تابع دارای تعدادی پارامتر ورودی است که خوشبختانه همه آنها اختیاری هستند و در صورت وارد نکردن آنها خطایی دریافت نمی‌کنید و تابع اجرا خواهد شد.

خروجی تابع هم یک شیء از نوع Update است.

 

تنها ورودی که در این مرحله به آن احتیاج داریم ورودی offset است. برای روشن شدن موضوع بگذارید مسئله‌ای مطرح کنیم: سرور تلگرام از کجا متوجه می‌شود که شما پیام کاربرها را پردازش کرده‌اید؟ درخواست آپدیت به‌تنهایی نمی‌تواند ملاک خوبی برای دریافت پیام‌ها باشد چرا که شاید در هنگام دریافت پیام، اینترنت قطع شد و پیام‌ها به‌دست شما نرسید؛ آن‌وقت تعدادی از پیام‌ها را از دست خواهید داد.

برای حل این مشکل راه‌حل جالبی وجود دارد که در واقع استفاده از offset است. هر پیامِ آپدیتی که از سمت سرور برای شما ارسال می‌شود دارای یک مشخصه ID است که در واقع یک عدد است. اگر شما عدد مذکور را در متغیر offset با فراخوانی این تایع ارسال کنید، تلگرام متوجه خواهد شد شما پیام مذکور را دریافت و پردازش کرده‌اید و پیام مورد‌نظر را از لیست ارسال مجدد به شما حذف خواهد کرد.

برای فراخوانی تابع Getupdates و ارسال پارامتر offset می‌توان از URL زیر استفاده کرد:

ما به‌عنوان‌مثال مقدار 2326742 را در متغیر offset قرار دادیم. در مثال فوق به‌جای عبارت <Your Bot Key> باید کلیدی که هنگام ساخت ربات از تلگرام دریافت کردید را قرار دهید.

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

همان‌طور که در عکس زیر می‌بینید، تلگرام پیام مربوطه را برای ما ارسال کرده است:

 

آپدیت ارسال‌شده حاوی مشخصات فرستنده و متن پیام است.

برای ارسال پیام باید از تابع SendMessage استفاده کنیم.

این تابع نیاز دارای چندین پارامتر ورودی است، ولی به‌جز دو پارامتر chat_id و text، مابقی پارامتر‌ها اختیاری هستند و می‌توان از آن‌ها چشم‌پوشی کرد.

پارامتر chat_id در واقع یک عدد منحصر‌به‌فرد برای هر فردی است که دارد با ربات چت می‌کند. تلگرام از این طریق متوجه می‌شود که پیام مورد‌نظر به چه شخصی ارسال شود. در عکس زیر مقدار آن مشخص شده است:

پارامتر دوم text در واقع متنی است که باید ارسال شود.

فرض کنید می‌خواهیم پیام salam sisoog را برای کاربر SIsoogOS ارسال کنیم. با توجه به عکس فوق، id کاربر عدد 334577197 است. تابع SendMessage به شکل زیر باید فراخوانی شود:

دقت داشته باشید در صورتی پیام به کاربر ارسال می‌شود که کاربر قبلاً ربات را Start کرده باشد؛ یعنی یک بار دستور /Start را برای ربات ارسال کرده باشد.

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

برنامه‌ی آردوینو

قبل از هر چیزی لازم است که تغییراتی در برنامه لحاظ کنید تا برنامه قادر باشد به WIFI و تلگرام متصل شود. پس مقادیر زیر را در برنامه اصلاح کنید:

SSID یا اسم شبکه‌ی WIFI را باید در گزینه‌ی اول وارد کنید. گزینه‌ی دوم رمز عبور وای فای است و گزینه‌ی سوم هم کلید ربات تلگرام است که باید درون کتیشن‌ها (علامت نقل‌قول) بدون فاصله وارد کنید.

 

در‌صورتی‌که مشکلی وجود نداشته باشد، لاگی مطابق لاگ زیر دریافت خواهید کرد. در لاگ زیر وضعیت کانکت شدن به شبکه WIFI و مشخصات ربات را در شروع برنامه نمایش می‌دهد:

برنامه چطور کار می‌کند؟

تا جای ممکن سعی کردیم که برنامه را در ساده‌ترین حالت ممکن پیاده‌سازی کنیم. برای همین یک کلاس (کتابخانه) به اسم Zeus_TgBot ایجاد کردیم که تمام اتفاقات مربوط به ربات و ارتباط با سرور تلگرام درون آن انجام می شود و از چشم کاربر دور بماند. البته شما می‌توانید سورس این کتابخانه را مرور کنید و اطلاعاتی را راجع‌ به آن به‌دست بیاورید.

کلاس مذکور به شکل زیر تعریف شده است:

در واقع این کلاس در حال حاضر 4 متد برای کار با تلگرام دارد.

در ابتدا باید یک شیء از این کلاس ایجاد کنید. برای ایجاد یک شیء نیاز است که شما کلید ارتباطی با ربات را وارد کنید.

مطابق خط 13 برنامه اصلی:

تابع بعدی تابع Set_Message_Event است که در واقع این تابع آدرس یک متد را دریافت می‌کند و هر وقت پیام جدیدی از کاربر دریافت شد آن متد را فراخوانی می‌کند. متد باید به شکل خاصی تعریف شود تا کلاس بتواند آن را فراخوانی کند.

این تایع در خط 58 از برنامه‌ی اصلی مورد‌استفاده قرار گرفته است:

تابع بعدی GetUpdates است که در واقع باید در بازه‌های خاص زمانی فراخوانی شود. با هر بار فراخوانی این تابع، بررسی می‌شود که آیا پیام جدیدی برای پردازش وجود دارد یا نه.

این تابع در خط 89 از برنامه‌ی اصلی مورد‌استفاده قرار گرفته است:

و آخرین تابع هم sendMessage است که در ورودی، ID کاربری را دریافت می‌کند و در ادامه متن پیامی که قرار است ارسال شود و پیام را برای کاربر مورد‌نظر ارسال می‌کند.

تمام اتفاقات درون تابع Tg_Message_Prossess می‌افتد که در برنامه‌ی اصلی پیاده‌سازی کردیم. این تایع را به کلاس Zeus_TgBot معرفی کردیم تا با دریافت هر باره پیام، فراخوانی شود. با فراخوانی این تابع سه پارامتر به آن انتقال داده می شود. پارامتر اول شماره‌ی پیام است. هر پیام دارای یک مشخصه منحصر‌به‌فرد است که بعد‌ها با آن کار خواهیم کرد. پارامتر بعدی مشخصه‌ی فردی است که پیام را ارسال کرده است. در آخر متن پیام وجود دارد.

پیامی که دریافت کرده‌ایم را مجدداً به فرستنده ارسال می‌کنیم و این اولین قدم است برای جان بخشیدن به ربات.

تا این مرحله، علاوه بر برقراری ارتباط با سرور تلگرام، قادر بودیم که پیام‌های ارسال‌شده را دریافت کنیم و آن‌ها را مجدداً به فرستنده ارسال کنیم. می‌توانیم برای کامل‌تر شدن، پیام‌ها را تغییر بدهیم و بعد ارسال کنیم. این کاری است که قرار است در مقاله‌ی بعدی این آموزش به آن بپردازیم.

در مقاله‌ی بعدی نحوه اتصال دستگاه به ربات تلگرام، بدون نیاز به فیلترشکن را آموزش خواهیم داد.

دانلود سورس آردوینو:

برای دانلود سورس کد به  گیت هاب مراجعه کنید.

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

26 دیدگاه در “آموزش اتصال ربات تلگرام به آردوینو – قسمت دوم

  1. Avatar for امید امید گفت:

    سلام،وقتتون بخیر

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

    1. Avatar for Sisoog Os Sisoog Os گفت:

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

  2. Avatar for پیام کمالی پیام کمالی گفت:

    من مخیوام esp8266رو به تلگرام وصلکنم و چندتا رله رو کنترل کنم همه این روشا رو از خیلی از سایتهای دیگه رو هم امتحان کردم نمیشه میشه یکی کمک کنه

    1. Avatar for zeus zeus گفت:

      فکر کنم یه قسمت اموزش در خصوص اتصال در حالت فیلترینگ منتشر کردم
      اینترنت اشیاء و اتصال به ربات تلگرام بدون محدودیت و فیلتر

  3. Avatar for پیام کمالی پیام کمالی گفت:

    سلام خسته نباشید کسی میدونه چرا تو این خط از برنامه ارور میده
    Bot.Set_Message_Event(&Tg_Message_Prossess);

    1. Avatar for zeus zeus گفت:

      خوب احتمالا باید متن خطا رو بذارید که بشه گفت چرا خطا دریافت میکنید.

  4. Avatar for امیرحسین امیرحسین گفت:

    با سلام و تشکر بابت مطالب بسیار مفیدتان
    ببخشید حتمن باید برنامه بر روی خوده ماژول پروگرام بشه یا اینکه بوسیله AT COMMAND هم میشه با تلگرام ارتباط برقرار کرد؟

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      قطعا با استفاده از at کامند هم میشه چنین کرد ولی احتمالا لازمه پروتکل های استفاده شده رو پیاده سازی کنید که احتمالا به مقدار حافظه زیادی نیاز دارید اگر چنین محدودیتی با حافظه وجود ندارد به سادگی میتوانید از at کامند هم استفاده کنید.

  5. Avatar for S S گفت:

    سلام لطفا نحوه اتصال به سرور با پروکسی رو هم بگین چون این کد عملا تو ایران بدرد نمیخوره دلیلشم فیلتر دایمی تلگرامه…

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      سلام خوب این مقاله برای قبل از فیلترینگ تلگرامه و البته باید بگم به زودی روش اتصال به ربات رو میگیم که تو شرایط حال حاظر هم کار کنه 🙂

  6. Avatar for حسین محمدی حسین محمدی گفت:

    با سلام
    تشکر فراوان از زحمات بی دریغ شما
    من این پروژه رو پیاده کردم و روی روترم هم چی چی ان رو زدم و تلگرام رو بدون فیلتر باز میکنه
    ولی متاسفانه چون dns ها رو هم دوستان گل فیلتر کردن بنابراین host کار نمیکنه

    حالا با توجه به اینکه برنامه “پیام رسان بله” دقیقا شبیه به تلگرامه یه تغییرات کوچولو به برنامه دادم ولی بازم کار نمیکنه
    امکانش هست یه خرده راهنمایی کنید با هم درستش کنیم و publish اش کنیم؟

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      امم پشنهاد بدی نیست – ولی فکر نمیکنم بله دقیقا مثل تلگرام بوده باشه احتمالا نیاز به تغییر داره
      قبلا بهش فکر بودم ولی فرصت نشده پیاده سازیش کنم
      البته یه راه خیلی ساده تر داره که بشه تحریم ها رو دور زد (تحریم خودی رو میگم ) اگر فرصت شد آموزشش رو میذارم

      1. Avatar for هادی هادی گفت:

        سلام و درود خدمت زئوس عزیز،آموزشی که فرمودین رو آماده نمیکنین؟

        1. Avatar for زئوس Zeus زئوس Zeus گفت:

          آماه شده و تست هاش هم انجام شده و فقط باید مطلبش رو کامل کنم که احتمالا توی هفته آینده اتفاق می افته

  7. Avatar for یزدان یزدان گفت:

    با سلام و خسته نباشید.یه چند ماهیه تلگرامو فیلتر کردن.ایا مشکلی در ارتباط اردینو به سرور تلگرام پیش میاد؟{تو اردینو نمیشه کارای vpnرو برای فیلتر اجرا کرد}ممنون میشم جواب بدید.

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز ؛ بله قطعا ارتباط آردوینو با سرور تلگرام دچار مشکل خواهد شد ؛ پیاده سازی پروکسی داخل حافظه محدود Arduino کاری نیست که بشه انجامش داد یا احتمالا خیلی پیچیده خواهد بود ؛ احتمالا راحت تر باشه که پروکسی رو خارج از آردوینو رو روی روتر انجام بدید .

      1. Avatar for محمدرضا محمدرضا گفت:

        سلام‌خسته نباشید ممنون بابت این اطلاعات مفیدی که در اختیار عموم قرار میدید،میتونم ازتون خواهش کنم یه راهی قرار‌بدید که بتونیم این فیلترنیگ‌دور‌بزنیم و آردوینو بتونه با سرور تلگرام‌ارتباط برقرار کنه؟ خیلی ممنون

        1. Avatar for زئوس Zeus زئوس Zeus گفت:

          سلام و درود به شما
          هوم خوب یکی از کارایی که میشه کرد اینه که از http پراکسی استفاده کنید که البته مقداری نوشتنش سخته و تا اونجایی که خودم سرچ کردم کتابخانه آماده ای براش پیدا نکردم.

  8. Avatar for محمد محمد گفت:

    سلام
    خسته نباشید
    من الان چطوری میتونم که برد پای فای رو به برد اردینو uno متصلش کنم.ینی هر پین رو ب کدام پین اردینو بزنم.لطفا اینو یه مقداری ذقیق تپضیح بدید چون من بدجوری گیج شدم.
    و واقعا ممنون از مقاله ی عالیتون منو تو پروژم خیلی کمک ککردش

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      سلام
      خواهش میکنم دوست عزیز ، هدف ما هم دقیقا همین هست ، این که بتونیم کمکی کرده باشیم
      فکر میکنم منظور شما برد wifi هستش ، خوب این که چطور می تونید به برد uno وصلش کنید برمیگرده به این که نوع ماژول Wifi مورد نظرتون چی هست
      اگر از همین esp8266 میخواید استفاده کنید احتمالا با پورت سریال باید وصل کنید ماژول رو
      البته نا گفته نماند که به راحتی می توانید برنامه آردوینو را روی خود ماژول esp8266 پروگرام کنید و نیاز به برد uno هم نیست

  9. Avatar for رضا رضا گفت:

    سلام ممنون بابت اموزش کاربردیتون
    من ماژول NodeMcu تهیه کردم اگه میشه بگید اتصالات با این ماژول چطوریه؟
    سپاس فراوان از زحماتتون

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز
      در ابتدای پست ، توضیح داده شده که به چه صورت می تونید esp8266 رو پروگرام کنید.

  10. Avatar for مهراد مهراد گفت:

    سلام
    من مقاله هارو مطالعه کردم . مقاله سومش نیست. چطوری باید ربات تلگرام رو راه اندازی کنم . گفته بودید مقاله سومی هم هست ولی من پیداش نکردم . میشه راهنماییم کنید

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      سلام و درود
      برای مشاهده مقاله سوم به این مطلب مراجعه کنید.
      آموزش اتصال ربات تلگرام به آردوینو

  11. Avatar for Godali645 Godali645 گفت:

    Mohammad Mahdi:
    سلام .
    خوب هستید.
    وقت بخیر.
    جناب من این ماژول تهیه کردم.و پایه vccوgndوrxوtxو gpoi0را به زمین وصل کردم.

    اما هنگام پروگرم کردن کد اردینو در کامپلیر مشکل میگیرد.
    راستی این نقاط به ماژول مبدل سریال به ttl وصل کردم .
    اما کار نمی کند.و هنگام اپلود کردن هم یراد میگرید و پورتشم درست وصل کردم.

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      سلام دوست من
      خوب ظاهر کارای که کردید درسته و نباید برای پروگرام کردن ماژول مشکلی وجود داشته باشه
      چند تا نکنه رو میگم بررسی کنید ، اول این که ولتاژ کاری ماژول شما احتمالا 3.3 ولت است ، ولی تا وقتی که مدل ماژولی رو که تهیه کردید رو نگید نمیشه مطمئن بود
      نگته دوم اینه که پایه RX ماژول به TX مبدل وصل میشه
      و پایه TX ماژول به پایه RX مبدل وصل میشه ، مبدل شما هم باید از توع TTL باشد. ؛ همون چیزی که توی عکس همین پست مشاهده می کند.
      پایه CP/PD رو هم باید با یه مقاومت مثلا 2.2 کیلو به مثبت وصل کنید
      و پایه GPIO0 رو هم با مقاومت (مقاومت حتما باشد) به زمین وصل کنید !
      با این ترتیب وصل کردن ماژول هنگام روشن شدن توی حالت بوت قرار میگره و شما میتونی اونو پروگرام کنید ، دقت کنید حتما بعد از این روش وصل باید ماژول ریست بشه تا بره تو حالت بوت قرار بگیره و برای خارج شدنش از این حالت هم باید ریست بشه.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *