תוכן עניינים:

שעון טקסט לגלילה Arduino: 3 שלבים
שעון טקסט לגלילה Arduino: 3 שלבים

וִידֵאוֹ: שעון טקסט לגלילה Arduino: 3 שלבים

וִידֵאוֹ: שעון טקסט לגלילה Arduino: 3 שלבים
וִידֵאוֹ: CS50 2015 - Week 8, continued 2024, יולי
Anonim
שעון טקסט לגלילה Arduino
שעון טקסט לגלילה Arduino

מטרתו של פרויקט זה היא לבנות שעון טקסט גלילה המציג את השעה כשהיא נאמרת (למשל, "זה חצות").

זהו פרויקט מהיר - אנו נותנים לך מספיק כדי לצאת לדרך עם החומרה והסקיצה, ולאחר מכן תוכל לקחת אותו רחוק יותר בהתאם לצרכיך.

שלב 1: חומרה

חוּמרָה
חוּמרָה

תזדקק לשלושה פריטים עיקריים -

  • לוח Arduino Uno תואם
  • מעגל או מודול שעון בזמן אמת באמצעות DS1307 או DS3231 IC
  • ותצוגת LED בסגנון P10 מונוכרום

אולי תרצה ספק כוח חיצוני, אבל נגיע לזה בהמשך.

השלב הראשון הוא התאמת השעון בזמן אמת שלך. לחץ כאן להדרכה אם אתה זקוק לעזרה בנושא.

בינתיים אני מקווה שאתה חושב "איך אתה קובע את הזמן?".

לשאלה זו יש שתי תשובות. אם אתה משתמש ב- DS3231 פשוט הגדר אותו בסקיצה (ראה להלן) מכיוון שהדיוק טוב מאוד, עליך רק להעלות את הסקיצה עם הזמן החדש פעמיים בשנה כדי לכסות חיסכון בשעות הקיץ.

אחרת הוסף ממשק משתמש פשוט-כמה כפתורים יכולים לעשות זאת. לבסוף אתה רק צריך לשים את החומרה בחלק האחורי של ה- DMD. יש מספיק מקום לענות על הצרכים שלך. פתרון פשוט עשוי להיות יישור לוח הבקרה כך שתוכל לגשת בקלות לשקע ה- USB - ואז להדביק אותו עם סוגר.

בכל הנוגע להפעלת השעון - אתה יכול להריץ תצוגת LED אחת מהארדואינו והיא פועלת בהירות טובה לשימוש פנימי. אם אתה רוצה שה- DMD יפעל במלוא הבהירות הבוערת ברשתית, עליך להשתמש באספק כוח נפרד של 5V 4A DC. אם אתה משתמש בשני DMDs - זה עובר ל 8A וכן הלאה. כל שעליך לעשות הוא לחבר את הכוח החיצוני למסופי DMD אחד (חבר את ה- DMD השני או יותר למסופים אלה).

אם לא בא לך לקצץ את קצה כבל אספקת החשמל, השתמש בפריצת שקע DC.

שלב 2: סקיצת הארדואינו

יהיה עליך להתקין את שתי ספריות Arduino הבאות - TimerOne ו- DMD. לאחר מכן העלה את המערכון:

// עבור RTC #כוללים "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // DS1307 RTC הוא 0x68

// לתצוגת LED

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // אתה יכול לקבל יותר מ- DMD אחד ב- שורה #define DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

מחרוזת finalString; // משמש להחזיק משפט אחרון להצגה ב- DMD

void ScanDMD () // נדרש ל- DMD

{dmd.scanDisplayBySPI (); }

הגדרת חלל ()

