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

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

در قسمت اولِ آموزش، چگونگی ساخت ربات تلگرام را توضیح دادیم و به نحوه‌ی کارکرد و چگونگی برقراری ارتباط با آن پرداختیم. در این قسمت از آموزش سعی می‌کنیم که با استفاده از برد آردوینو، به ربات ساخته‌شده، جان ببخشیم. فرقی نمی‌کند از کدام مدل برد آردوینو استفاده کنیم. مهم این است که بستر اینترنت فعال باشد و ما قادر باشیم داده‌ها را از بستر اینترنت منتقل کنیم. راه‌های زیادی برای اتصال به اینترنت وجود دارد؛ مثل استفاده از بستر 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 معرفی کردیم تا با دریافت هر باره پیام، فراخوانی شود. با فراخوانی این تابع سه پارامتر به آن انتقال داده می شود. پارامتر اول شماره‌ی پیام است. هر پیام دارای یک مشخصه منحصر‌به‌فرد است که بعد‌ها با آن کار خواهیم کرد. پارامتر بعدی مشخصه‌ی فردی است که پیام را ارسال کرده است. در آخر متن پیام وجود دارد.

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

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

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

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

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

نوشته های مشابه

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

  1. یزدان گفت:

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

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

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

  2. محمد گفت:

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

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

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

  3. رضا گفت:

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

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

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

  4. مهراد گفت:

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

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

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

  5. Godali645 گفت:

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

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

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

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

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

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