קלט דיגיטלי ב-Pi Pico עם ג׳אווהסקריפט

קבלת קלט דיגיטלי עם אירוע וכמה דוגמאות.

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

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

איך אני יודע שחיישן תומך בדיגיטלי או אנלוגי? אני מסתכל על גב החיישן. יש שם + ו- (למתח, שמפעיל את החיישן) ואז פין שיש עליו DO. שזה אומר Digital Output. לפעמים יש AO שזה Analog Output שגם בזה אפשר להשתמש אבל אני לא מלמד על זה בפוסט הזה (בפוסטים הבאים כן).

הפינים בחיישן הלחות - יש DO ו-AO - אנו צריכים לחבר ל-DO.

החיבור הוא פשוט. את ה-+ אני אחבר לפין שיש בו מתח (36), את ה– אני אחבר לגראונד (38) ואת ה-DO לאחד ה-GPIO שיש, אני מאוד אוהב את GP28 שמספרו הוא 34.

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

pinMode(28, INPUT); 

// Callback function for the GPIO28
function callback28(pin, mode) {
  console.log('Event on GPIO 28');
}

attachInterrupt(28, callback28, CHANGE);

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

Event on GPIO 28

זה לא עובד?

אם זה לא עובד אז…

  1. או שאתם מלחימים גרועים (כמוני ואפשר לראות לפי התמונות), שווה לבדוק עם מיקום פין אחר שבו אולי ההלחמה היתה טובה.
  2. החיישן עלול להיות תקול. בידקו עם חיישן אחר.
  3. זה נשמע נדוש אבל לבדוק חיבורים.

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

חיישן נוסף שאפשר לבדוק הוא חיישן קול. גם פה – אותו טריק בדיוק. יש פלוס (לחיבור למתח תמידי), יש מינוס (לחיבור הגראונד) ואת ה-DO לחיבור ל-GPIO לפי בחירתכם. אם תצעקו או תמחאו כף ליד החיישן? הוא יזרים אירוע.

חיישן קול מחובר לפיי פיקו

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

למשל הקוד הבא שמאפשר לי לזהות מחיאת כף כפולה.

pinMode(28, INPUT); 

let eventCounter = [];

// Callback function for the GPIO28
function callback28(pin, mode) {
  console.log('Event on GPIO 28');
  let currentTime = millis();
  console.log(`Adding ${currentTime} to event count`);
  eventCounter.push(currentTime);
  console.log(`Event log length is ${eventCounter.length}`);
  // Check if there was sound less more than 0.3 seconds and less than 2 seconds ago.
  eventCounter.every(timeStamp => {
    let diff = currentTime -  timeStamp;
    if(diff > 300 && diff < 2000) {
      console.log('Double Clapping Activated!');
      eventCounter = [];
      return false;
    } else {
      return true;
    }
  })
}

attachInterrupt(28, callback28, CHANGE);

הקוד הזה מכניס את כל האירועים לתוך מערך כשבכל פעם שיש אירוע הוא בודק את כל המערך. אם יש אירוע רעש שהתרחש לפני יותר משליש שניה (כלומר לא קשור לאירוע הרעש הנוכחי) ולפני פחות מ-2 שניות (כלומר לא איזה אירוע רעש היסטורי) הוא מנקה את רשימת האירועים ומפעיל console.log. כמובן שהוא לא חייב להפעיל אותו אלא יכול להדליק נורה (זוכרים את הפוסט על הפלט הדיגיטלי?) או לעשות משהו מגניב אחר.

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

בפוסט הבא נדבר קצת על קלט אנלוגי וחשמל!

פוסטים נוספים שכדאי לקרוא

פתרונות ומאמרים על פיתוח אינטרנט

המנעו מהעלאת source control לשרת פומבי

לא תאמינו כמה אתרים מעלים את ה-source control שלהם לשרת. ככה תמצאו אותם וגם הסבר למה זה רעיון רע.

פתרונות ומאמרים על פיתוח אינטרנט

יישום של nonce על מנת להגן מפני התקפות injection

בפוסט הקודם הסברתי על hash עם CSP על משאבי inline – שזה נחמד ומעולה אבל פחות ישים בעולם האמיתי שבו בדרך כלל התוכן ה-inline (בין

גלילה לראש העמוד