{// עבור DMD Timer1.initialize (5000); Timer1.attachInterrupt (ScanDMD); dmd.clearScreen (נכון);

// עבור RTC

Wire.begin (); // להפעיל בתים של אוטובוס I2C שנייה, דקה, שעה, dayOfWeek, dayOfMonth, חודש, שנה; // לשנות את המשתנים ולבטל את התגובה של setDateDs1307 כדי להגדיר את השעה // ואז להגיב מחדש על הפונקציה ולהעלות את המערכון שוב שני = 0; דקה = 13; שעה = 23; dayOfWeek = 4; dayOfMonth = 19; חודש = 5; שנה = 13; // setDateDs1307 (שנייה, דקה, שעה, dayOfWeek, dayOfMonth, חודש, שנה); }

// פונקציות RTC רגילות

// המרת מספרים עשרוניים תקינים ל- byte decimal byte decToBcd (byte val) {return ((val/10*16) + (val%10)); }

// המר את העשרוני המקודד בינארי למספרים עשרוניים רגילים

byte bcdToDec (byte val) {return ((val/16*10) + (val%16)); }

void setDateDs1307 (בייט שני, // 0-59

דקה בתים, // 0-59 בייט שעה, // 1-23 בתים dayOfWeek, // 1-7 בתים dayOfMonth, // 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 (hex) 00010000 (בינארי) לבקרת הבקרה - מדליק Wire.endTransmission (); }

// מקבל את התאריך והשעה מה- ds1307

void getDateDs1307 (בייט *שנייה, בייט *דקה, בייט *שעה, בייט *dayOfWeek, בייט *dayOfMonth, בת *חודש, בייט *שנה) {// אפס את מצביע הרישום Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// כמה מהם זקוקים למסכות מכיוון שסיביות מסוימות הן סיביות שליטה

*second = bcdToDec (Wire.read () & 0x7f); *דקה = bcdToDec (Wire.read ()); *שעה = bcdToDec (Wire.read () & 0x3f); // צריך לשנות זאת אם 12 שעות/אחר הצהריים *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *חודש = bcdToDec (Wire.read ()); *year = bcdToDec (Wire.read ()); }

void drawText (מחרוזת oldString)

{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 boolean = false; while (! ret) {if ((טיימר+20) <millis ()) {ret = dmd.stepMarquee (-1, 0); טיימר = מיליס (); }}}

void createTextTime (int hh, int mm)

// זה מרסס את כל הזמן נתונים לטקסט כמשפט אחד {finalString = ""; // מחקו את המשפט למקרים מיוחדים (להלן) finalString = finalString+"זה";

// עכשיו הוסף את השעה

אם (hh == 1 || hh == 13) {finalString = finalString+"אחד"; } אם (hh == 2 || hh == 14) {finalString = finalString+"שניים"; } אם (hh == 3 || hh == 15) {finalString = finalString+"שלוש"; } אם (hh == 4 || hh == 16) {finalString = finalString+"ארבע"; } אם (hh == 5 || hh == 17) {finalString = finalString+"חמש"; } if (hh == 6 || hh == 18) {finalString = finalString+"שש"; } אם (hh == 7 || hh == 19) {finalString = finalString+"שבעה"; } if (hh == 8 || hh == 20) {finalString = finalString+"שמונה"; } if (hh == 9 || hh == 21) {finalString = finalString+"תשע"; } אם (hh == 10 || h == 22) {finalString = finalString+"עשר"; } אם (hh == 11 || h == 23) {finalString = finalString+"eleven"; }

// עכשיו הוסיפו את הדקות

מתג (מ"מ) {מקרה 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+"eleven"; לשבור; מקרה 12: finalString = finalString+"שנים עשר"; לשבור; מקרה 13: finalString = finalString+"שלוש עשרה"; לשבור; מקרה 14: finalString = finalString+"fourteen"; לשבור; מקרה 15: finalString = finalString+"fifteen"; לשבור; מקרה 16: finalString = finalString+"sixteen"; לשבור; מקרה 17: finalString = finalString+"שבע עשרה"; לשבור; מקרה 18: finalString = finalString+"eighteen"; לשבור; מקרה 19: finalString = finalString+"nineteen"; לשבור; מקרה 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+"חמישים ותשע"; לשבור; }

// צהריים?

if (hh == 12 && mm == 0) {finalString = finalString+"צהריים"; } // חצות? if (hh == 00 && mm == 0) {finalString = finalString+"חצות"; }

}

לולאת חלל ()

{// קבל את הזמן מבייט ה- RTC שנייה, דקה, שעה, dayOfWeek, dayOfMonth, חודש, שנה; getDateDs1307 (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year);

// להמיר את הזמן למחרוזת משפטים

createTextTime (שעה, דקה);

// עכשיו שלח את הטקסט ל- DMD

drawText (finalString); }

הסקיצה כוללת את הפונקציות הרגילות לקביעת ושחזור הזמן מ- DS1307/3232 ICs בזמן אמת, וכרגיל עם כל השעונים שלנו תוכל להזין את נתוני השעה במשתנים בהתקנת void (), ולאחר מכן לבטל את התגובה setDateDs1307 (), העלה את הסקיצה, הערה מחדש setDateDs1307, ולאחר מכן העלה את הסקיצה פעם נוספת. חזור על התהליך כדי להגדיר מחדש את הזמן אם לא הוספת ממשק משתמש מבוסס חומרה.

שלב 3:

לאחר אחזור הזמן בלולאת void (), הוא מועבר לפונקציה createTextTime (). פונקציה זו יוצרת את מחרוזת הטקסט להצגה על ידי התחלת "זה" ולאחר מכן קובעת אילו מילים יש לעקוב בהתאם לזמן הנוכחי. לבסוף הפונקציה drawText () ממירה את המחרוזת המחזיקה את הטקסט להצגה למשתנה תווים שניתן להעביר ל- DMD.

מוּמלָץ: