הפעם נבנה שעון דיגיטלי מעורר על מטריצה ונעביר אותו אחר כך ללוח הלחמה חצי קבוע. כדי לעבוד עם ה מיקרו-בקר ATmega328 ללא ארדואינו ולהרגיש איתו בנוח צריך לעשות כמה שיותר פרויקטים, וזו הזדמנות טובה לעשות פרויקט של שעון דיגיטלי מעורר.
רכיבי הפרויקט:
- בקר ATmega328
- מודול שעון זמן אמת RTC 1320
- תצוגת מקטעים 4 ספרות דיגיטלית seven segment
- כפתור לחיצה
- לוח הלחמה חצי קבוע
- תושבת מעגל משולב DIP28
- נורת לד
- זמזם
תכנון הפרויקט
קודם כל נבנה אבטיפוס על מטריצה ונתכנת את הארדואינו להפעיל אותו, ואחרי שנהיה בטוחים שהקוד עובד נעביר את המעגל אל לוח הלחמה ונתכנת את הבקר.
הרכיב העיקרי במעגל הוא תצוגת 4 הספרות. יש כל מיני גרסאות לרכיב הזה אבל זה שאני עובד איתו הוא הפשוט ביותר ויש לו סך הכל 12 רגליים שזה המיפוי שלהם:
D1, D2, D3, D4 הם הרגליים שמפעילות את הספרות. כל שאר הרגליים מפעילות את שבעת המקטעים של כל ספרה.
חיווטים וקוד
אפשר לכתוב קוד שמפעיל מקטעים וספרות בצורה ידנית אבל הרבה יותר נוח במקרה הזה להשתמש בספריית ארדואינו sevseg.
בספריה הזו מכניסים את הרגליים בהם משתמשים ואז אפשר לרשום מספר שיוצג על הלוח וגם לנקות אותו. לפי הספריה אלו החיבורים שצריך לבצע:
D1 – פין 2 בארדואינו
D2 – פין 3 בארדואינו
D3 – פין 4 בארדואינו
D4 – פין 5 בארדואינו
A – פין 6 בארדואינו
B – פין 7 בארדואינו
C – פין 8 בארדואינו
D – פין 9 בארדואינו
E – פין 10 בארדואינו
F – פין 11 בארדואינו
G – פין 12 בארדואינו
decimal – פין 13 בארדואינו
ככה הברדק הזה נראה על מטריצה. קשה לראות בתמונה אבל יש גם מודול RTC שמחובר ל SCL/SDA בארדואינו ועובד על בטריה cr2025 וגם נורת לד וכפתור.
זהו הקוד שמפעיל את המעגל… התצוגה מראה את השעה כל הזמן, ברגע שלוחצים על הכפתור הוא נכנס למצב של שעון מעורר ומפעיל זמזם ב 7:30 בבוקר, ולחיצה נוספת מכבה את הזמזם.
#include <Wire.h> #include "RTClib.h" #include <SevSeg.h> RTC_DS1307 rtc; SevSeg sevseg; bool button = false; // state of alarm button String current_time; // string of current time void setup(){ pinMode(A0, INPUT_PULLUP); // button. pull up to 5V pinMode(A1, OUTPUT); // led pinMode(A2, OUTPUT); // buzzer rtc.begin(); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); byte numDigits = 4; byte digitPins[] = {2, 3, 4, 5};// Digits: 1,2,3,4 byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13}; //Segments: A,B,C,D,E,F,G,Period sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins); sevseg.setBrightness(90); } void loop(){ DateTime t = rtc.now(); // get the time from rtc if (t.minute() < 10){ // if minute is single digit, add zero before current_time = String(t.hour()) + '0' + String(t.minute()); } else{ current_time = String(t.hour()) + String(t.minute()); // convert time to string and add } static byte decPlace = 2; // where to put the decimal point sevseg.setNumber(current_time.toInt(),decPlace); // convert back to int and show on display sevseg.refreshDisplay(); // Must run repeatedly; don't use blocking code if (digitalRead(A0) == LOW){ // if button is pressed button = !button; // toggle button state delay(200); // this is bad but we need to debounce the button } if (button){ // turn led on/off when button pressed digitalWrite(A1, HIGH); } else{ digitalWrite(A1, LOW); } if (button && t.hour() == 7 && t.minute() == 30){ // if button state is on, and 7:30 in morning make alarm tone(A2, 500, 10000); } }
הלחמה ללוח פרמה-פרוטו
עכשיו אחרי שראינו שהקוד עובד אפשר להעביר את כל הרכיבים ללוח ההלחמה החצי קבוע:
הלוח הזה שנקרא פרמה-פרוטו מתפקד בדיוק כמו מטריצה לכן נוח להעביר אליו את הרכיבים. עכשיו אפשר להתחיל להלחים אותם בגב הלוח.
את כל החיבורים בין הרכיבים אפשר לעשות על ידי חוטים קצרים/ מגשרים רק להיות בטוחים שהחיבורים הם כמו שצריך כי כשמלחימים מאחורה כל הרכיבים הפוכים כמו מראה.
זהו להיום, אפשר לראות שתוך שעה ניתן לבנות שעון דיגיטלי שהוא גם שעון מעורר ואפילו לתכנת אותו לזמזם בשעות מסוימות, אם אחרי כמה זמן לא מרוצים מהתוצאה אפשר תמיד לחבר לבקר RX, TX, RESET ולתכנת אותו כשהוא על המעגל.
ככה נראה השעון הדיגיטלי הסופי כשהוא מקובע לארון קיר: