فهرست مطالب:

Lego Mini Memory Game: 5 مرحله (همراه با تصاویر)
Lego Mini Memory Game: 5 مرحله (همراه با تصاویر)

تصویری: Lego Mini Memory Game: 5 مرحله (همراه با تصاویر)

تصویری: Lego Mini Memory Game: 5 مرحله (همراه با تصاویر)
تصویری: On the traces of an Ancient Civilization? 🗿 What if we have been mistaken on our past? 2024, جولای
Anonim
Image
Image
بازی حافظه کوچک لگو
بازی حافظه کوچک لگو

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

همانطور که با زحمت در آن دستورالعمل توضیح دادم ، بیشتر تلاش های آن زمان مربوط به سیم کشی مینی بود بدون اینکه همه چیز خراب شود. در کمال تعجب ، مینی متعاقباً از سفری از کانکتیکات به تورنتو جان سالم به در برد و از آن زمان ، کم و بیش کار کرده است.

"در صورت خراب نشدن ، او آن را تا آن زمان برطرف می کند" ، در بهترین حالت ، سرنوشت من خواهد بود ، بنابراین وقتی مینی برای کریسمس به خانه بازگشت ، زمان لگو مینی 2.0 فرا رسید. از این گذشته ، اگر تسلا بتواند به روز رسانی نرم افزار را به خودروهای خود برساند ، چقدر دشوار می تواند باشد؟

من چند ایده داشتم:

  • رابط کاربری نسبتاً ناخوشایند را بهبود بخشید
  • یک شاخ اضافه کنید!
  • بهبود ویژگی "چراغ های خودکار" ؛ و مهمترین
  • یک عملکرد بازی اضافه کنید (حتی من تشخیص دادم که تازگی روشن و خاموش کردن چراغ های Mini با تلفن شما دیر یا زود روشن می شود)

عملکرد بازی بزرگترین وظیفه بود ، نه تنها به این دلیل که برای من فوراً مشخص نبود که چه نوع بازی می تواند باشد. Mini بسیار شکننده است تا بتواند بازی ای را که شامل آن می شود مدیریت کند (بجز احتمالاً یک نوع افسرده کننده Jenga). یکی دیگر از موانع این بود که من هرگز بازی ای را در زندگی خود برنامه ریزی نکرده ام.

پس از یک سال تفکر بی نتیجه ، با پروژه ای در Hackster روبرو شدم ، که در آن Arduino Uno برای شبیه سازی یک اسباب بازی بازی حافظه متعلق به دهه 1970 به نام Simon استفاده می شود. به طور خلاصه ، دستگاه سیمون دنباله ای از چراغ ها را پخش می کرد که سپس پخش کننده باید آنها را به خاطر می آورد و با فشار دادن دکمه ها پخش می کرد. پس از هر دور موفق ، طول دنباله افزایش می یابد.

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

اما ابتدا ، من نیاز به انجام برخی تغییرات جزئی در سخت افزار داشتم.

مرحله 1: اجزا ، ابزارها و منابع

اجزا ، ابزارها و منابع
اجزا ، ابزارها و منابع

اگر از این پروژه با Lego Mini استفاده می کنید ، به تمام موارد ذکر شده در دستورالعمل قبلی من نیاز دارید. تنها چیزی که به آن احتیاج دارید یک زنگ منفعل است که برای بوق و ایجاد صداهای مزاحم در طول بازی (که می توان آنها را غیرفعال کرد) استفاده می شود.

همانطور که هنگام بحث در مورد نرم افزار مشخص می شود ، نیازی به استفاده از Lego Mini برای بازی نیست. می توانید از کیت Lego دیگری یا در واقع تعدادی LED در تخته نان متصل به هر برد توسعه ESP8266 استفاده کنید. با برخی از رله ها ، حتی می توانید از نور اتاق خانه خود استفاده کنید. بچه ها ، از والدین خود در مورد آن سوال کنید.

به طور مشابه ، هیچ ابزار یا منابع اضافی فراتر از موارد ذکر شده برای پروژه اصلی مورد نیاز نیست.

اگر جزء تعداد انگشت شماری از افرادی هستید که توضیحات اصلی پروژه را خوانده اند ، می دانید که لگو مینی در اصل به عنوان هدیه به دختر بزرگسال من خریداری شده است که مینی تقریباً یکسان "واقعی" یا تقریباً مشابه دارد. ممکن است به آن داده شود مینی جدید است ، نه "کلاسیک". عدم وجود اجزای اضافی معنادار باعث جذابیت بیشتر این پروژه جدید شد زیرا به من این امکان را می داد تا به طور م Leثر Lego Mini 2.0 را به عنوان هدیه جدید کریسمس مجدداً هدیه دهم ، بدون آنکه حتی یک سکه هزینه کنم. نابغه!

مرحله 2: اصلاح سخت افزار

اصلاح سخت افزار
اصلاح سخت افزار

