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

שעון בזמן אמת עם ארדואינו: 3 שלבים
שעון בזמן אמת עם ארדואינו: 3 שלבים

וִידֵאוֹ: שעון בזמן אמת עם ארדואינו: 3 שלבים

וִידֵאוֹ: שעון בזמן אמת עם ארדואינו: 3 שלבים
וִידֵאוֹ: בקר התחלה-עצירה אוטומטי עם שעון זמן אמת DS3231 2024, נוֹבֶמבֶּר
Anonim
שעון בזמן אמת עם ארדואינו
שעון בזמן אמת עם ארדואינו

בפרויקט זה נכין שעון בעזרת מודול ה- Arduino ו- RTC. כפי שאנו יודעים Arduino לא יכול להציג את הזמן בפועל ולכן נשתמש במודול RTC כדי להציג את השעה הנכונה על ה- LCD. קרא את כל השלב בעיון זה יעזור לך מאוד לבצע את השעון.

קוד DS3231 Arduino דומה לקוד DS1307 והוא עובד עם שני שבבי RTC.

קוד Arduino מתחת אינו משתמש בספרייה כלשהי עבור ה- DS3231 RTC, ספריית ה- Wire נועדה להתכתבות בין Arduino ל- DS3231 תוך ניצול מוסכמת I2C.

כֵּן! מהנדסי אלקטרוניקה רבים תלויים בכך לפרויקטים המבוססים על הזמן שלהם, אך RTC אינו אמין לחלוטין. הוא מופעל באמצעות סוללה ויש להחליפו בהקדם או במאוחר. כשהיא מגיעה לפרויקטים של IoT היא תופסת סיכות SPI יקרות (ממשק היקפי סידורי) יקרות ומתבלבלת עם חוטים סבוכים. פתרון … כאן מגיע NTP הגיבור שלנו (פרוטוקול זמן רשת). NTP כל כך מדויק מכיוון שהוא מקבל זמן מהאינטרנט. אנו הולכים להפעיל פרוטוקול זה באמצעות מצב שרת-לקוח. התהליך כל כך פשוט שה- Nodemcu שלנו מתפקד כלקוח ומבקש מנות NTP מהשרת באמצעות UDP. בתמורה, השרת שולח חבילה ללקוח אשר מנתחת את הנתונים. NTP הוא פרוטוקול סנכרון הזמן האוניברסלי. עכשיו תן לנו להאיר את תחנת העבודה במעבדות שלנו

שלב 1: רכיבים נדרשים

  • לוח ארדואינו
  • לוח RTC DS3231
  • מסך LCD בגודל 16x2
  • כפתור לחיצה 2x
  • נגד משתנה של 10K אוהם (או פוטנציומטר)
  • נגד 330 אוהם
  • סוללת תא מטבע 3V
  • לוח לחם
  • חוטי מגשר

Mocule RTC DS3231

זמן הוא תחושה חיונית הנדרשת בעולם המהיר של בני האדם. בפרויקט בזמן אמת

אנו משתמשים ב- RTC (שעון בזמן אמת)

שעון בזמן אמת (RTC) הוא מעגל משולב (IC) העוקב אחר הזמן הנוכחי. RTC דואג לזמן במצב אמיתי. RTC נמצא בדרך כלל בלוחות אם של מחשבים ומערכות משובצות כדי לדרוש גישה בזמן.

שלב 2: חיבור של שעון Arduino

חיבור של שעון ארדואינו
חיבור של שעון ארדואינו
  • חבר את פין SCL למודול RTC ל- Arduino A5
  • חבר את סיכת SDA למודול RTC ל- Arduino A4
  • חבר את VCC TO 5v ו- GND ל- GND
  • חבר כפתור לחיצה לסיכה 8
  • חבר כפתור לחיצה נוסף לסיכה 9
  • חבר RS של LCD לסיכה 2 של Arduino
  • חבר E של LCD לסיכה 3 של Arduino
  • חבר D7 של LCD לסיכה 7 של Arduino
  • חבר D6 של LCD לסיכה 6 של Arduino
  • חבר D5 של LCD לסיכה 5 של Arduino
  • חבר D4 של LCD לסיכה 4 של Arduino
  • חבר VSS & K ל- GND
  • חבר VDD & A ל- 5v
  • חבר את Vo לסיכת הפלט של הפוטנציומטר

שלב 3: קוד לשעון Arduino עם RTC

קוד לשעון Arduino עם RTC
קוד לשעון Arduino עם RTC

ה- DS3231 עובד עם פורמט BCD בלבד וכדי להמיר את ה- BCD לעשרוני ולהיפך השתמשתי בשתי השורות למטה (דוגמה לדקה): // המר BCD לדקה -דקה = (דקה >> 4) * 10 + (דקה & 0x0F);

// המרת עשרוני ל- BCDminute = ((דקה / 10) << 4) + (דקה % 10); void DS3231_display (): מציג זמן ולוח שנה, לפני הצגת זמן ונתוני לוח שנה מומרים מ- BCD לפורמט עשרוני. בטל blink_parameter ():

