תוכן עניינים:

צג CO Arduino באמצעות חיישן MQ-7: 8 שלבים (עם תמונות)
צג CO Arduino באמצעות חיישן MQ-7: 8 שלבים (עם תמונות)

וִידֵאוֹ: צג CO Arduino באמצעות חיישן MQ-7: 8 שלבים (עם תמונות)

וִידֵאוֹ: צג CO Arduino באמצעות חיישן MQ-7: 8 שלבים (עם תמונות)
וִידֵאוֹ: Как использовать оптопару Mosfet HW-532 для управления скоростью двигателя постоянного тока до 30 В или нагрузкой с помощью Arduino 2024, נוֹבֶמבֶּר
Anonim
צג CO Arduino באמצעות חיישן MQ-7
צג CO Arduino באמצעות חיישן MQ-7
צג CO Arduino באמצעות חיישן MQ-7
צג CO Arduino באמצעות חיישן MQ-7

כמה מילים מדוע נוצר ההוראה: יום אחד אמא של חברה שלי התקשרה אלינו באמצע הלילה כי היא הרגישה ממש חולה - היו לה סחרחורות, טכיקרדיה, בחילות, לחץ דם גבוה, היא אפילו התעלפה לזמן לא ידוע (כנראה ~ 5 דקות, אבל אין דרך לספר), והכל ללא כל סיבה נראית לעין. היא גרה בכפר קטן רחוק מבתי חולים (60 ק"מ מהמקום שלנו, 30 ק"מ לבית החולים הקרוב ביותר, 10 ק"מ בלי שום כביש רגיל בין לבין), אז מיהרנו אליה והגענו לשם זמן קצר לאחר האמבולנס. היא אושפזה ובבוקר היא הרגישה כמעט טוב, אך הרופאים לא הצליחו למצוא את הסיבה לכך. למחרת היה לנו רעיון: זה יכול היה להיות הרעלת CO, מכיוון שיש לה דוד גז (בתמונה), וישבה קרוב אליו כל הערב כשזה קרה. לאחרונה קנינו חיישן MQ-7 CO, אך מעולם לא הספקתי להרכיב סכמות עבורו, כך שזהו הזמן המושלם לעשות זאת. לאחר שעה של חיפוש אחר הוראות כלשהן באינטרנט, הבנתי שאני לא יכול למצוא מדריך שעומד במקביל להוראות יצרן החיישנים המסופק בגיליון הנתונים שלו ומסביר הכל (לדוגמא אחת היה קוד די טוב, אבל זה לא היה ברור כיצד ליישם אותו, אחרים היו פשוטים יותר מדי ולא יעבדו טוב). אז בילינו כ -12 שעות בפיתוח סכמות, הכנה והדפסה של מארז תלת מימד, בדיקה וכיול החיישן, ולמחרת הלכנו לדוד החשוד. התברר שרמות CO שם גבוהות במיוחד, ועלולות להיות קטלניות אם זמן החשיפה ל- CO יהיה ארוך יותר. אז אני מאמין שכל מי שיש לו מצב דומה (כמו דוד גז או בעירה אחרת שמתרחשת בתוך חלל מגורים) צריך לקבל חיישן כזה כדי למנוע משהו רע.

כל זה קרה לפני שבועיים, מאז שיפרתי את הסכימות והתכניות די הרבה, ועכשיו נראה שזה סביר יחסית ופשוט יחסית (לא פשוט של 3 שורות קוד, אבל עדיין). למרות שאני מקווה שמישהו עם מד CO מדויק יספק לי משוב על כיול ברירת המחדל שהכנסתי למערכון - אני חושד שזה רחוק מלהיות טוב. הנה מדריך מלא עם כמה נתונים ניסיוניים.

שלב 1: כתב חומרים

שטר חומרים
שטר חומרים

תזדקק ל: 0. לוח ארדואינו. אני מעדיף שיבוט סיני של Arduino Nano במחיר המצטיין של 3 $, אבל כל ארדואינו של 8 סיביות יעבוד כאן. סקיצה משתמשת בפעולת טיימרים מתקדמת, ונבדקה רק על מיקרו -בקר atmega328 - אם כי סביר להניח שהיא תעבוד היטב גם על אחרים. חיישן MQ-7 CO. הזמין ביותר עם מודול חיישן דגים מעופפים זה, עליו לעבור שינוי קטן, פרטים בשלב הבא, או שאתה יכול להשתמש בחיישן MQ-7 מופרד.

2. טרנזיסטור דו קוטבי NPN. כמעט כל טרנזיסטור NPN שיכול להתמודד עם 300 mA או יותר יעבוד כאן. טרנזיסטור PNP לא יעבוד עם מודול Flying Fish (כי יש לו סיכת חימום מולחמת לפלט החיישן), אך ניתן להשתמש בו עם חיישן MQ-7 נפרד.

3. נגדים: 2 x 1k (מ- 0.5k ל- 1.2k יעבוד בסדר), ו- 1 x 10k (הכי טוב לשמור על מדויק - אם כי אם בהחלט עליך להשתמש בערך אחר, התאם את משתנה reference_resistor_kOhm בסקיצה בהתאם).

4. קבלים: 2 x 10uF או יותר. דרושים טנטלום או קרמיקה, אלקטרוליטי לא יעבוד טוב עקב ESR גבוה (הם לא יוכלו לספק מספיק זרם להחלקת אדוות זרם גבוה).5. נוריות ירוקות ואדומות לציון רמת CO הנוכחית (ניתן להשתמש גם בלד יחיד בצבע כפול עם 3 מסופים, כפי שהשתמשנו באב טיפוס התיבה הצהובה שלנו).6. זמזם פיאז 'המציין רמת CO גבוהה. קרש לחוטים וחוטים (ניתן גם להלחם הכל לפיני ננו או להידחק לשקעי Uno, אך קל לטעות בדרך זו).

שלב 2: שינוי מודול או חיווט חיישן דיסקרטי

שינוי מודול או חיווט חיישן דיסקרטי
שינוי מודול או חיווט חיישן דיסקרטי

עבור מודול, עליך להסיר את הנגד והקבלים, כפי שמוצג בתמונה. אתה יכול להסיר למעשה הכל מה שאתה רוצה - אלקטרוניקה של מודולים היא חסרת תועלת לחלוטין, אנו משתמשים בה רק כמחזיק לחיישן עצמו, אך שני המרכיבים הללו ימנעו ממך לקבל קריאות נכונות, אם אתה משתמש בחיישן דיסקרטי, חבר את סיכות החימום (H1 ו- H2) ל- 5V וקולט הטרנזיסטור בהתאם. צרף צד חישה אחד (כל אחד מסיכות A) ל- 5V, צד חישה אחר (כל אחד מסיכות B) לנגד 10k, בדיוק כמו הסיכה האנלוגית של המודול בסכימות.

שלב 3: עקרון הפעולה

עקרון הפעולה
עקרון הפעולה
עקרון הפעולה
עקרון הפעולה

למה אנחנו צריכים את כל הסיבוכים האלה בכלל, למה לא לחבר 5V, הקרקע, ופשוט לקבל קריאות? ובכן, לא תקבל שום דבר שימושי בדרך זו, למרבה הצער.על פי גליון הנתונים MQ-7, חיישן חייב לעבור דרך גבוהה- ומחזורי חימום נמוך על מנת לקבל מדידות נכונות. במהלך שלב הטמפרטורה הנמוכה, CO נספג בצלחת, ומייצר נתונים משמעותיים. במהלך שלב הטמפרטורה הגבוהה, CO שנספג ותרכובות אחרות מתאדות מצלחת החיישנים, מנקות אותו למדידה הבאה.

אז באופן כללי ההפעלה פשוטה:

1. החל 5V למשך 60 שניות, אל תשתמש בקריאות אלה למדידת CO.

2. החל 1.4V למשך 90 שניות, השתמש בקריאות אלה למדידת CO.

3. עבור לשלב 1.

אבל הנה הבעיה: Arduino לא יכול לספק מספיק כוח כדי להפעיל את החיישן הזה מהסיכות שלו - תנור החישה של החיישן דורש 150 mA, בעוד שסיכת Arduino יכולה לספק לא יותר מ -40 mA, כך שאם הוא מחובר ישירות, סיכת Arduino תישרף והחיישן עדיין ינצח לא עובד. אז עלינו להשתמש במגבר זרם אחד הדורש זרם קלט קטן כדי לשלוט בזרם פלט גדול. בעיה נוספת היא קבלת 1.4V. הדרך היחידה להשיג ערך זה באופן מהימן מבלי להכניס הרבה רכיבים אנלוגיים היא להשתמש בגישה PWM (Pulse Width Modulation) עם משוב שישלוט במתח היציאה.

טרנזיסטור NPN פותר את שתי הבעיות: כאשר הוא מופעל כל הזמן, המתח על פני החיישן הוא 5V והוא מתחמם לשלב בטמפרטורה גבוהה. כאשר אנו מיישמים PWM על הקלט שלו, הזרם פועם, ואז הוא מוחלק על ידי הקבל, והמתח הממוצע נשמר קבוע. אם אנו משתמשים ב- PWM בתדירות גבוהה (בסקיצה יש תדר של 62.5KHz) וממוצע הרבה קריאות אנלוגיות (בסקיצה אנו ממוצעים מעל ~ 1000 קריאות), אז התוצאה אמינה למדי.

חשוב להוסיף קבלים לפי סכמות. תמונות כאן ממחישות את ההבדל באות עם ובלי קבלים C2: בלעדיו אדווה PWM נראית בבירור והיא מעוותת משמעותית את הקריאות.

שלב 4: תרשימים ולוח קרשים

תרשימים ולוח
תרשימים ולוח
תרשימים ולוח
תרשימים ולוח
תרשימים ולוח
תרשימים ולוח

להלן ערכת התרשימים ולוח הלחם.

אַזהָרָה! נדרש שינוי של מודול פריצה סטנדרטי! מודול ללא שינוי אינו מועיל. השינוי מתואר בשלב השני

חשוב להשתמש בסיכות D9 ו- D10 עבור נוריות LED, מכיוון שיש לנו תפוקות של טיימר חומרה 1, זה יאפשר לשנות את הצבעים בצורה חלקה. סיכות D5 ו- D6 משמשות לזמזם, מכיוון ש- D5 ו- D6 הן יציאות של טיימר חומרה 0. אנו מגדירים אותם להיות הפוכים אחד לשני, כך שהם יעברו בין מצבים (5V, 0V) ו- (0V, 5V), ובכך יפיקו צליל על זמזם. אזהרה: הדבר משפיע על הפרעת התזמון העיקרית של Arduino, כך שכל הפונקציות התלויות בזמן (כמו מילי ()) לא יניבו תוצאות נכונות בסקיצה זו (עוד על כך בהמשך). ל- D3 יש פלט חומרה Timer2 המחובר אליו (כמו גם D11 - אבל זה פחות נוח לשים חוט ב- D11 מאשר ב- D3) - אז אנו משתמשים בו כדי לספק PWM לשליטה על טרנזיסטור. הרסיסטור R1 משמש לשליטה בבהירות של נוריות LED. זה יכול להיות בכל מקום בין 300 ל 3000 אוהם, 1k הוא אופטימלי למדי מבחינת בהירות/צריכת חשמל. הנגן R2 משמש להגבלת זרם הבסיס של הטרנזיסטור. זה לא צריך להיות נמוך מ -300 אוהם (כדי לא להעמיס על סיכת ארדואינו), ולא יותר מ- 1500 אוהם. 1k יש בחירה בטוחה.

הנגד R3 משמש בסדרה עם צלחת חיישן על מנת ליצור מחלק מתח. המתח בפלט החיישן שווה ל- R3 / (R3 + Rs) * 5V, כאשר Rs הוא התנגדות החיישן הנוכחי. התנגדות החיישן תלויה בריכוז CO, כך שהמתח משתנה בהתאם. קבל C1 משמש להחלקת מתח PWM קלט על חיישן MQ -7, ככל שהקיבול שלו גבוה יותר כך ייטב, אך גם חייב להיות בעל ESR נמוך - כך קרמיקה (או טנטלום) קבל עדיף כאן, אלקטרוליטי לא יפעל טוב.

קבלים C2 משמשים להחלקת הפלט האנלוגי של החיישן (מתח היציאה תלוי במתח הכניסה - ויש לנו כאן PWM זרם די גבוה, שמשפיע על כל הסכימות, אז אנחנו צריכים C2). הפתרון הפשוט ביותר הוא להשתמש באותו קבל כמו הטרנזיסטור C1. NPN או מוליך זרם כל הזמן כדי לספק זרם גבוה על גוף החימום של החיישן, או שהוא עובד במצב PWM ובכך מפחית את זרם החימום.

שלב 5: תוכנית Arduino

תוכנית ארדואינו
תוכנית ארדואינו

אזהרה: החיישן דורש כיולון ידני לכל שימוש פרקטי. ללא כיול, תלוי בפרמטרים של החיישן הספציפי שלך, סקיצה זו עשויה להדליק את האזעקה באוויר נקי או לא לזהות ריכוז חד -פחמימתי של פחמן

הכיול מתואר בשלבים הבאים. כיול גס הוא פשוט מאוד, מדויק הוא די מורכב.

ברמה הכללית התוכנית די פשוטה:

ראשית, אנו מכיילים את ה- PWM שלנו על מנת לייצר 1.4V יציב הנדרש על ידי החיישן (רוחב PWM תקין תלוי בהרבה פרמטרים כמו ערכי הנגד המדויקים, התנגדות החיישן המסוים הזה, עקומת VA של הטרנזיסטור וכו 'וכו' - כך שהדרך הטובה ביותר היא לנסות ערכים שונים ותשתמש באחד המתאים ביותר). לאחר מכן, אנו עוברים ללא הרף מחזור של חימום של 60 שניות ומדידה של 90 שניות. ביישום זה מסתבך מעט. עלינו להשתמש בטיימרים של חומרה מכיוון שכל מה שיש לנו כאן זקוק ל- PWM יציב בתדירות גבוהה על מנת לתפקד כראוי. הקוד מצורף כאן וניתן להוריד אותו מ- github שלנו, כמו גם ממקור סכמטי ב- Fritzing. בתוכנית יש 3 פונקציות המטפלות בטיימרים: setTimer0PWM, setTimer1PWM, setTimer2PWM. כל אחת מהן מגדירה את הטיימר במצב PWM עם פרמטרים נתונים (הערה בקוד), וקובעת את רוחב הדופק על פי ערכי הכניסה. שלבי מדידה מוחלפים באמצעות הפונקציות startMeasurementPhase ו- startHeatingPhase, הם לטפל בהכל בפנים. ולהגדיר ערכי טיימר מתאימים למעבר בין חימום 5V ל -1.4V. מצב LEDs נקבע על ידי setLEDs פונקציה המקבלת בהירות ירוקה ואדומה על הקלט שלו (בקנה מידה ליניארי 1-100) והופכת אותו להגדרת טיימר מתאימה.

מצב הזמזם נשלט באמצעות הפונקציות buzz_on, buzz_off, buzz_beep. פונקציות הפעלה/כיבוי מפעילות ומכבות את הצליל, פונקציית הביפ מייצרת רצף צפצופים ספציפי עם פרק זמן של 1.5 שניות אם הוא נקרא מעת לעת (פונקציה זו חוזרת מיד כך שהיא לא תשהה את התוכנית הראשית - אך עליך להתקשר אליה שוב ושוב כדי לייצר דפוס צפצוף).

התוכנית מריצה לראשונה את הפונקציה pwm_adjust שמגלה רוחב מחזור PWM תקין כדי להשיג 1.4V במהלך שלב המדידה. ואז הוא מצפצף כמה פעמים כדי לציין שהחיישן מוכן, עובר לשלב המדידה ומתחיל את הלולאה הראשית.

בלולאה הראשית, התוכנית בודקת אם בילינו מספיק זמן בשלב הנוכחי (90 שניות לשלב המדידה, 60 שניות לשלב החימום) ואם כן, ואז משנה את השלב הנוכחי. הוא גם מעדכן כל הזמן את קריאות החיישנים באמצעות החלקה מעריכית: new_value = 0.999*old_value + 0.001*new_reading. עם פרמטרים כאלה ומחזור מדידה, הוא ממוצע אות במשך כ -300 אלפיות השנייה האחרונות. אזהרה: חיישן דורש כיולון ידני לכל שימוש פרקטי. ללא כיול, תלוי בפרמטרים של החיישן הספציפי שלך, סקיצה זו עשויה להדליק את האזעקה באוויר נקי או לא לזהות ריכוז חד -פחמימתי של פחמן.

שלב 6: הפעלה ראשונה: למה לצפות

הפעלה ראשונה: למה לצפות
הפעלה ראשונה: למה לצפות

אם הרכבת הכל כמו שצריך, לאחר הפעלת הסקיצה תראה משהו כזה במסך הסדרתי:

התאמת PWM w = 0, V = 4.93

התאמת PWM w = 17, V = 3.57 PWM תוצאה: רוחב 17, מתח 3.57

ולאחר מכן סדרה של מספרים המייצגים את קריאות החיישן הנוכחיות. חלק זה הוא התאמת רוחב PWM על מנת לייצר את מתח החימום של החיישן קרוב ל -1.4 V ככל האפשר, המתח הנמדד ינוכה מ -5 V, כך שהערך הנמדד האידיאלי שלנו הוא 3.6V. אם תהליך זה לעולם לא מסתיים או מסתיים לאחר שלב אחד (וכתוצאה מכך רוחב שווה ל 0 או 254) - אז משהו לא בסדר. בדוק אם הטרנזיסטור שלך הוא באמת NPN ומחובר כראוי (וודא שהשתמשת בבסיס, אספן, סיכות פולט ימינה - הבסיס עובר ל- D3, אספן ל- MQ -7 והפולט לאדמה, אל תסמוך על תצוגת לוח הלוח Fritzing - זה לא נכון עבור כמה טרנזיסטורים) וודא שחיברת את קלט החיישן לכניסת A1 של Arduino. אם הכל בסדר, אתה צריך לראות בפלטר סדרתי של Arduino IDE משהו דומה לתמונה. מחזורי חימום ומדידה באורך של 60 ו -90 שניות פועלים בזה אחר זה, כאשר CO ppm נמדד ומתעדכן בסוף כל מחזור. אתה יכול לקחת כמה להבות פתוחות קרוב לחיישן כאשר מחזור המדידה כמעט מסתיים ולראות כיצד הוא ישפיע על הקריאות (בהתאם לסוג הלהבה, הוא יכול לייצר עד 2000 עמודים לדקה ריכוז CO באוויר הפתוח - כך שלמרות שרק חלק קטן של הוא למעשה נכנס לחיישן, הוא עדיין יפעיל את האזעקה, והוא לא ייכבה עד סוף המחזור הבא). הראיתי את זה על התמונה, כמו גם את התגובה לאש מהמצית.

שלב 7: כיול חיישן

כיול חיישן
כיול חיישן
כיול חיישן
כיול חיישן

על פי גליון הנתונים של היצרן, חיישן צריך להפעיל מחזורי חימום-קירור במשך 48 שעות ברציפות לפני שניתן יהיה לכייל אותו. ואתה צריך לעשות את זה אם אתה מתכוון להשתמש בו במשך זמן רב: במקרה שלי, קריאת החיישנים באוויר נקי השתנתה במשך כ -30% במשך 10 שעות. אם לא תיקח זאת בחשבון, תוכל לקבל תוצאה של 0 עמודים לדקה היכן שיש בפועל 100 עמודים לדקה של CO. אם אינך רוצה לחכות 48 שעות, תוכל לעקוב אחר תפוקת החיישן בסוף מחזור המדידה. כאשר למעלה משעה זה לא ישתנה במשך יותר מ 1-2 נקודות - אתה יכול להפסיק לחמם שם.

כיול גס:

לאחר הפעלת סקיצה במשך 10 שעות לפחות באוויר נקי, קח את ערך החיישנים הגולמי בסוף מחזור המדידה, 2-3 שניות לפני תחילת שלב החימום, וכתוב אותו במשתנה sensor_reading_clean_air (שורה 100). זהו זה. התוכנית תעריך פרמטרים של חיישן אחרים, הם לא יהיו מדויקים, אך אמורים להספיק כדי להבחין בין 10 ל -100 עמודים לדקה.

כיול מדויק:

אני מאוד ממליץ למצוא מד CO מכויל, להכין דגימת 100 עמודים לדקה CO (ניתן לעשות זאת על ידי הוצאת גז אדים למזרק - ריכוז CO יכול להיות בטווח של כמה אלפי עמודים לדקה - ולאט לאט להכניס אותו לצנצנת סגורה עם מד מכויל וחיישן MQ-7), קח קריאת חיישן גולמית בריכוז זה והכנס אותה למשתנה sensor_reading_100_ppm_CO. ללא שלב זה, מדידת ה- ppm שלך יכולה להיות שגויה מספר פעמים לשני הכיוונים (עדיין בסדר אם אתה צריך אזעקה לריכוז CO מסוכן בבית, שם בדרך כלל לא צריך להיות CO, אבל לא טוב לכל יישום תעשייתי).

מכיוון שלא היה לי מד CO, השתמשתי בגישה מתוחכמת יותר. ראשית הכנתי ריכוז גבוה של CO באמצעות בעירה בנפח מבודד (תמונה ראשונה). במאמר זה מצאתי את הנתונים השימושיים ביותר, כולל תשואות CO עבור סוגי להבה שונים - זה לא בתמונה, אך הניסוי האחרון השתמש בעירה של גז פרופאן, עם אותה התקנה, וכתוצאה מכך ריכוז ~ 5000 עמודים לדקה CO. לאחר מכן הוא מדולל 1:50 על מנת להשיג 100 עמודים לדקה, כפי שמוצג בתמונה השנייה, ושימש לקביעת נקודת ההתייחסות של החיישן.

שלב 8: כמה נתונים ניסיוניים

כמה נתונים ניסיוניים
כמה נתונים ניסיוניים

במקרה שלי, החיישן עבד די טוב - הוא לא רגיש במיוחד לריכוזים ממש נמוכים, אבל מספיק טוב בשביל לזהות משהו גבוה מ -50 עמודים לדקה. ניסיתי להגדיל את הריכוז בהדרגה, לוקח מדידות ובניתי מערך תרשימים. ישנן שתי קבוצות של קווים של 0ppm - ירוק טהור לפני חשיפת CO וירוק צהוב לאחר מכן. נראה כי החיישן משנה מעט את עמידות האוויר הנקי שלו לאחר החשיפה, אך השפעה זו קטנה. נראה כי הוא אינו מסוגל להבחין בבירור בין 8 ו -15, 15 ו -26, 26 ו -45 עמודים לדקה-אך המגמה ברורה מאוד, כך שהוא יכול לדעת אם הריכוז הוא בטווח של 0-20 או 40-60 עמודים לדקה.. לריכוזים גבוהים יותר התלות מובחנת הרבה יותר - כאשר היא נחשפת למיצוי של להבה פתוחה, העקומה עולה מההתחלה מבלי לרדת כלל, והדינמיקה שלה שונה בתכלית. כך שלריכוזים גבוהים אין ספק שזה עובד בצורה אמינה, למרות שאני לא יכול לאשר את הדיוק שלו מכיוון שאין לי מד CO מדורג. כמו כן, קבוצת הניסויים הזו נעשתה באמצעות נגד עומס של 20k - ואחרי זה החלטתי כדי להמליץ על 10k כערך ברירת המחדל, זה צריך להיות רגיש יותר בדרך זו. זהו. אם יש לך מד CO אמין והרכבת לוח זה, אנא שתף משוב בנוגע לדיוק החיישן - יהיה נהדר לאסוף נתונים סטטיסטיים על חיישנים שונים ולשפר את הנחות ברירת המחדל של סקיצות.

מוּמלָץ: