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

שעון דיגיטלי על Arduino באמצעות מכשיר סופי: 6 שלבים
שעון דיגיטלי על Arduino באמצעות מכשיר סופי: 6 שלבים

וִידֵאוֹ: שעון דיגיטלי על Arduino באמצעות מכשיר סופי: 6 שלבים

וִידֵאוֹ: שעון דיגיטלי על Arduino באמצעות מכשיר סופי: 6 שלבים
וִידֵאוֹ: קלט אנלוגי - מבוא למערכות משובצות מחשב (ארדואינו) | הנדסת אלקטרוניקה ומחשבים לכיתות י,יא,יב 2024, נוֹבֶמבֶּר
Anonim
שעון דיגיטלי על Arduino באמצעות מכונת מדינה סופית
שעון דיגיטלי על Arduino באמצעות מכונת מדינה סופית

היי, אני הולך להראות לך כיצד ניתן ליצור שעון דיגיטלי בעזרת YAKINDU Statechart Tools ולהריץ על Arduino, שמשתמש במגן לוח מקשים LCD.

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

"[…] הרחבה רחבה של הפורמליזם המקובל של מכונות המדינה ותרשימי המדינה."

במאמר זה הוא השתמש בדוגמת השעון הדיגיטלי למחקר שלו. השתמשתי בו כהשראה ובניתי מחדש את השעון עם YAKINDU Statechart Tools (כלי ליצירת מודלים גרפיים של מכונות מדינה וליצור איתו קוד C/C ++) והחזרתי אותו לחיים על Arduino.

אספקה

חוּמרָה:

  • Arduino Uno או Mega
  • מגן לוח מקשים LCD

תוֹכנָה:

  • כלי סטטרט של YAKINDU
  • Eclipse C ++ IDE עבור Arduino

שלב 1: כיצד פועל השעון הדיגיטלי

Image
Image

נתחיל בהגדרת אופן הפעולה של השעון הדיגיטלי. אתה זוכר את אלה … נניח … שעונים דיגיטליים "מגניבים במיוחד" שלכולם היו בשנות ה -90? שעון עצר משולב, אזעקות שונות והצפצוף המעצבן שלו כל שעה שלמה. אם לא, תסתכל: שעון דיגיטלי משנות ה -90.

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

  • הצג את השעה (שעון)
  • הצג את התאריך (תאריך)
  • הגדר את האזעקה (אזעקה 1, אזעקה 2)
  • הפעל/השבת פעמון (הגדר פעמון)
  • השתמש בשעון העצור (Stop Watch)

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

יתר על כן, יש צלצול שנשמע כל שעה מלאה ותאורה אחורית ניתנת לשליטה. בשלב הראשון לא חיברתי אותם לארדואינו.

שלב 2: מכונת המדינה

מגן לוח מקשים LCD
מגן לוח מקשים LCD

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

המודל מחולק לשני חלקים - גרפי וטקסטואלי. בחלק הטקסטואלי יוגדרו האירועים, המשתנים וכו '. בחלק הגרפי - תרשים המצב - מצוין הביצוע הלוגי של המודל. כדי ליצור מכונת מדינה, שממלאת את ההתנהגות שצוין, יש צורך באירועי קלט מסוימים, שניתן להשתמש בהם במודל: onoff, set, mode, light ו- light_r. בתוך סעיף ההגדרה נעשה שימוש באירוע פנימי, המגדיל את ערך הזמן כל 100 אלפיות השנייה:

כל 100 ms / זמן += 1

בהתבסס על שלבי 100 ms הזמן הנוכחי יחושב בתבנית HH: MM: SS:

display.first = (זמן / 36000) % 24;

display.second = (time / 600) % 60; display.third = (time / 10) % 60;

הערכים יחוברו לתצוגת ה- LCD באמצעות עדכון הפעולה LCD בכל פעם שיקראו למכשיר המדינה:

display.updateLCD (display.first, display.second, display.third, display.text)

