این یک ساعت زنگ دار مجهز به آردوینو است که پس از زدن دوبار به تعویق انداختن زنگ هشدار لغو نمی شود تا زمانی که کاربر 4 خط را در بازی تتریس پاک کند. برای بازی تتریس، ساعت را از نظر فیزیکی به طرفین می چرخانید، بنابراین صفحه نمایش عمودی است. بیدار شدن در صبح هرگز سرگرم کننده نیست، اما بازی کمی تتریس حداقل تا حدودی لذت بخش و کاملا موثر است.
اگر پروژه من را دوست دارید، در مسابقه میکروکنترلر به من رای دهید. به نظر می رسد که مسابقه ممکن است خاص به حرکت دادن چیزها باشد. پس این چه حرکتی دارد؟ دانش آموزی را که تا دیروقت بیدار مانده و تکالیفش را انجام می دهد، والدین را با یک فرزند تازه متولد شده به حرکت در می آورد، نویسنده Instructables را که مجبور شده بود پروژه خود را برخلاف عقل سلیم به پایان برساند، به حرکت در می آورد. آن چیزی را که اغلب می تواند غیرقابل حرکت ترین اجسام باشد حرکت می دهد... شما.
پیوند مستقیم به این ویدیو http://www.youtube.com/watch?v=szoPO75u46s
مراحل 9 و 10 دارای ویدیوهای اضافی هستند.
برخی از ویژگی های کلیدی:
-هر دکمه فشار دادن زنگ را به مدت 30 ثانیه خاموش می کند تا در حین بازی تتریس به وزوز گوش ندهید.
-کاربر می تواند انتخاب کند که فاصله چرت زدن چقدر است (با دانه بندی دوم)، چند بار مجاز به زدن چرت (0-255) و اینکه آیا فاصله زمانی چرت زدن از زمانی است که زنگ هشدار به صدا درآمد یا زمانی که به تعویق افتاد. دکمه (هر دکمه) فشار داده می شود.
-دو آلارم جداگانه: یکی زنگ هشدار سنتی است که با رسیدن به آن زمان خاموش می شود و سپس برای روزهای بعد غیرفعال می شود. مورد دیگر چیزی است که من آن را زنگ "مداوم" می نامم که از دوشنبه تا جمعه در همان زمان خاموش می شود، بنابراین برای روزهای بعد غیرفعال نمی شود.
-از اعداد بزرگ استفاده می کند که من از این Instructable الهام گرفتم و او از اینجا ایده گرفت .
-از پایهای که روی آن قرار دارد انرژی میگیرد، اما یک باتری قابل شارژ پشتیبان دارد تا بتوانید ساعت را بدون فشار دادن سیمها کج کنید. تعویض و شارژ مجدد باتری NiMH به صورت خودکار انجام می شود.
-دارای یک کلید فیزیکی برای خاموش کردن زنگ هشدار که به همسر/هم اتاقی/والدین شما داده می شود، بنابراین می توان زنگ هشدار را با بازی تتریس خاموش کرد
- روشنایی نور پس زمینه از طریق نرم افزار قابل کنترل است و نور پس زمینه زمانی که روشن نیست خاموش می شود. پایه برای حفظ توان و نشان می دهد که نیروی خارجی وجود ندارد.
-با بازی تتریس می توانید در هر زمان، حتی قبل از اینکه فواصل چرت زدن به پایان برسد، زنگ هشدار را لغو کنید.
-چهار سبک مختلف تتریس، جزئیات مرحله 8.
- هنگام تنظیم زمان و آلارم به جای تنظیم معمول ساعت و دقیقه، کاربر می تواند ده ها ساعت، ساعت، ده ها دقیقه، دقیقه، ده ها ثانیه، ثانیه، دهم را تنظیم کند. از ثانیه، صدم ثانیه (بله، واقعا) و روز هفته. این امکان تنظیم سریع زمان و توانایی همگام سازی آسان با منبع زمانی دیگر را فراهم می کند. برای جزئیات بیشتر به مرحله 9 مراجعه کنید.
سایر نقاط مورد علاقه:
-استفاده از وقفه ها، مرحله 4.
-بهترین (به نظر من) راه برای بازگرداندن سوئیچ ها، مرحله 5.
-استفاده از PROGMEM برای ذخیره رشته ها برای صرفه جویی در حافظه، مرحله 7.
-دستورالعمل های دقیق و ساده برای استفاده از برد Sparkfun FTDI Basic Breakout و ساخت برد آردوینو barebones، مرحله 13.
-نگهداری زمان با آردوینو بدون ساعت واقعی مجزا، مرحله 2.
-نحوه مقابله با این واقعیت که تابع Arduino () millis به عقب باز می شود. به 0 هر 50 روز یا بیشتر، مرحله 2.
این اولین پروژه آردوینو من است و باید بگویم که یک محیط بسیار نرم است.
مرحله 1: قطعات
-یک آردوینو یا یک ATMega328 با بوت لودر آردوینو. Sparkfun آنها را آماده می فروشد یا یک دلار پس انداز می کند و آن را از Digikey شماره قطعه ATMEGA328-PU-ND خریداری می کند . اگر یکی را بدون بوت لودر بخرید، باید خودتان آن را برنامه ریزی کنید. من از یک UsbTiny از Adafruit استفاده کردم و به لطف Arduino IDE این فرآیند بسیار آسان بود. (5.50 دلار)
-روشی برای برنامه نویسی آردوینو. من از Sparkfun's FTDI Basic Breakout شماره مورد DEV-09873 استفاده کردم . من به طرز شگفتآوری مشکل داشتم که چگونه برنامهنویس را وصل کنم، بنابراین دستورالعملهایی برای آن در مرحله 13 دارم. (22.00 دلار)
- یک کریستال و خازنهای همراه. این و دو مورد بالا تمام چیزی است که برای یک آردوینو بدون استخوان لازم است. تشدید کننده سرامیکی در این برنامه کار نمی کند زیرا ما زمان را پیگیری می کنیم. من از Digikey شماره قطعه 300-8437-ND گرفتم . (0.63 دلار)
- یک صفحه نمایش LCD استاندارد با نور پس زمینه (HD44780) 16×2. من از Sure Electronics شماره قطعه DE-LM12111 گرفتم . (5.99 دلار)
-چهار دکمه. من از نمونه های لمسی شماره قطعه Digikey SW404-ND استفاده کردم . (0.35 دلار)
-یک زنگ. من یکی از Digikey را که مدتها پیش برای پروژه دیگری گرفتم استفاده کردم بنابراین شماره قطعه را فراموش کردم.
-یک باتری قابل شارژ 9 ولت NiMH من از بندر باربری شماره قطعه 97865 گرفتم . (9.99 دلار اگر چه آنها یک عدد ارزانتر و ظرفیت کمتر دارند که روزی که من رفتم موجود نبود)
- یک نگهدارنده گیره باتری 9 ولتی، من مال خود را از شماره قطعه Digikey 71K-ND دریافت کردم . (0.44 دلار)
-یک باتری 9 ولتی، من یک جفت را در دست داشتم، اما مطمئن هستم که آنها را در اصل از Digikey گرفته ام.
-یک آی سی باتری پشتیبان ICL7673، دستگاه فوق العاده ای که به طور خودکار بین دو منبع تغذیه بدون وقفه در برق دستگاه سوئیچ می کند و حتی نشان می دهد که در حال حاضر از کدام منبع تغذیه استفاده می شود. من از Digikey شماره قطعه ICL7673CPAZ-ND گرفتم . (2.08 دلار)
- یک تنظیم کننده ولتاژ 5 ولت، من از نوع Low Drop Out از شماره قطعه Digikey MC7805CT-BPMS-ND استفاده کردم . (0.56 دلار)
-یک جفت دیود، یکی برای شارژ مجدد خمیر و دیگری برای اطمینان در برابر برق رسانی معکوس. من یکی از شماره قطعه Digikey 1N4148FS-ND و یکی از جعبه قطعاتم استفاده کردم. دو مورد از Digikey باید به خوبی کار کنند. (0.14 دلار)
- یک عدد (6 یا بیشتر) از خازن های دیسک سرامیکی 0.1uF. من خودم را از شماره قطعه 478-5741-ND Digikey گرفتم . (0.13 دلار)
-مقاومت های مختلف، من مقاومت خود را از Digikey و از جعبه قطعاتم که در اصل از یک قطعه بسیار ارزشمند رادیو شاک خرید شماره 271-312 تهیه شده بود، دریافت کردم . (9.99 دلار)
-محفظه پروژه از Radio Shack (6x3x2") شماره قطعه 270-1805 . (3.99 دلار)
-Veroboard ( استریپبورد )، من مال خود را از Ebay گرفتم، شما میتوانید از مواد مورد علاقهتان برای ساخت تخته از حکاکی روی روکش مسی گرفته تا تخته پرف استفاده کنید . اگر به آن مسیر می روید، مقداری تخته استریپ بورد و ابزاری برای بریدن آثار با هم از eBay در نظر بگیرید.
-من همچنین از تخته نان برای آزمایش اولیه و مقوا برای ساختن محفظه استفاده کردم.
-آهن لحیم کاری، لحیم کاری، سیم کش، ابزار چرخشی برای ساخت محفظه، چیزهای معمولی.
مرحله 2: کد - عمومی
کد به این مرحله پیوست شده است. فایل فشرده فقط سه فایل دیگر زیپ شده است. "v1" در فایل فشرده فقط نسخه 1 را نشان می دهد و راهی آسان برای بررسی اینکه آیا به روز رسانی نرم افزار وجود دارد یا خیر.
تمام کدها، به استثنای روتین کوچک () availableMemory، به طور کامل از ابتدا توسط من نوشته شده است.
من در ابتدا فکر می کردم که قسمت تتریس کد پیچیده تر از قسمت نگه داشتن زمان است. من نمیتونم دوباره اشتباه کنم. نوشتن تتریس برای آردوینو در مقایسه با یک ساعت زنگ دار با تمام ویژگی هایی که می خواستم یک کیک پیاده روی بود. شرح برخی از مسائل برنامه نویسی در چند مرحله بعدی آمده است.
بسیاری از پارامترها در کد قابل تنظیم هستند. همه آنها در بالای فایل اصلی قرار دارند و شامل موارد زیر هستند:
-تمام تخصیص سیم/پین
-زمان پیش فرض و هر دو آلارم
-فرکانس مشخص زنگ هشدار را ثابت می کند (پیش فرض 4 کیلوهرتز)
-زمانی که هر بار که دکمه ای فشار داده می شود زنگ هشدار خاموش می شود (پیشفرض 30 ثانیه)
-روشنایی پیشفرض نور پسزمینه 0-128 (پیشفرض 128)
بسیاری از پارامترها از طریق خود ساعت قابل تنظیم هستند:
-از قطعات ضخیم تر یا کوچکتر استفاده می شود
-اگر 2 کاراکتر سفارشی برای قطعات و 6 کاراکتر برای قلوه سنگ زیر یا 4 و 4 استفاده می شود.
-طول چرت زدن بر حسب دقیقه (پیشفرض 7 دقیقه)
-طول چرت زدن بر حسب ثانیه (پیشفرض 30 ثانیه برای مجموع 7 دقیقه و 30 ثانیه)
-تعداد دفعاتی که میتوان قبل از بیدار شدن از خواب به چرت زدن ضربه زد (پیشفرض 2)
- چه ضربه زدن به چرت مطلق باشد یا نسبی، اگر زمان تعویق به زمان زنگ اصلی اضافه شود یا زمانی که دکمه زده می شود -چند
خط تتریس باید پاک شود تا بیدار اعلام شود (پیش فرض 4) -
ساعت را به حالت قبلی بازگردانید تنظیمات پیشفرض
- روشن کردن موارد اضافی مانند صبح/بعدازظهر، روز هفته و اینکه کدام زنگ ساعت روشن و خاموش است -نمایش
نسخه فعلی نرمافزار
-ذخیره و بازیابی EEPROM
بسیاری از پارامترها در EEPROM ذخیره می شوند تا در صورت قطع کامل برق، زنده بمانند. اگر هر یک از پارامترها تغییر کرده باشد، هر روز در نیمه شب ذخیره می شود. آنها عبارتند از:
-زمان فعلی (از جمله روز هفته)، و هر دو زنگ هشدار
- مقدار نور پس زمینه
- حالت عملکرد تتریس (برای توضیحات به مرحله 3 مراجعه کنید)
- متغیرهای تعویق
- روشن یا خاموش بودن موارد اضافی
- چند خط طول می کشد تا روشن در تتریس خود را بیدار اعلام کنید
به لطف افراد خوب در اجرای عالی تابع millis() توسط آردوینو، حفظ زمان آسان شده است. این تابع در یک وقفه اجرا می شود و به گونه ای ساخته می شود که یک تیک را از دست ندهید. تنها کاری که باید انجام دهم این است که به صورت دوره ای زمان سپری شده از آخرین فراخوانی millis() را به زمان فعلی اضافه کنم. آسان به عنوان پای.
من یک مانور جالب برای رسیدگی به مشکل roll-over millis() انجام می دهم. تابع millis() از یک متغیر طولانی بدون علامت استفاده می کند و 32 بیت به این معنی است که می تواند تا 4294967295 برود. اما از آنجایی که میلی ثانیه را دنبال می کند، به این معنی است که هر 50 روز یا بیشتر تغییر می کند. این معمولاً مشکلی نیست، اما از آنجایی که این پروژه به طور مداوم اجرا می شود و به تابع ()millis متکی است، باید آن سرریز را حساب کنیم. کاری که من انجام میدهم این است که تابع millis() را نظارت میکنم و زمانی که از نیمه راه عبور کرد اقداماتی انجام میدهم. وقتی در کد راحت باشد (هیچ وقت مهمی اتفاق نمیافتد) نصف مقدار کل تابع millis() را هم از خود تابع و هم از متغیرهای حفظ زمان خودم کم میکنم. به این ترتیب می تواند درست از این نیمه عبور کند و زمانی که ایمن است، نیمه تمام وقت را از همه چیز کم کرده و ادامه دهد. توضیح آن کمی سخت است، بررسی کد ممکن است کمک کند، اما مانند یک جذابیت عمل می کند.