پروژه اصلی دارای LED های داخلی RGB به صورت جداگانه قابل کنترل بود. این سه پین در NodeMCU مصرف کرد ، که من از آنها به عنوان تابلوی توسعه استفاده می کردم. پس از مشورت جداگانه با مالک Lego Mini ، مشخص شد که LED های RGB از ویژگی های استفاده نشده هستند. این هوش مهمی بود زیرا من باید یک پین برای زنگ/بوق آزاد کنم.

نمودار مدار بالا از پروژه اصلی است. تنها تغییر مورد نیاز برای این پروژه حذف LED های RGB و استفاده از سه پین آزاد شده به شرح زیر است:

  • D1 برای سیگنال کنترل زنگ (که مستقیماً به منبع تغذیه 5VDC وصل می شود)
  • D7 برای LED داخلی سفید
  • D8 برای یکی از آن LEDS های رنگی چشمک زن ، که من آن را چراغ "دیسکو" نامیده ام

صدای زنگ خود را به خوبی زیر محفظه موتور جمع می کند ، بنابراین بازگشت سیم ها به NodeMCU یک ضربه محکم و ناگهانی بود.

مرحله 3: به روز رسانی GUI

به روز رسانی GUI
به روز رسانی GUI
به روز رسانی GUI
به روز رسانی GUI
به روز رسانی GUI
به روز رسانی GUI

اولین قدم برای به روز رسانی GUI ایجاد چهار صفحه وب جداگانه بود:

  • "صفحه چلپ چلوپ" که از طریق نماد سفارشی در تلفن هوشمند شما راه اندازی می شود و به صفحات دیگر پیوند می یابد
  • صفحه "کنترل" که به خوبی چراغ ها را کنترل می کند (و البته ، البته ، بوق)
  • صفحه "بازی"
  • یک صفحه تنظیم که شامل گزینه های پیکربندی مانند:

    • روشن و خاموش کردن صدا
    • تنظیم منطقه زمانی (Mini از اینترنت زمان می گیرد تا بتواند چراغ های خود را در ساعت با زمان مناسب چشمک بزند)
    • تنظیم زمانی که "چراغ های خودکار" چراغ های جلو را بر اساس سطح نور محیط روشن و خاموش می کند
    • بازنشانی نام امتیاز بالا و امتیاز بالا (ذخیره شده در EEPROM)

تفکیک توابع به این روش تجربه بسیار بیشتری را مانند برنامه ایجاد می کند. دریافت NodeMCU برای سرویس دهی به چندین صفحه یکی از چالش های این پروژه بود. پس از امتحان چند روش مختلف ، به کدی که در خطوط 232 تا 236 طرح اصلی آردوینو می بینید برخورد کردم. این بسیار عالی کار می کند - به سادگی فایل فهرست خود را ایجاد کنید ، سپس صفحات بعدی را صفحه 1 ، صفحه 2 و غیره نامگذاری کنید. من متوجه شدم که باید همه فایلهای منبع (CSS و تصاویر) را در پوشه داده های ریشه قرار دهم ، اما این واقعا برای سایتهای این اندازه

در مرحله بعد ، من مجبور شدم با CSS و Javascript کار کنم تا چیزی شبیه به Lego Mini تعبیه شود. از آنجا که من در مورد هیچ یک از موضوعات چیزی نمی دانم ، قبل از به دست آوردن چیزی که از آن راضی بودم ، گوگل زیادی در اینجا انجام شد. من با بی شرمانه کپی یک آجر لگو با سبک CSS در CodePen را در اینجا شروع کردم. من همچنین می خواستم از برچسب زدن دکمه ها با متن فاصله بگیرم و از گرافیک ساده Icons8 استفاده کنم ، که برای اهداف من عالی بود. بقیه به نوعی از آنجا سقوط کردند. صفحات در همه آیفون هایی که من آنها را آزمایش کرده ام بسیار خوب ارائه می شود. امیدوارم همین امر در مورد تلفن های Android نیز صادق باشد (در مرورگر Chrome دسکتاپ خوب به نظر می رسد).

مرحله 4: کد بازی

کد بازی
کد بازی

ارتباط بین سرور NodeMCU و مرورگر تلفن های هوشمند از طریق Webockets انجام می شود. پس از فشار دادن یک دکمه توسط کاربر ، مرورگر یک کاراکتر متنی را به NodeMCU ارسال می کند که مربوط به یک یا چند چراغ Mini است. شخصیت های اضافی برای کنترل جریان بازی ارسال می شوند. سپس کد آردوینو بر اساس شخصیت دریافت شده اقدام می کند. ارتباط وب سایت فقط می تواند کاراکترهای دوتایی و متنی را کنترل کند ، بنابراین برای اعداد صحیح (به عنوان مثال منطقه زمانی) نیاز به تبدیل وجود دارد.