// שעון ולוח שנה בזמן אמת עם לחצני הגדרות באמצעות DS3231 ו- Arduino // כולל קוד ספריית LCD #כלול // כולל קוד ספריית Wire (יש צורך בהתקני פרוטוקול I2C) #כולל // חיבורי מודול LCD (RS, E, D4, D5, D6, D7) LiquidCrystal lcd (2, 3, 4, 5, 6, 7); הגדרת חלל () {pinMode (8, INPUT_PULLUP); // כפתור 1 מחובר לסיכה 8 pinMode (9, INPUT_PULLUP); // כפתור 2 מחובר לסיכה 9 // הגדר את מספר העמודות והשורות של ה- LCD l.d.begin (16, 2); Wire.begin (); // הצטרף לאוטובוס i2c} char Time = "TIME:::"; char Calendar = "DATE: / / 20"; בת i, שנייה, דקה, שעה, תאריך, חודש, שנה; void DS3231_display () {// המרת BCD לשנייה עשרונית = (שנייה >> 4) * 10 + (שנייה & 0x0F); דקה = (דקה >> 4) * 10 + (דקה & 0x0F); שעה = (שעה >> 4) * 10 + (שעה & 0x0F); date = (תאריך >> 4) * 10 + (תאריך & 0x0F); חודש = (חודש >> 4) * 10 + (חודש & 0x0F); year = (year >> 4) * 10 + (year & 0x0F); // זמן המרת סיום [12] = % 10 + 48 השני; זמן [11] = שני / 10 + 48; זמן [9] = דקה % 10 + 48; זמן [8] = דקה / 10 + 48; זמן [6] = שעה % 10 + 48; זמן [5] = שעה / 10 + 48; לוח שנה [14] = שנה % 10 + 48; לוח שנה [13] = שנה / 10 + 48; לוח שנה [9] = חודש % 10 + 48; לוח שנה [8] = חודש / 10 + 48; לוח שנה [6] = תאריך % 10 + 48; לוח שנה [5] = תאריך / 10 + 48; lcd.setCursor (0, 0); lcd.print (זמן); // זמן תצוגה lcd.setCursor (0, 1); lcd.print (לוח שנה); // הצג לוח שנה} חלל blink_parameter () {בתים j = 0; while (j 23) // if hours> 23 ==> hours = 0 parameter = 0; if (i == 1 && פרמטר> 59) // אם דקות> 59 ==> דקות = 0 פרמטר = 0; if (i == 2 && פרמטר> 31) // אם תאריך> 31 ==> תאריך = פרמטר אחד = 1; if (i == 3 && פרמטר> 12) // אם חודש> 12 ==> חודש = פרמטר אחד = 1; if (i == 4 && parameter> 99) // If year> 99 ==> year = 0 parameter = 0; sprintf (טקסט, "%02u", פרמטר); lcd.setCursor (x, y); lcd.print (טקסט); עיכוב (200); // המתן 200 ms} lcd.setCursor (x, y); lcd.print (""); // הצג שני רווחים blink_parameter (); sprintf (טקסט, "%02u", פרמטר); lcd.setCursor (x, y); lcd.print (טקסט); blink_parameter (); אם (! digitalRead (8)) {// אם לחצן (סיכה מספר 8) נלחץ i ++; // הגדלת 'i' עבור פרמטר ההחזר של הפרמטר הבא; // החזר ערך פרמטר ויציאה}}} לולאת void () {אם (! DigitalRead (8)) {// אם לחצן (סיכה מספר 8) נלחץ i = 0; שעה = עריכה (5, 0, שעה); דקה = עריכה (8, 0, דקה); תאריך = עריכה (5, 1, תאריך); חודש = עריכה (8, 1, חודש); שנה = עריכה (13, 1, שנה); // המרת עשרוני לדקה BCD = ((דקה / 10) << 4) + (דקה % 10); שעה = ((שעה / 10) << 4) + (שעה % 10); תאריך = ((תאריך / 10) << 4) + (תאריך % 10); חודש = ((חודש / 10) << 4) + (חודש % 10); year = ((year / 10) << 4) + (year % 10); // סיום המרה // כתוב נתונים ל- DS3231 RTC Wire.beginTransmission (0x68); // התחל פרוטוקול I2C עם כתובת DS3231 Wire.write (0); // שלח כתובת רישום Wire.write (0); // אפס שומשים והפעל את המתנד Wire.write (דקה); // כתוב Wire.write דקה (שעה); // כתוב Wire.write שעה (1); // כתוב יום (לא בשימוש) Wire.write (תאריך); // כתוב תאריך Wire.write (חודש); // כתוב חודש Wire.write (שנה); // כתוב שנה Wire.endTransmission (); // עצור את השידור ושחרר את עיכוב האוטובוס I2C (200); // המתן 200 ms} Wire.beginTransmission (0x68); // התחל פרוטוקול I2C עם כתובת DS3231 Wire.write (0); // שלח כתובת רישום Wire.endTransmission (שקר); // הפעלה מחדש של I2C Wire.requestFrom (0x68, 7); // בקש 7 בתים מ- DS3231 ושחרר אוטובוס I2C בסוף קריאה שנייה = Wire.read (); // קרא שניות מהרשום 0 דקות = Wire.read (); // קראו פרוטוקולים מהרשם שעה אחת = Wire.read (); // קרא שעה מרשם 2 Wire.read (); // קריאת היום מהרשום 3 (לא בשימוש) תאריך = Wire.read (); // קרא תאריך מהרשום 4 חודשים = Wire.read (); // קרא חודש מהחודש 5 = Wire.read (); // קרא את השנה מהרשום 6 DS3231_display (); // זמן דיאפליי ועיכוב לוח שנה (50); // חכה 50 ms}

מוּמלָץ: