- רכיבים נדרשים
- חיישן דופק SEN-11574
- תרשים מעגלים לממשק חיישני דופק עם מיקרו-בקר PIC
- הסבר קוד PIC16F877A למוניטור פעימות לב
קצב פעימות הלב הוא הפרמטר החשוב ביותר במעקב אחר בריאותו של כל אדם. בעידן המודרני של מכשירים לבישים, ישנם הרבה מכשירים אשר יכולים למדוד פעימות לב, לחץ דם, צעדים, קלוריות שרופות ועוד הרבה דברים אחרים. במכשירים אלה יש חיישן דופק כדי לחוש את קצב הדופק. היום נשתמש גם בחיישן דופק עם מיקרו-בקר PIC לספירת פעימות לב לדקה ואת מרווח ה Inter-Beat, ערכים אלה יוצגו עוד על גבי LCD בגודל 16x2 תווים. נשתמש במיקרו-בקר PIC16F877A PIC בפרויקט זה. כבר ממשקנו חיישן דופק עם Arduino למערכת ניטור חולים.
רכיבים נדרשים
- מיקרו-בקר PIC16F877A
- 20 Mhz קריסטל
- קבלים 33pF 2 יח '
- נגד 4.7k 1 יח '
- LCD אופי 16x2
- סיר 10K לבקרת ניגודיות של ה- LCD
- SEN-11574 חיישן דופק
- רצועת סקוטש
- מתאם מתח 5V
- חוטי לוח לחיצה וחיבור
חיישן דופק SEN-11574
כדי למדוד את פעימות הלב אנו זקוקים לחיישן דופק. כאן בחרנו חיישן דופק SEN-11574 אשר זמין בקלות בחנויות מקוונות או לא מקוונות. השתמשנו בחיישן זה שכן ישנם קודי דוגמה המסופקים מהיצרן, אך זהו קוד ארדואינו. המירנו את הקוד הזה למיקרו-בקר PIC שלנו.
החיישן הוא ממש קטן ומושלם לקריאת פעימות לב על פני תנוך האוזן או על קצה האצבע. קוטרו 0.625 "ועובי 0.125" מהצד PCB העגול.
חיישן זה מספק אות אנלוגי וניתן להניע את החיישן עם 3 וולט או 5 וולט, הצריכה הנוכחית של החיישן היא 4 mA, וזה נהדר ליישומים ניידים. החיישן מגיע עם שלושה חוטים עם כבל חיבור ארוך בגודל 24 אינץ 'וכותרת זכר ברג בקצהו. כמו כן, החיישן מגיע עם רצועת אצבעות וולקרו כדי ללבוש אותו על קצה האצבע.
סכמטי חיישן דופק מסופקים גם על ידי היצרן וזמינים גם באתר sparkfun.com.
סכמטי החיישן מורכב מחיישן דופק אופטי, מעגלי RC לביטול רעש או פילטרים, אותם ניתן לראות בתרשים הסכימטי. R2, C2, C1, C3 ומגבר תפעולי MCP6001 משמשים לפלט אנלוגי מוגבר אמין.
ישנם מעט חיישנים אחרים לניטור פעימות לב אך נעשה שימוש נרחב בחיישן הדופק SEN-11574 בפרויקטים של אלקטרוניקה.
תרשים מעגלים לממשק חיישני דופק עם מיקרו-בקר PIC
כאן אנו חברנו את החיישן דופק על פני 2 nd סיכה של מייקרו היחיד. מכיוון שהחיישן מספק נתונים אנלוגיים, עלינו להמיר את הנתונים האנלוגיים לאות דיגיטלי על ידי ביצוע חישובים נחוצים.
מתנד הקריסטל של 20MHz מחובר פני שתי סיכות OSC של יחידת המיקרו-בקר עם שני קבלי 33pF קרמיקה. ה- LCD מחובר ביציאת ה- RB של המיקרו-בקר.
הסבר קוד PIC16F877A למוניטור פעימות לב
הקוד מעט מורכב למתחילים. היצרן סיפק קודי דוגמה לחיישן SEN-11574, אך הוא נכתב עבור פלטפורמת Arduino. עלינו להמיר את החישוב עבור שבב המיקרו שלנו, PIC16F877A. קוד שלם ניתן בסוף פרויקט זה עם סרטון הדגמה. ואת קבצי C התומכים ניתן להוריד מכאן.
זרימת הקוד שלנו יחסית פשוטה וביצענו את השלבים באמצעות מקרה מתג . לפי היצרן, עלינו לקבל את הנתונים מהחיישן בכל 2 אלפיות השנייה. לכן, השתמשנו בשגרת שירות הפסקת טיימר שתפעיל פונקציה בכל 2 אלפיות השנייה.
זרימת הקוד שלנו בהצהרת מתג תעבור כך:
מקרה 1: קרא את ה- ADC
מקרה 2: חישוב פעימות הלב וה- IBI
מקרה 3: הראה את פעימות הלב ואת ה- IBI על גבי LCD
מקרה 4: IDLE (אל תעשה כלום)
בתוך פונקציית ההפסקה של הטיימר, אנו משנים את מצב התוכנית למקרה 1: קרא את ה- ADC בכל 2 אלפיות השנייה.
לכן, בפונקציה העיקרית הגדרנו את מצב התוכנית ואת כל מקרי המעבר .
בטל main () { system_init (); ראשי_מדינה = READ_ADC; בעוד (1) { switch (main_state) { case READ_ADC: { adc_value = ADC_Read (0); // 0 הוא מספר הערוץ main_state = CALCULATE_HEART_BEAT; לשבור; } מקרה CALCULATE_HEART_BEAT: { calc_heart_beat (adc_value); main_state = SHOW_HEART_BEAT; לשבור; } מקרה SHOW_HEART_BEAT: { if (QS == true) {// דופק נמצא // BPM ו- IBI נקבעו // כימות עצמי "QS" נכון כאשר Arduino מוצא דופק QS = false; // אפס את דגל העצמי הכמות לפעם הבאה // 0.9 משמש להשגת נתונים טובים יותר. למעשה לא צריך להשתמש BPM = BPM * 0.9; IBI = IBI / 0.9; lcd_com (0x80); lcd_puts ("BPM: -"); lcd_print_number (BPM); lcd_com (0xC0); lcd_puts ("IBI: -"); lcd_print_number (IBI); } } main_state = IDLE; לשבור; מקרה IDLE: { הפסקה; } ברירת מחדל: { } } } }
אנו משתמשים בשני ציוד היקפי לחומרה של ה- PIC16F877A: Timer0 ו- ADC.
בתוך הקובץ timer0.c, TMR0 = (uint8_t) (tmr0_mask & (256 - (((2 * _XTAL_FREQ) / (256 * 4)) / 1000)));
חישוב זה מספק את הפרעת הטיימר לשתי אלפיות השנייה. נוסחת החישוב היא
// TimerCountMax - (((עיכוב (ms) * Focs (hz)) / (PreScale_Val * 4)) / 1000)
אם אנו רואים את הפונקציה timer_isr , זה-
חלל timer_isr () { main_state = READ_ADC; }
בפונקציה זו מצב התוכנית משתנה ל- READ_ADC בכל 2ms.
ואז הפונקציה CALCULATE_HEART_BEAT לקוחה מקוד הדוגמה של Arduino.
בטל calc_heart_beat (int adc_value) { Signal = adc_value; sampleCounter + = 2; // עקוב אחר הזמן ב- mS בעזרת משתנה זה int N = sampleCounter - lastBeatTime; // עקוב אחר הזמן שעבר מאז המכה האחרונה כדי למנוע רעש // מצא את שיא ושפל הגל הדופק אם (Signal <thresh && N> (IBI / 5) * 3) {// הימנע מרעש דיכרוטי על ידי המתנה 3/5 של ה- IBI האחרון אם (Signal <T) {// T הוא שוקת T = Signal; // עקוב אחר הנקודה הנמוכה ביותר בגל הדופק } } …………. ………………………..
יתר על כן, הקוד השלם ניתן להלן ומוסבר היטב על ידי ההערות. ניתן להעלות עוד את נתוני חיישן פעימות הלב לענן ולפקח עליהם דרך האינטרנט מכל מקום, ובכך הופכים אותה למערכת ניטור פעימות לב מבוססת IoT, עקוב אחר הקישור למידע נוסף.
הורד מכאן קבצי C תומכים בפרויקט חיישן דופק PIC זה.