הביצוע הבסיסי של מכונת המדינה כבר מוגדר בסעיף כיצד פועל השעון הדיגיטלי. בתוך הכלי השתמשתי בכמה רכיבי דוגמנות "מיוחדים" כמו CompositeState, History, Sub-Diagrams, ExitNodes וכו '. ניתן למצוא תיאור מפורט במדריך למשתמש.

שלב 3: מגן לוח מקשים LCD

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

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

#כלול "Arduino.h"

#include "LiquidCrystal.h" LiquidCrystal lcd (8, 9, 4, 5, 6, 7); הגדרת חלל () {lcd.begin (16, 2); lcd.setCursor (0, 0); lcd.write ("ערך נמדד"); } לולאת חלל () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); עיכוב (200); }

אלה התוצאות הנמדדות שלי:

  • אף אחד: 1023
  • בחר: 640
  • משמאל: 411
  • למטה: 257
  • למעלה: 100
  • מימין: 0

עם ספים אלה אפשר לקרוא את הכפתורים:

#define NONE 0 #להגדיר SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define RIGHT 5 static int readButton () {int result = 0; result = analogRead (0); אם (תוצאה <50) {החזר ימינה; } if (תוצאה <150) {return UP; } if (תוצאה <300) {return DOWN; } if (תוצאה <550) {return LEFT; } if (תוצאה <850) {return SELECT; } החזר NONE; }

שלב 4: ממשק מכונת המדינה

ממשק מכונת המדינה
ממשק מכונת המדינה

קוד C ++ שנוצר של מכונת המדינה מספק ממשקים, אותם יש ליישם כדי לשלוט במכשיר המדינה. השלב הראשון הוא חיבור אירועי in עם המקשים של מגן המקלדות. כבר הראיתי כיצד לקרוא את הכפתורים, אך לצורך התממשקותם למכשיר המדינה, יש צורך בהפחתת הכפתורים - אחרת האירועים יועלו מספר פעמים, מה שמוביל להתנהגות בלתי צפויה. הרעיון של הורדת תוכנות אינו חדש. תוכל לעיין בתיעוד של Arduino.

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

int oldState = NONE; static void raiseEvents () {int buttonPressed = readButton (); עיכוב (80); oldState = buttonPressed; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> raise_mode (); לשבור; } מקרה LEFT: {stateMachine-> getSCI_Button ()-> raise_set (); לשבור; } מקרה למטה: {stateMachine-> getSCI_Button ()-> raise_light (); לשבור; } מקרה UP: {stateMachine-> getSCI_Button ()-> raise_light_r (); לשבור; } מקרה נכון: {stateMachine-> getSCI_Button ()-> raise_onoff (); לשבור; } ברירת מחדל: {הפסקה; }}}}

שלב 5: חיבור דברים ביחד

התוכנית הראשית משתמשת בשלושה חלקים:

  • מכונת המדינה
  • טיימר
  • מטפל לתצוגה (הדפסת lcd אופיינית (…))

DigitalWatch* stateMachine = DigitalWatch חדש (); CPPTimerInterface* timer_sct = חדש CPPTimerInterface (); DisplayHandler* displayHandler = DisplayHandler חדש ();

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

הגדרת void () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> enter (); }הלולאה עושה שלושה דברים:

  • העלה אירועי קלט
  • חשב את הזמן שחלף ועדכן את הטיימר
  • התקשר למכשיר המדינה

long_time_time = 0; long last_cycle_time = 0; לולאת void () {raiseEvents (); שעון_אחרון_זמן = זמן_זמן; current_time = מיליס (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }

שלב 6: קבל את הדוגמה

זהו זה. כנראה שלא ציינתי כל פרט ביישום, אך תוכל להציץ בדוגמה או להשאיר הערה.

הוסף את הדוגמה ל- IDE פועל עם: קובץ -> חדש -> דוגמה -> דוגמאות ל- YAKINDU Statechart -> הבא -> Arduino -שעון דיגיטלי (C ++)

> אתה יכול להוריד את ה- IDE כאן <<

אתה יכול להתחיל בניסיון של 30 יום. לאחר מכן, עליך לקבל רישיון, שהוא בחינם לשימוש לא מסחרי!

מוּמלָץ: