💨 سنسور گاز MQ-2 با آردوینو: تشخیص دود و گاز، گرم شدن، آستانه و آژیر
آشپزخانهای که بوی گاز گرفته، اتاقی که دود سیگار در آن مانده، یا انباری که باید تهویه شود؛ همهی اینها با یک سنسور ارزان قابل تشخیصاند: سنسور گاز MQ-2. این سنسور به دود، گاز شهری (متان)، پروپان و بوتان کپسول، هیدروژن و حتی بخار الکل حساس است. در این آموزش میبینیم سنسور MQ2 چطور کار میکند، چرا داغ میشود و چرا باید گرم شود، کدام پایه را به آردوینو بدهیم و یک هشداردهندهی هوشمند میسازیم که اول «هوای تمیز» اتاق را یاد میگیرد و بعد آژیر میزند. این مدار را میتوانی مثل کاربران ووکوی (Wokwi) اول در شبیهساز بسازی و رایگان امتحان کنی.
MQ-2 چطور گاز را حس میکند؟
قلب سنسور یک لولهی سرامیکی کوچک است که رویش لایهای از اکسید قلع (SnO2) کشیدهاند و داخلش یک سیم گرمکن هست. وقتی لایه داغ است، در هوای تمیز اکسیژن روی سطحش مینشیند و جلوی عبور الکترونها را میگیرد؛ مقاومت بالاست. وقتی گازی قابل اشتعال یا دود میرسد، با آن اکسیژن واکنش میدهد، الکترونها آزاد میشوند و مقاومت پایین میآید. ماژول این مقاومت را با یک مقسم ولتاژ به ولتاژ تبدیل میکند، پس گاز بیشتر یعنی ولتاژ و عدد بیشتر روی AO.
گرمکن حدود ۱۵۰ میلیآمپر از ۵ ولت میکشد؛ برای همین سنسور گرم میشود و بوی کمی هم در اولین روشن شدنها طبیعی است. این جریان را پین 5V آردوینو با تغذیهی USB تأمین میکند، ولی هیچوقت VCC سنسور را به یک پین دیجیتال وصل نکن.
پایههای ماژول MQ-2
| پایه | کارش |
|---|---|
| VCC | ۵ ولت (گرمکن به ۵ ولت نیاز دارد) |
| GND | زمین |
| AO | خروجی آنالوگ: هرچه گاز بیشتر، ولتاژ بیشتر |
| DO | خروجی دیجیتال: در بیشتر ماژولها وقتی گاز از آستانهی پیچ بیشتر شود LOW میشود و LED روی ماژول روشن میشود |
DO برای «بله یا نه» خوب است، ولی تنظیمش با پیچ و بدون دیدن عدد سخت است. ما از AO استفاده میکنیم تا آستانه را در کد و با عدد واقعی تعیین کنیم.
قطعهها و سیمکشی
- یک آردوینو Uno
- یک سنسور گاز MQ-2
- یک بازر
- یک LED قرمز با مقاومت ۲۲۰ اهم
| قطعه | پایه | آردوینو |
|---|---|---|
| MQ-2 | VCC | 5V |
| MQ-2 | GND | GND |
| MQ-2 | AO | A0 |
| MQ-2 | DO | وصل نمیشود (اختیاری) |
| LED | آند از راه ۲۲۰ اهم / کاتد | پین 9 / GND |
| بازر | + / − | پین 8 / GND |
کد کامل: هشدار با یادگرفتن هوای تمیز
// MQ-2 gas / smoke sensor on an Arduino Uno: warm-up, baseline, alarm.
const int GAS_PIN = A0; // AO of the module
const int LED_PIN = 9;
const int BUZZER_PIN = 8;
const unsigned long WARMUP_MS = 60000; // the heater needs time after power-on
const int MARGIN_ON = 150; // alarm when this much above clean air
const int MARGIN_OFF = 100; // calm again only below this
int baseline = 0;
bool alarmOn = false;
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
Serial.println("Heating the sensor...");
while (millis() < WARMUP_MS) {
digitalWrite(LED_PIN, (millis() / 500) % 2); // slow blink while warming
}
digitalWrite(LED_PIN, LOW);
long sum = 0; // average of clean air = baseline
for (int i = 0; i < 20; i++) {
sum += analogRead(GAS_PIN);
delay(50);
}
baseline = sum / 20;
Serial.print("Clean-air baseline: ");
Serial.println(baseline);
}
void loop() {
int gas = analogRead(GAS_PIN);
if (!alarmOn && gas > baseline + MARGIN_ON) alarmOn = true;
if (alarmOn && gas < baseline + MARGIN_OFF) alarmOn = false;
if (alarmOn) {
digitalWrite(LED_PIN, HIGH);
tone(BUZZER_PIN, 2000, 150); // two-tone siren
delay(150);
tone(BUZZER_PIN, 1400, 150);
delay(150);
} else {
digitalWrite(LED_PIN, LOW);
noTone(BUZZER_PIN);
delay(200);
}
Serial.print("gas:");
Serial.print(gas);
Serial.print(" limit:");
Serial.println(baseline + MARGIN_ON);
}
توضیح کد
- گرم شدن: حلقهی
while (millis() < WARMUP_MS)یک دقیقهی اول را صبر میکند و LED را آرام چشمک میزند تا بدانی سنسور هنوز آماده نیست. عدد MQ-2 در دقیقههای اول بعد از روشن شدن مدام پایین میآید و اگر زود تصمیم بگیری، آژیر الکی میزند. در شبیهساز برای تست سریعتر میتوانی این زمان را موقتاً کم کنی. - خط پایه: بهجای یک عدد ثابت مثل ۴۰۰، بیست بار هوای تمیز را میخوانیم و میانگین میگیریم. هر سنسور و هر اتاق عدد پایهی خودش را دارد و این روش خودش را با آن تطبیق میدهد.
- دو حاشیه: آژیر با ۱۵۰ واحد بالاتر از پایه شروع میشود و فقط وقتی عدد به زیر ۱۰۰ واحد بالای پایه برگشت خاموش میشود. این هیسترزیس نمیگذارد آژیر روی مرز قطع و وصل شود.
- آژیر دوصدایی: دو
toneپشت سر هم با فرکانسهای مختلف، صدایی شبیه آژیر واقعی میسازند. analogRead هم در هر دور یک عدد ۰ تا ۱۰۲۳ از ولتاژ AO میدهد. - خط
gas:… limit:…روی نمودار سریال دو منحنی میکشد: عدد سنسور و خط آستانه. دیدن عبور منحنی از خط، تنظیم حاشیهها را خیلی راحت میکند.
پروژهی کوچک: هشدار دوسطحی با فن تهویه
یک سیستم واقعیتر سه حالت دارد: سبز یعنی هوا تمیز است، زرد یعنی هشدار و فن تهویه روشن شود، قرمز یعنی خطر و آژیر. سه LED روی پینهای 11، 10 و 9، بازر روی 8 و یک رله برای فن روی پین 7 میگذاریم. این بار برای سادگی آستانهها ثابتاند؛ عددهایشان را از نمودار سنسور خودت بردار.
// Mini project: two-level gas alarm with an exhaust fan on a relay.
const int GAS_PIN = A0;
const int GREEN_LED = 11;
const int YELLOW_LED = 10;
const int RED_LED = 9;
const int BUZZER_PIN = 8;
const int FAN_RELAY = 7;
const int WARN_LEVEL = 300; // set both from your own clean-air readings
const int DANGER_LEVEL = 450;
void setup() {
Serial.begin(9600);
pinMode(GREEN_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(FAN_RELAY, OUTPUT);
}
void loop() {
int gas = analogRead(GAS_PIN);
int level = 0; // 0 = ok, 1 = warning, 2 = danger
if (gas > WARN_LEVEL) level = 1;
if (gas > DANGER_LEVEL) level = 2;
digitalWrite(GREEN_LED, level == 0 ? HIGH : LOW);
digitalWrite(YELLOW_LED, level == 1 ? HIGH : LOW);
digitalWrite(RED_LED, level == 2 ? HIGH : LOW);
digitalWrite(FAN_RELAY, level >= 1 ? HIGH : LOW); // fan on from "warning"
if (level == 2) tone(BUZZER_PIN, 2500);
else noTone(BUZZER_PIN);
Serial.print("gas:");
Serial.println(gas);
delay(300);
}
فن از سطح «هشدار» روشن میشود تا قبل از رسیدن به خطر، هوا را عوض کند. اگر بخواهی این را با سنسور شعله و دما به یک سیستم اعلام حریق کامل تبدیل کنی، سیستم اعلام حریق با آردوینو دقیقاً همین را میسازد. برای وصل کردن فن واقعی به رله هم آموزش ماژول رله را بخوان.
اجرا در شبیهساز، رایگان
سنسور گاز MQ-2 در تینکرکد فارسی جزو قطعههای رایگان است. نسخهی شبیهساز سه پایه دارد: VCC، GND و OUT که همان خروجی آنالوگ AO است؛ OUT را به A0 بده و بقیهی مدار را مثل جدول بالا بچین. در مود ساده (بدون کد) هم وقتی سنسور را انتخاب کنی، اسلایدر «غلظت گاز» را داری و میتوانی با یک بازر و باتری ببینی سنسور چطور واکنش میدهد. اگر هنوز با خواندن سنسورهای آنالوگ راحت نیستی، سنسور چیست؟ و راهنمای سنسورهای آردوینو شروع خوبیاند. اگر چیزی کار نکرد، دیباگ قدمبهقدم در شبیهساز کمک میکند خط به خط ببینی متغیرها چه میشوند.
اشکالهای رایج
- آژیر بلافاصله بعد از روشن شدن میزند: زمان گرم شدن را حذف کردهای. عدد سنسور سرد خیلی بالاتر از عدد پایدارش است.
- هیچوقت آژیر نمیزند: خط پایه را در هوای آلوده گرفتهای (مثلاً وقتی پنبهی الکلی کنار سنسور بود) یا حاشیه زیادی بزرگ است. پنبه را دور کن، ریست کن و عدد نمودار را ببین.
- عدد ثابت ۰ است: سیم را به DO وصل کردهای و با
analogReadمیخوانی، یا AO به پین آنالوگ دیگری غیر از A0 رفته است. - آردوینو ریست میشود یا سنسور ضعیف کار میکند: گرمکن ۱۵۰ میلیآمپر میخواهد. اگر چند سنسور MQ داری یا موتور هم در مدار است، منبع ۵ ولت جدا بگذار و GNDها را مشترک کن.
- عدد با باد کولر بالا و پایین میرود: جریان هوا لایهی داغ را خنک میکند. سنسور را جایی بگذار که مستقیم زیر باد نباشد.
سنسورهای دیگر را در بخش سنسورها و ماژولها ببین؛ مثلاً DHT22 برای دما و رطوبت که کنار MQ-2 یک ایستگاه کیفیت هوا میسازد.
مدار سنسور گاز را در شبیهساز بچین 💨سؤالهای رایج
چرا سنسور MQ-2 داغ میشود؟
داخل آن یک گرمکن کوچک هست که لایهی حساس را تا چند صد درجه داغ نگه میدارد؛ بدون این گرما سنسور اصلاً به گاز واکنش نشان نمیدهد. پس گرم شدنش طبیعی است، ولی به آن دست نزن.
سنسور MQ-2 چقدر طول میکشد تا آماده شود؟
بعد از هر بار روشن شدن حدود یک تا چند دقیقه طول میکشد تا عددش ثابت شود. سنسور نو هم بهتر است بار اول چند ساعت (طبق برگهی مشخصات تا ۲۴ ساعت) روشن بماند تا کاملاً جا بیفتد.
آیا میشود از MQ-2 بهجای دزدگیر گاز خانه استفاده کرد؟
نه. این پروژه برای یادگیری است. MQ-2 کالیبرهی استاندارد ندارد و جای دتکتور گاز و دود استاندارد و تأییدشده را نمیگیرد.