استفاده از میلیس و جوی استیک

سلام دوست عزیز، خوشحالم که خودتون تونستید این کد رو بزنید. در مورد استفاده زیاد از متغیر های کمکی هم، من کد شما رو نگاه کردم و متاسفانه چون اسم متغیر ها e و ed و اینا بود زیاد متوجه نشدم. ولی به هر حال شما از لحاظ منطقی باید ببینید سیستم شما در چند حالت ممکن هست وارد بشه و بعد برای اینکه بفهمید الان داخل کدوم یکی از این حالت ها هستید، از متغیر های کمکی استفاده کنید.
یکی از کارهایی که برنامه نویس ها می کنن این هست که اول کدی می زنن که کار می کنه و بعد سعی می کنن که اون رو بهینه کنن. شما می تونید حالت سیستم رو روی کاغذ بنویسید و سعی کنید که یکی از متغیر های کمکی رو حذف کنید.
بعضی وقت ها هم لازم نیست همه متغیر ها فقط ۰ و ۱ داشته باشن برای مشخص کردن وضعیت سیستم.
فرضا شما چک می کنید که آیا حالت خاصی برقرار هست یا نه و به نسبت اون متغیر a رو 1 می کنید و حالا چک می کنید که سیستم حالت خاصی داره یا نه و متغیر b رو 1 می کنید و روی حالت های a و b هم if گذاشتید ولی می تونید b رو حذف کنید و به جای اون a رو بذارید 2 یا 3 یا ...
به این حالت میگن state machine. یعنی شما به حالت های مختلف سیستم یک عدد میدید و اون رو در یک متغیر کمکی ذخیره می کنید. حالا سیستم همیشه داره اون متغیر رو چک می کنه و به نسبت اینکه مقدارش 0 یا 1 یا 2 یا 3 یا ... بود، تصمیم می گیره که چیکار کنه.
بنابراین برای تحلیل یک سیستم، می تونید اون رو تبدیل کنید به حالت های مجزا و بعد یک state machine رو با کد بسازید.

سلام دوست عزیز، من کد رو دیدم. با توجه به اینکه یادگیری شما فقط در صورتی رخ میده که خودتون کد رو بزنید، من اینجا سعی می کنم که شما رو راهنمایی کنم که این کد رو خودتون بزنید.
در مرحله اول، کلا جوی استیک و ... رو جدا کنید و فقط یک دکمه ساده بمونه. هدف اینه که شما این دکمه رو که زدید، اگه یکبار زدید و ول کردید، یک کار کنه و اگر زیاد نگه داشتید یک کار دیگه کنه.
بنابراین داخل loop اصلی برنامه باید دکمه رو بخونید و وقتی که فشرده شد، milis اون زمان رو یک جا نگه دارید و وقتی که ول کرد هم milis زمان دوم رو جای دیگه نگه دارید و بعد از تفریق این دو عدد می تونید بفهمید که کاربر چقدر دستش روی دکمه بوده. حالا با یک if می تونید برای زمان های مختلف، سناریو های مختلفی اجرا کنید. حتی می تونید یک دکمه سه زمانه بسازید مثلا برای زیر ۱ ثانیه، زیر ۳ ثانیه و زیر ۱۰ ثانیه (مثل این دکمه ها هست که میگیرید برای ریست کردن مودم ها و باید خیلی نگهشون دارید)
سعی کنید این کد رو به صورت ایزوله بزنید و قسمت های جوی استیک و اینها رو الان داخل برنامه نکنید. بعد مرحله مرحله پیش میریم.

@Mohamad#3553
من خودم سعی کردم مشکل رو با این کد(پایین) حل کنم ، اما نشد.

[upl-file uuid=e8489d51-3642-4b94-868c-5ad798527ecd size=1kB]sketch-dec29c.txt[/upl-file]

@Mehrad#3569
با سلام بنده متاسفانه کمی کسالت دارم ...به محض کسب بهبودی ، انجام خواهم داد ..با تشکر از راهنماییتون.

@Mehrad#3632
با عرض سلام ،
ممنون ازتون بابت راهنمایی و مطالب آموزنده.

سلام دوست عزیز، لطفا کدی که در آن سعی کردید که این سناریو رو اجرا کنید، اینجا ارسال کنید. لطفا کل سناریو رو هم توضیح بدید. اینکه هدفتون از کد چی هست؟‌ مثلا اگر یکبار ورودی اومد، چیکار کنه و اگر ۳ ثانیه دستش رو نگه داشت چیکار کنه و ...

@Mehrad#3552
سلام
کد اصلی اینه که تو این پیام میفرستم ،
در این کد وقتی دکمه جوی استیک رو فشار میدم ، مود از یک به صفر و بلعکس تغییر میکنه .
حالا میخواستم با کمی تغییر همین کد و با استفاده از میلیس ، اگر دکمه جوی استیک بیش از سه ثانیه فشرده و برداشته شد ،مود هیچ تغییری نکند ،(بتونه فرق یه دکمه ساده رو با دکمه ای که زیاد نگه داشته میشود رو تشخیص بدهد).

توضیح هدف کد:
این کد با استفاده از آی سی (L293D) به موتور وصل میشه با استفاده از pwm دو مود (mode) بزرگسال(0) و کودک(1) ساخته میشه و مود بزرگسال از کل سرعت موتور استفاده میشود و مود کودک کمتر.

[upl-file uuid=d09999a9-719f-40a1-b944-acb6d3c479db size=963B]sketch-dec26f.txt[/upl-file]

@Mehrad#3569
با سلام
مهندس ، من همانطور که گفته بودین ،تمرین رو انجام دادم و بعد جوی استیک و .....رو هم اضافه کردم .
کد داره به خوبی کار میکنه ولی خودم فکر میکنم که بیش از اندازه از متغیر های کمکی استفاده کردم و به نظرم غیر اصولی است .
نکته جالب برام این بود که ابتدا با دستور(while)، این کار رو کردم و کد کار میکرد ولی گهگاهی که پشت سر هم دکمه رو میزدم ، درست کار نمیکرد ..

[upl-file uuid=2a6d7cf7-3a4c-4193-801a-5fa95e992e8e size=1kB]sketch-jan03a.txt[/upl-file]

سلام و خسته نباشید خدمت مهندس معین.
درآخر جلسه دهم شما گفتین به عنوان تمرین …
کدی با استفاده از میلیس بنویسید که اگه دکمه جوی استیک بیش از سه ثانیه فشرده شد (مثلا به اشتباه فشرده شده است)

Mode تغییری نکند …
من برای نوشتن این کد به مشکل خوردم …
ممنون میشم راهنماییم کنید.
میلیس زمانی که دکمه فشار داده میشود رو میگیرم بعدش کد های مختلفی رو امتحان کردم اما کد درست اجرا نمیشه
مثلا یه بار دکمه رو که فشار میدم ،مود تغییری نمیکنه حتی اگه کمتر از سه ثانیه باشه، یا اینکه وقتی تاگل میکنم دکمه رو که فشار میدم هم زیر سه ثانیه رو تاگل میکنه هم بالای سه ثانیه رو…