جدول المحتويات:

Arduino Scrolling Text Clock: 3 خطوات
Arduino Scrolling Text Clock: 3 خطوات

فيديو: Arduino Scrolling Text Clock: 3 خطوات

فيديو: Arduino Scrolling Text Clock: 3 خطوات
فيديو: Arduino LED Matrix Clock 2024, يوليو
Anonim
اردوينو نص التمرير على مدار الساعة
اردوينو نص التمرير على مدار الساعة

الغرض من هذا المشروع هو إنشاء ساعة نصية قابلة للتمرير تعرض الوقت كما يتم نطقه (على سبيل المثال ، "منتصف الليل").

هذا مشروع سريع - نقدم لك ما يكفي لبدء استخدام الأجهزة والرسم التخطيطي ، وبعد ذلك يمكنك المضي قدمًا في الأمر ليناسب احتياجاتك.

الخطوة 1: الأجهزة

المعدات
المعدات

ستحتاج إلى ثلاثة عناصر رئيسية -

  • لوحة متوافقة مع Arduino Uno
  • دائرة أو وحدة نمطية على مدار الساعة في الوقت الفعلي تستخدم إما DS1307 أو DS3231 IC
  • وشاشة LED أحادية اللون من طراز P10

قد تحتاج إلى مصدر طاقة خارجي ، لكننا سنصل إليه لاحقًا.

المرحلة الأولى هي ملاءمة ساعتك في الوقت الحقيقي. انقر هنا للحصول على البرنامج التعليمي إذا كنت بحاجة إلى مساعدة في ذلك.

الآن آمل أنك تفكر "كيف تحدد الوقت؟"

هناك إجابتان على هذا السؤال. إذا كنت تستخدم DS3231 ، فقم فقط بتعيينه في المخطط (انظر أدناه) حيث أن الدقة جيدة جدًا ، فأنت تحتاج فقط إلى تحميل المخطط مع الوقت الجديد مرتين في السنة لتغطية التوقيت الصيفي.

بخلاف ذلك ، أضف واجهة مستخدم بسيطة - يمكن لبضعة أزرار القيام بذلك. أخيرًا ، تحتاج فقط إلى وضع الأجهزة على الجزء الخلفي من DMD. هناك الكثير من المجال لتلبية احتياجاتك الخاصة ، قد يكون الحل البسيط هو محاذاة لوحة التحكم حتى تتمكن من الوصول إلى مقبس USB بسهولة - ثم التمسك به مع بعض Sugru.

فيما يتعلق بتشغيل الساعة - يمكنك تشغيل شاشة LED واحدة من Arduino ، وهي تعمل بسطوع جيد للاستخدام الداخلي. إذا كنت تريد تشغيل DMD بكامل سطوع شبكية العين ، فأنت بحاجة إلى استخدام مصدر طاقة منفصل 5V 4A DC. إذا كنت تستخدم اثنين من DMDs - فهذا يذهب إلى 8A ، وهكذا. ما عليك سوى توصيل الطاقة الخارجية بأطراف DMD واحدة (قم بتوصيل الثانية أو أكثر من DMDs بهذه المحطات الطرفية).

إذا كنت لا ترغب في قطع نهاية كابل مصدر الطاقة ، فاستخدم وصلة مقبس التيار المستمر.

الخطوة 2: رسم اردوينو

ستحتاج إلى تثبيت مكتبتي Arduino التاليتين - TimerOne و DMD. ثم قم بتحميل المخطط:

// لـ RTC # تتضمن "Wire.h" # تعريف DS1307_I2C_ADDRESS 0x68 // DS1307 RTC هو 0x68

// لشاشة LED

# تضمين "SPI.h" # تضمين "DMD.h" # تضمين "TimerOne.h" # تضمين "SystemFont5x7.h" # تضمين "Arial_black_16.h" # تعريف DISPLAYS_ACROSS 1 // يمكن أن يكون لديك أكثر من DMD واحد في row #define DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS ، DISPLAYS_DOWN) ؛

سلسلة finalString ؛ // تستخدم لعقد الجملة الأخيرة لعرضها على DMD

ScanDMD () باطل // مطلوب لـ DMD

{dmd.scanDisplayBySPI () ، }

الإعداد باطل()

