במאמר הקודם למדנו על פלט דיגיטלי – 0 או 1. במאמר הזה נדבר על קלט דיגיטלי שגם הוא 0 או 1. עבור קלט אנחנו צריכים חיישן. יש לנו לא מעט חיישנים שמסתובבים שם בחוץ וחלקם אנלוגיים, דיגיטליים או תומכים גם וגם. חיישן לחות הוא דוגמה טובה. כאשר הוא אנלוגי הוא נותן לנו מידע של ערכים, אבל בדיגיטלי הוא נותן לנו 1 (נוכחות של מים) ו-0 (אין נוכחות של מים). ואנחנו נעשה את זה בג׳אווהסקריפט! שזה תמיד מדהים.
איך אני יודע שחיישן תומך בדיגיטלי או אנלוגי? אני מסתכל על גב החיישן. יש שם + ו- (למתח, שמפעיל את החיישן) ואז פין שיש עליו DO. שזה אומר Digital Output. לפעמים יש AO שזה Analog Output שגם בזה אפשר להשתמש אבל אני לא מלמד על זה בפוסט הזה (בפוסטים הבאים כן).
החיבור הוא פשוט. את ה-+ אני אחבר לפין שיש בו מתח (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! אושר גדול!
זה לא עובד?
אם זה לא עובד אז…
- או שאתם מלחימים גרועים (כמוני ואפשר לראות לפי התמונות), שווה לבדוק עם מיקום פין אחר שבו אולי ההלחמה היתה טובה.
- החיישן עלול להיות תקול. בידקו עם חיישן אחר.
- זה נשמע נדוש אבל לבדוק חיבורים.
ואת החיישן מאיפה משיגים? מעלי אקספרס בדולר או שניים. אפשר גם לקנות קיטים שלמים של חיישני ארדואינו בדולרים בודדים שיביאו לכם שפע של שעשועים.
חיישן נוסף שאפשר לבדוק הוא חיישן קול. גם פה – אותו טריק בדיוק. יש פלוס (לחיבור למתח תמידי), יש מינוס (לחיבור הגראונד) ואת ה-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. כמובן שהוא לא חייב להפעיל אותו אלא יכול להדליק נורה (זוכרים את הפוסט על הפלט הדיגיטלי?) או לעשות משהו מגניב אחר.
כמובן שאפשר לכתוב את הקוד בכמה דרכים – כמו למשל לשמור רק את האירוע האחרון בזכרון ולהשוות אותו בכל פעם.
בפוסט הבא נדבר קצת על קלט אנלוגי וחשמל!
2 תגובות
היי
איך ניתן לקשר את המפסקים החכמים שיש לי בבית ומחוברים לרשת ה wifi לכתיבת קוד ב java script?
איך נקרא חישן הרעש ?