سلام! در فرستهٔ قبل راداری ساختیم که در زاویههای مختلف میایستاد و فاصله را اعلام میکرد. شاید این خیلی به درد بخور نباشد. در این فرسته رادارمان را ارتقا خواهیم داد و کاربردیترش خواهیم کرد.
اگر هنوز فرستهٔ قبل را نخواندهاید، معطل نکنید!
اینکه رادار در هر زاویه فاصله را به ما اعلام کند خیلی حوصله سر بر است. ایده است که رادار فقط هنگام بروز مشکل صدایمان کند. برای این کار لازم است رادار فاصلهٔ مورد انتظار در هر زاویه را بداند و اگر چیزی از آن فاصله نزدیکتر آمد، بوق هشدار به صدا در آید.
متغیر distance را به یک آرایهٔ ۱۹ تایی تبدیل میکنیم تا مقادیر اندازهگیری اولیه را در آن ذخیره کنیم. چون سروو از زاویهٔ ۰ تا ۱۸۰، ۱۰ درجه ۱۰ درجه میچرخد، در کل میشود ۱۹ تا. مقادیر اولیهاش را هم ۰ میگذاریم. یک متغیر جدید به نام newDistance هم تعریف میکنیم تا کار قبلی distance را انجام دهد!
تابع getDistance را اصلاح میکنیم تا فاصلهٔ اندازه گرفته شده را به جای ذخیره در متغیر، برگرداند:
توجه کنید که در اولِ تابع، نوشته شده int؛ چون مقداری که برمیگرداند int است. قبلاً void بود. یعنی هیچ مقداری را برنمیگرداند.
حالا که مقدار بر میگرداند، باید آن را به یک متغیر نسبت بدهیم!
داخل تابع setup کدهای مربوط به چرخیدن سروو و فاصلهسنجی اولتراسونیک را قرار میدهیم. این کدها فقط یکبار اجرا میشوند و نتیجهٔ فاصلهسنجی در آرایهٔ distance ذخیره میشود:
به علامت «کوچکتر/مساوی» برای مقایسهٔ متغیر angle با ۱۸۰ توجه کنید. در تابع loop که علامت «کوچکتر» گذاشته شده، در حلقهٔ اول، از ۰ تا ۱۷۰ میرود و در حلقهٔ دوم، از ۱۸۰ تا ۱۰ (تمام زاویهها پوشش داده میشود). اما اینجا فقط یه حلقه داریم و باید «کوچکتر/مساوی» بگذاریم تا از ۰ تا ۱۸۰ شمارش شود!
میتوانیم آرایهٔ distance را [با مشقّت] داخل سریال چاپ کنیم تا ببینیم فاصلهٔ مورد انتظار در هر زاویه چقدر است (داخل همان تابع setup):
قبل از هر چیز، پایانهٔ پیزومان را معرفی میکنیم (به پایانهٔ ۱۰) و در تابع setup هم آن را به عنوان خروجی تعیین میکنیم (برای شلوغ نشدن، فقط کدهای پیزو را گذاشتهام):
نام تابع showResault را به warn تغییر میدهیم؛ چون قرار است تغییر کاربری بدهد. قرار است هر بار که فراخوانی شد، علاوه بر نمایش فاصلهٔ «اشیای ناخواسته» روی نمایشگر، یک بوق هم تحویل ما بدهد! برای این که از تابع tone استفاده میکنیم. این تابع یک موج مربعی با بسامد مورد نظر به پایهٔ مورد نظر میفرستد.
در نهایت کدهای تابع loop را اصلاح میکنیم تا فقط وقتی که فاصلهٔ اندازه گرفته شده از فاصلهٔ مورد انتظار کمتر بود (البته با ۵cm خطا)، تابع warn را فرابخواند.
دقت کنید که در تابع setup، سروو تا زاویهٔ ۱۸۰ چرخیده بود. به همین خاطر در اینجا از زاویهٔ ۱۸۰ شروع کردیم. اگر دوباره از زاویهٔ ۰ شروع میکردیم، سروو یک حرکت ۱۸۰ درجهای میکرد تا به زاویهٔ ۰ برسد!