{// لـ DMD Timer1.initialize (5000) ؛ Timer1.attachInterrupt (ScanDMD) ؛ dmd.clearScreen (صحيح) ؛

// لـ RTC

Wire.begin () ؛ // إطلاق I2C bus byte second، minutes، hour، dayOfWeek، dayOfMonth، month، year؛ // قم بتغيير المتغيرات وأزل التعليق عن setDateDs1307 لتعيين الوقت // ثم أعد التعليق على الوظيفة وتحميل المخطط مرة أخرى second = 0 ؛ الدقيقة = 13 ؛ الساعة = 23 ؛ dayOfWeek = 4 ؛ dayOfMonth = 19 ؛ الشهر = 5 ؛ السنة = 13 ؛ // setDateDs1307 (second، minutes، hour، dayOfWeek، dayOfMonth، month، year) ؛ }

// وظائف RTC المعتادة

// تحويل الأرقام العشرية العادية إلى ثنائي بايت decToBcd (قيمة بايت) {return ((val / 10 * 16) + (val٪ 10)) ؛ }

// تحويل ثنائي عشري مشفر إلى أرقام عشرية عادية

بايت bcdToDec (قيمة البايت) {return ((val / 16 * 10) + (val٪ 16)) ؛ }

setDateDs1307 باطلة (ثانية بايت ، // 0-59

بايت دقيقة ، // 0-59 بايت ساعة ، // 1-23 بايت يوم في الأسبوع ، // 1-7 بايت يوم في الشهر ، // 1-28 / 29 / بايت شهر ، // 1-12 بايت سنة) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS) ، Wire.write (0) ؛ Wire.write (decToBcd (ثانيًا)) ؛ يبدأ // 0 إلى بت 7 الساعة Wire.write (decToBcd (دقيقة)) ؛ Wire.write (decToBcd (ساعة)) ؛ Wire.write (decToBcd (dayOfWeek)) ؛ Wire.write (decToBcd (dayOfMonth)) ؛ Wire.write (decToBcd (شهر)) ؛ Wire.write (decToBcd (سنة)) ؛ Wire.write (00010000) ؛ // يرسل 0x10 (عرافة) 00010000 (ثنائي) للتحكم في السجل - يتحول إلى موجة مربعة Wire.endTransmission () ؛ }

// يحصل على التاريخ والوقت من ds1307

getDateDs1307 باطلة (بايت * ثانية ، بايت * دقيقة ، بايت * ساعة ، بايت * يوم من الأسبوع ، بايت * يوم شهر ، بايت * شهر ، بايت * سنة) {// إعادة تعيين مؤشر التسجيل Wire.beginTransmission (DS1307_I2C_ADDRESS) ؛ Wire.write (0) ؛ Wire.endTransmission () ؛

Wire.request From (DS1307_I2C_ADDRESS، 7) ؛

// يحتاج عدد قليل من هؤلاء إلى أقنعة لأن بعض البتات هي بتات تحكم

* الثانية = bcdToDec (Wire.read () & 0x7f) ؛ * دقيقة = bcdToDec (Wire.read ()) ؛ * ساعة = bcdToDec (Wire.read () & 0x3f) ؛ // تحتاج إلى تغيير هذا إذا كانت 12 ساعة صباحًا / مساءً * dayOfWeek = bcdToDec (Wire.read ()) ؛ * dayOfMonth = bcdToDec (Wire.read ()) ؛ * الشهر = bcdToDec (Wire.read ()) ؛ * السنة = bcdToDec (Wire.read ()) ؛ }

نص باطل (سلسلة قديمة)

{dmd.clearScreen (صحيح) ، dmd.selectFont (Arial_Black_16) ، char newString [256]؛ int sLength = oldString.length () ، oldString.toCharArray (newString، sLength + 1) ، dmd.drawMarquee (newString، sLength، (32 * DISPLAYS_ACROSS) -1، 0) ؛ بداية طويلة = مللي () ؛ مؤقت طويل = بدء ؛ مؤقت طويل 2 = بدء ؛ ret منطقي = خطأ ؛ while (! ret) {if ((timer + 20) <millis ()) {ret = dmd.stepMarquee (-1، 0)؛ الموقت = مللي () ؛ }}}

إنشاء نصوص باطلة (int hh، int mm)

// هذا يدمج كل بيانات الوقت في نص كجملة واحدة {finalString = ""؛ // مسح الجملة للحالات الخاصة (أدناه) finalString = finalString + "إنها" ؛

// أضف الساعة الآن

إذا (hh == 1 || hh == 13) {finalString = finalString + "one" ؛ } إذا (hh == 2 || hh == 14) {finalString = finalString + "two"؛ } إذا (hh == 3 || hh == 15) {finalString = finalString + "ثلاثة" ؛ } إذا (hh == 4 || hh == 16) {finalString = finalString + "أربعة" ؛ } إذا (hh == 5 || hh == 17) {finalString = finalString + "خمسة" ؛ } إذا (hh == 6 || hh == 18) {finalString = finalString + "ستة" ؛ } إذا (hh == 7 || hh == 19) {finalString = finalString + "سبعة" ؛ } إذا (hh == 8 || hh == 20) {finalString = finalString + "ثمانية" ؛ } إذا (hh == 9 || hh == 21) {finalString = finalString + "تسعة" ؛ } إذا (hh == 10 || hh == 22) {finalString = finalString + "عشرة" ؛ } إذا (hh == 11 || hh == 23) {finalString = finalString + "أحد عشر" ؛ }

// أضف الدقائق الآن

التبديل (مم) {الحالة 1: finalString = finalString + "أوه واحد" ؛ استراحة؛ الحالة 2: finalString = finalString + "يا اثنين" ؛ استراحة؛ الحالة 3: finalString = finalString + "يا ثلاثة" ؛ استراحة؛ الحالة 4: finalString = finalString + "يا أربعة" ؛ استراحة؛ الحالة 5: finalString = finalString + "يا خمسة" ؛ استراحة؛ الحالة 6: finalString = finalString + "يا ستة" ؛ استراحة؛ الحالة 7: finalString = finalString + "يا سبعة" ؛ استراحة؛ الحالة 8: finalString = finalString + "يا ثمانية" ؛ استراحة؛ الحالة 9: finalString = finalString + "يا تسعة" ؛ استراحة؛ الحالة 10: finalString = finalString + "عشرة" ؛ استراحة؛ الحالة 11: finalString = finalString + "أحد عشر" ؛ استراحة؛ الحالة 12: finalString = finalString + "twelve" ؛ استراحة؛ الحالة 13: finalString = finalString + "ثلاثة عشر" ؛ استراحة؛ الحالة 14: finalString = finalString + "أربعة عشر" ؛ استراحة؛ الحالة 15: finalString = finalString + "خمسة عشر" ؛ استراحة؛ الحالة 16: finalString = finalString + "sixteen" ؛ استراحة؛ الحالة 17: finalString = finalString + "سبعة عشر" ؛ استراحة؛ الحالة 18: finalString = finalString + "ثمانية عشر" ؛ استراحة؛ الحالة 19: finalString = finalString + "تسعة عشر" ؛ استراحة؛ الحالة 20: finalString = finalString + "عشرين" ؛ استراحة؛ الحالة 21: finalString = finalString + "واحد وعشرون" ؛ استراحة؛ الحالة 22: finalString = finalString + "اثنان وعشرون" ؛ استراحة؛ الحالة 23: finalString = finalString + "ثلاثة وعشرون" ؛ استراحة؛ الحالة 24: finalString = finalString + "أربعة وعشرون" ؛ استراحة؛ الحالة 25: finalString = finalString + "خمسة وعشرون" ؛ استراحة؛ الحالة 26: finalString = finalString + "ستة وعشرون" ؛ استراحة؛ الحالة 27: finalString = finalString + "سبعة وعشرون" ؛ استراحة؛ الحالة 28: finalString = finalString + "ثمانية وعشرون" ؛ استراحة؛ الحالة 29: finalString = finalString + "تسعة وعشرون" ؛ استراحة؛ الحالة 30: finalString = finalString + "الثلاثين" ؛ استراحة؛ الحالة 31: finalString = finalString + "واحد وثلاثون" ؛ استراحة؛ الحالة 32: finalString = finalString + "اثنان وثلاثون" ؛ استراحة؛ الحالة 33: finalString = finalString + "ثلاثة وثلاثون" ؛ استراحة؛ الحالة 34: finalString = finalString + "أربعة وثلاثون" ؛ استراحة؛ الحالة 35: finalString = finalString + "خمسة وثلاثون" ؛ استراحة؛ الحالة 36: finalString = finalString + "ستة وثلاثون" ؛ استراحة؛ الحالة 37: finalString = finalString + "سبعة وثلاثون" ؛ استراحة؛ الحالة 38: finalString = finalString + "ثمانية وثلاثون" ؛ استراحة؛ الحالة 39: finalString = finalString + "تسعة وثلاثون" ؛ استراحة؛ الحالة 40: finalString = finalString + "أربعون" ؛ استراحة؛ الحالة 41: finalString = finalString + "واحد وأربعون" ؛ استراحة؛ الحالة 42: finalString = finalString + "اثنان وأربعون" ؛ استراحة؛ الحالة 43: finalString = finalString + "ثلاثة وأربعون" ؛ استراحة؛ الحالة 44: finalString = finalString + "أربعة وأربعون" ؛ استراحة؛ الحالة 45: finalString = finalString + "خمسة وأربعون" ؛ استراحة؛ الحالة 46: finalString = finalString + "ستة وأربعون" ؛ استراحة؛ الحالة 47: finalString = finalString + "سبعة وأربعون" ؛ استراحة؛ الحالة 48: finalString = finalString + "ثمانية وأربعون" ؛ استراحة؛ الحالة 49: finalString = finalString + "تسعة وأربعون" ؛ استراحة؛ الحالة 50: finalString = finalString + "خمسون" ؛ استراحة؛ الحالة 51: finalString = finalString + "واحد وخمسون" ؛ استراحة؛ الحالة 52: finalString = finalString + "اثنان وخمسون" ؛ استراحة؛ الحالة 53: finalString = finalString + "ثلاثة وخمسون" ؛ استراحة؛ الحالة 54: finalString = finalString + "أربعة وخمسون" ؛ استراحة؛ الحالة 55: finalString = finalString + "خمسة وخمسون" ؛ استراحة؛ الحالة 56: finalString = finalString + "ستة وخمسون" ؛ استراحة؛ الحالة 57: finalString = finalString + "سبعة وخمسون" ؛ استراحة؛ الحالة 58: finalString = finalString + "ثمانية وخمسون" ؛ استراحة؛ الحالة 59: finalString = finalString + "تسعة وخمسون" ؛ استراحة؛ }

// منتصف النهار؟

إذا (hh == 12 && mm == 0) {finalString = finalString + "منتصف النهار" ؛ } // منتصف الليل؟ إذا (hh == 00 && mm == 0) {finalString = finalString + "منتصف الليل" ؛ }

}

حلقة فارغة()

{// احصل على الوقت من RTC بايت ثانية ، دقيقة ، ساعة ، dayOfWeek ، dayOfMonth ، شهر ، سنة ؛ getDateDs1307 (& second، & minutes، & hour، & dayOfWeek، & dayOfMonth، & month، & year) ؛

// تحويل الوقت إلى سلسلة جملة

createTextTime (ساعة ، دقيقة) ؛

// الآن أرسل النص إلى DMD

drawText (finalString) ، }

يحتوي المخطط على الوظائف المعتادة لتعيين واسترداد الوقت من DS1307 / 3232 في الوقت الحقيقي على مدار الساعة ، وكالعادة مع جميع ساعاتنا ، يمكنك إدخال معلومات الوقت في المتغيرات في الإعداد الباطل () ، ثم uncomment setDateDs1307 () ، قم بتحميل الرسم التخطيطي ، وأعد التعليق setDateDs1307 ، ثم قم بتحميل المخطط مرة أخرى. كرر هذه العملية لإعادة ضبط الوقت إذا لم تقم بإضافة أي واجهة مستخدم قائمة على الأجهزة.

الخطوه 3:

بمجرد استرداد الوقت في حلقة باطلة () ، يتم تمريره إلى الوظيفة createTextTime (). تنشئ هذه الوظيفة سلسلة نصية ليتم عرضها بالبدء بـ "إنها" ، ثم تحدد الكلمات التي يجب اتباعها اعتمادًا على الوقت الحالي. أخيرًا ، تقوم الوظيفة drawText () بتحويل السلسلة التي تحمل النص لعرضه إلى متغير حرف يمكن تمريره إلى DMD.

موصى به: