גילוי עם חיישן מרחק
ערכה: גלאי כניסות לחדר
יש שני נושאים שאתעמק בהם בקוד זה
- ניהול השימוש בחיישן
- זיהוי גילוי יחיד עבור כניסה אחת
ניהול השימוש בחיישן
נגדיר תחילה את ערכי המרחק המקסימלי.
יש שני ערכים כאלה - האחד שמעבר לו אנו כלל לא מנסים לגלות. והשני שמעבר לו גם אם גילינו זה לא מעניין אותנו
int max_dist=60; // cm int alert_dist=50; // cm
מתוך המרחק המקסימלי לגילוי, נעשה חישוב של הזמן המקסימלי שמחכים לתשובה. פרמטר זה מועבר אל פקודת הגילוי
float maxLenInMicroSec=max_dist * 2 / 0.034;
הפונקציה שעושה את הגילוי ומחשבת את המרחק עד העצם שהתגלה היא:
void calc_dist(){ sendTrig(); // Reads the echoPin, returns the sound wave travel time in microseconds duration = pulseIn(echoPin, HIGH,maxLenInMicroSec); // Calculating the distance distance= round(duration*0.034/2); }
הפונקציה שולחת טריגר, ומחכה לתשובה מהחיישן. אם יש - היא מחשבת מתוך הזמן עד התשובה את המרחק אל העצם (ב-ס"מ), ואם אין תשובה היא תחזיר 0
הפונקציה שיוצרת את הטריגר היא:
void sendTrig(){ // Clears the trigPin digitalWrite(trigPin, LOW); delayMicroseconds(2); // Sets the trigPin on HIGH state for 10 micro seconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); }
זיהוי גילוי יחיד עבור כניסה אחת
כיוון שתהליך הכניסה לחדר יניב יותר מגילוי אחד (כי המעבר ליד החיישן לוקח קצת זמן), אנו רוצים ליצור בקוד רק התרעה יחידה על כל כניסה.
נגדיר שני מצבים (בתוך הטווח ומחוץ לטווח)
#define DIST_FAR 1 #define DIST_NEAR 2
ואת המשתנה שישמור את המצב הנוכחי
byte currect_dist_state;
וניתן לו ערך ראשוני
currect_dist_state=DIST_FAR;
בתוך פונקציית הגילוי שלנו, נחכה למצב של אין גילוי, ואז נבדוק אם המצב הקודם היה שיש גילוי.
אם השילוב הזה מתקיים, הרי שממש עכשיו הסתיים הגילוי, ולכן נוציא את ההתרעה.
בשאר המצבים, רק נעדכן את הסטטוס כך שיתאים למצב הנכון
if((distance==0)||(distance > alert_dist)){ // no detection if(currect_dist_state == DIST_NEAR){ // new detection currect_dist_state=DIST_FAR; ret=true; } } else { // now detecting currect_dist_state=DIST_NEAR; }