همانطور که اشاره کردم ، من در ابتدا از کد پروژه متصل شده Hackster برای عملکردهای اصلی بازی پیش بینی کرده بودم. چیزی که من پیش بینی می کردم اتفاق می افتد این است که پس از فشار دادن یک دکمه توسط بازیکن ، LED مربوطه روشن می شود و کد به صورت دیجیتالی عمل می کند و روی تمام LED ها می خوانید تا ببینید چراغ مناسب روشن شده است (پروژه Hackster ورودی های دکمه فیزیکی را بررسی می کند اما این همان ایده است) این کار به نوعی انجام شد ، اما به دلایلی که هنوز برای من نامشخص است ، نه به طور کامل. تقریباً 10 the از مواردی که مینی می گوید دکمه ای اشتباه فشار داده شده است ، در واقع دکمه صحیح بوده است. همه چیز بر اساس آنچه در مانیتور سریال و در کنسول مرورگر مشاهده می کردم خوب به نظر می رسید ، بنابراین نمی دانم چرا کار نمی کند.

پس از بسیاری از اشتباهات در تلاش برای معرفی برخی از بررسی خطاها ، من کل ایده خواندن حالت های LED را کنار گذاشتم و یک آرایه "پاسخ" ایجاد کردم که بررسی می کند آیا متن دریافتی WebSocket با پین صحیح ذخیره شده در آرایه "sequence" مطابقت دارد یا خیر. دنباله نور را به خاطر می آورد این به نظر می رسد 100 reliable قابل اعتماد است ، حتی اگر روشی که من آن را اجرا کرده ام کمی مثر باشد. پس از ارائه این روش ، من با این اتفاق برخورد کردم ، که اکتشاف جالبی از نحوه کار برخی قفل های دیجیتال و مشابه روش مورد استفاده در بازی است.

زمان بندی ورودی های دکمه در حال حاضر با JavaScript در سمت مرورگر انجام می شود (من بین ورودی های دکمه 10 ثانیه بسیار سخاوتمندانه اجازه می دهم) و جریان بازی در حال حاضر به طور کامل توسط بازیکن کنترل می شود و نه کدگذاری سخت. صفحه نمایش شامل پنجره هایی است که زمان باقی مانده برای فشار دادن دکمه بعدی و تعداد ورودی های باقی مانده قبل از ارسال صحیح ترتیب توسط پخش کننده را نشان می دهد.

نمره بالا در EEPROM (یا چیزی که برای EEPROM در دنیای ESP8266 می گذرد) ذخیره می شود و اگر بازیکنی به نمره جدید بالا برسد ، یک پنجره بازشو به آنها اجازه می دهد نام دلخواه خود را وارد کنند ، که در EEPROM نیز ذخیره می شود. این مقادیر را می توان از طریق صفحه راه اندازی مجدد تنظیم کرد (مطمئن هستم دلایل موجهی برای این امر وجود دارد).

با همه این موارد ، من یک تکه مناسب از کد بازی Hackster را مجدداً استفاده کردم که کارها را بسیار سرعت بخشید.

مرحله 5: بقیه کد

بقیه کد
بقیه کد

در مقایسه با کد پروژه Hackster ، طرح Arduino من بسیار بزرگ به نظر می رسد ، حتی بدون وجود تمام HTML ، CSS و Javascript در فایل های داده. اما بخش عمده ای از طرح شامل مجموعه ای از توابع مربوط به عملیات اساسی مانند ایجاد و مدیریت سرور ، دریافت زمان NTP ، mDNS ، ارائه به روزرسانی از طریق هوا ، مدیریت WiFi ، مدیریت فایل SPIFFS و موارد مشابه است.

جاوا اسکریپت در فایل های HTML در درجه اول برای مدیریت پیام های وب سایت (دریافت و ارسال) و افزایش تعامل GUI است.

همانطور که اشاره کردم ، می خواستم عملکرد ویژگی "چراغهای خودکار" را بهبود بخشم ، که از مقاومت وابسته به نور در تنها پین آنالوگ NodeMCU برای تشخیص نور محیط و روشن کردن چراغهای Mini در سطح از پیش تعیین شده استفاده می کند (هنگامی که در حالت بازی نیست ، البته). در حالی که این یک ویژگی بی اهمیت در یک پروژه بی اهمیت است ، من را ناراحت کرد که در پروژه اصلی آستانه روشن کردن را به سختی کد کرده بودم و یک کاربر هیچ راهی برای مشاهده نحوه ارتباط سطح نور غالب با آن آستانه نداشت. اکنون میزان روشنایی هر پنج ثانیه به صفحه تنظیمات ارسال می شود و آن صفحه همچنین آستانه های فعلی را برای روشن و خاموش (که توسط کاربر قابل تنظیم است) نمایش می دهد. بنابراین کار روی آن یکی انجام شد

اوه ، تقریباً فراموش کرده ام کد اینجا در GitHub است. پس از بارگیری ، کل بسته را در یک پوشه جدید قرار دهید ، طرح Arduino را بارگذاری کنید ، سپس محتویات پوشه داده را در SPIFFS وارد کنید.

توصیه شده: