המבנה הבסיסי של תוכנית ארדואינו

כשפותחים את סביבת הפיתוח של ארדואינו, מוצג כברירת מחדל "שלד" קוד, עם המבנה הבסיסי של כל תוכנת ארדואינו "קלאסית" (מה שנקרא "Sketch"):

void setup() {
  // put your setup code here, to run once:
}

void loop() {
  // put your main code here, to run repeatedly:
}

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

הנה עוד כמה פרטים על הקוד שמופיע למעלה:

  • צירוף התווים “//” הוא סימן מוסכם להערה (comment) – כל מה שמימין לו הוא טקסט שמיועד אך ורק לקורא אנושי, והקומפיילר מתעלם ממנו לגמרי. שלד הקוד למעלה כולל שתי הערות כאלה, כדי להזכיר לנו איזה קוד עלינו לכתוב בתוך כל פונקציה, כפי שיוסבר מיד.
  • המילה void, בהקשר זה, פירושה שהפונקציה שמוגדרת מיד אחריה אינה מחזירה כל מידע לקוד שקרא לה.
  • המילים setup ו-loop הן השמות של הפונקציות. בתוכנה “קלאסית” לארדואינו, אנחנו חייבים לכלול שתי פונקציות עם השמות האלה בדיוק – אסור אפילו לשנות אותיות לרישיות (כך למשל, “Setup” לא תזוהה מכיוון שהאות הראשונה בשם שלה היא S רישית ולא s קטנה).
  • אחרי השמות מופיעים סוגריים ריקים (“()”). פירוש הדבר שהפונקציות האלה אינן מקבלות מידע מהקוד שקרא להן.
  • מיד לאחר הסוגריים הרגילים מופיעים סוגריים מסולסלים (“{ }”). אלה הם גבולות הגזרה של הפונקציה, ותוחמים את הקוד ששייך לה.

הפונקציה setup

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

הפונקציה loop

הפונקציה loop מופעלת מיד לאחר setup, ובניגוד אליה, loop רצה שוב ושוב במחזוריות (מכאן שמה – בעברית, “לולאה”). פונקציה זו למעשה מנהלת את הפעילות השוטפת של תוכנת הארדואינו: בדיקה של סוגי קלט שונים ותגובה להם, תזמון של פעולות אוטומטיות וכל דבר אחר שתרצו.

setup ו-loop בהקשר רחב יותר

כפי שצוין למעלה, פונקציה היא קטע קוד שקוראים לו ממקום אחר. אם כך, איזה קוד קורא ל-setup ול-loop בתוכנית למעלה? בתוכנות רגילות בשפת C++, חובה להגדיר פונקציה אחת בשם main. זוהי הפונקציה הראשונה שרצה (ההרצה שלה מתחילה אוטומטית), וממנה נובעות ישירות או בעקיפין כל הקריאות לפונקציות אחרות.

כאשר כותבים קוד לארדואינו ומקמפלים אותו, רגע לפני הקימפול, סביבת הפיתוח מבצעת פעולה נוספת: “שתילת” הפונקציות loop ו-setup מה-Sketch בתוך קוד C++ תקני מוכן מראש. שם כבר מוגדרת פונקציית main הדרושה, שקוראת פעם אחת ל-setup, ולאחר מכן נכנסת ללולאה אינסופית שקוראת ל-loop שוב ושוב.

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

קישורים רלוונטיים

בלוג אישי בנושאי מייקינג, תכנות, מיקרו-בקרים ואלקטרוניקה