مقدمه
در این آموزش قصد داریم نحوه عملکرد سنسور MQ9 و طریقه استفاده از آن به کمک یک بورد آردوینو را به شما آموزش دهیم.
آنچه در این آموزش می آموزید:
- سنسور گاز چیست و چگونه کار می کند
- مقایسه برخی سنسورهای گاز
- سنسور گاز MQ9 چگونه کار می کند
- استفاده از سنسور MQ2 با یک آردوینو
سنسور گاز چیست و چگونه کار می کند؟
سنسور گاز وسیله ای است که حضور یک یا چند نوع گاز در محیط را تشخیص می دهد و کاربردهای زیادی در سیستم های امنیتی پالایشگاه ها، مراکز صنعتی و حتی منازل دارد، این سنسورها می تواند گاز های قابل احتراق، سمی، آلوده کننده و … را تشخیص دهد. روش های مختلفی برای تشخیص گاز وجود دارد که رایج ترین آنها استفاده از سنسورهای الکتروشیمیایی است. این سنسورها غلظت یک نوع گاز خاص را با انجام واکنش شیمیایی روی الکترود گرم شده خود و اندازه گیری جریان الکتریکی ناشی از آن، اندازه گیری می کنند.
سنسورهای گاز سری MQ
سری MQ رایج ترین سنسورهای گاز موجود هستند، این سری مدل های مختلف برای تشخیص گاز های مختلف دارد که برخی از آنها در زیر اشاره شده است:
Sensor Name | Detectable gas |
---|---|
MQ2 | Methane , Butane , LPG , Smoke |
MQ3 | Alcohol , Methanol , Smoke |
MQ8 | Hydrogen |
MQ9 | Carbon monoxide , Flammable gases |
MQ131 | Ozone |
MQ135 | Air quality |
MQ216 | Natural gas , Coal gas |
MQ137 | Ammonia |
MQ4 | Methane , CNG gas |
نحوه کار با این سنسورها تقریبا یکسان است، و در اینجا با نحوه کار با MQ9 آشنا می شویم.
سنسور MQ9 یک سنسور حساس به منواکسید کربن و گازهای قابل اشتعال است که می تواند غلظت مونواکسید کربن را از 10 تا 1000 ppm و غلظت گازهای قابل اشتعال را از 100 تا 10000 ppm تشخیص دهد این سنسور دارای یک هیتر داخلی است که با اعمال ولتاژ 5v شروع به گرم شدن می کند؛ پس نگران گرم شدن سنسور خود نباشید!
با تغییر غلظت گازهای قابل تشخیص این سنسور مقاومت داخلی آن تغییر می کند. می توانید با یک مدار ساده این مقدار را خوانده و به ppm تبدیل کنید. ماژول های موجود در بازار مدار مورد نیاز را پیاده سازی کرده اند و نیاز به اضافه کردن قطعه دیگری ندارید. این سنسور کاربردهای مختلفی از جمله تشخیص نشتی گاز داخلی و صنعتی و تشخیص دهنده گاز قابل حمل، دارد.
نحوه استفاده از سنسور MQ9 با آردینو
این سنسور برای انتقال داده درست به دو گام اولیه نیاز دارد:
- MQ9 به 24 تا 48 ساعت preheat نیاز دارد، این به آن معناست که تغذیه سنسور خود را متصل کرده و سنسور را برای زمان preheat رها کنید تا آماده انتقال صحیح اطلاعات شود.
- در ابتدای کار باید سنسور خود را کالیبره کنید که در قسمت بعدی به آن اشاره کرده ایم.
سیم بندی
این ماژول 4 پایه دارد، Vcc را به 5 ولت، GND را به GND متصل کنید. پایه AO مقداری انالوگ با توجه به غلظت گاز برمی گرداند و پایه DO براساس میزان حساسیت تنظیم شده برای سنسور نسبت به یک غلظت مشخص، درصورت عبور میزان غلظت گاز از آن مقدار خروجی HIGH می دهد. میزان این حساسیت را می توانید با پتانسیومتر موجود روی ماژول تغییر دهید.
نکات
- این سنسور را در معرض آب و یخ زدگی قرار ندهید.
- اعمال ولتاژ بالاتر از حد مجاز(5 ولت) یا اعمال ولتاژ به پایه های اشتباه باعث آسیب دیدن سنسور می شود.
- قرار گیری طولانی مدت در غلظت های خیلی بالای گاز ممکن است برروی سنسور اثر منفی بگذارد.
- تکان دادن و یا در معرض لرزش هایی مانند لرزش التراسونیک قرار دادن سنسور، ممکن است باعث کاهش دقت آن شود.
چگونه سنسور MQ9 را کالیبره کنیم؟
در اولین استفاده لازم است شما سنسور را کالیبره کنید. این سنسور بر مبنای یک نسبت مقاومتی غلظت گاز را محاسبه می کند. این نسبت مقاومتی شامل یک R0 و یک Rs می باشد که R0 مقدار مقاومت سنسور در غلظت 1000ppm از LPG می باشد و Rs مقدار مقاومت داخلی سنسور است که با شدت گاز تغییر می کند. در یک هوای پاک، پس از preheat کد زیر را برروی آردوینو ریخته و مدتی صبر کنید (چیزی حدود 15 دقیقه) تا مقدار R0 ثابت شود و سپس این مقدار را جایی یادداشت کنید.
/*
MQ9 Calibration
modified on 19 Feb 2019
by Saeed Hosseini
Home
*/
void setup() {
Serial.begin(9600);
}
void loop() {
float sensor_volt;
float RS_air; // Rs in clean air
float R0; // R0 in 1000 ppm LPG
float sensorValue;
//Average
for(int x = 0 ; x < 100 ; x++)
{
sensorValue = sensorValue + analogRead(A0);
}
sensorValue = sensorValue/100.0;
//-----------------------------------------------/
sensor_volt = (sensorValue/1024)*5.0;
RS_air = (5.0-sensor_volt)/sensor_volt; // Depend on RL on yor module
R0 = RS_air/9.9; // According to MQ9 datasheet table
Serial.print("sensor_volt = ");
Serial.print(sensor_volt);
Serial.println("V");
Serial.print("R0 = ");
Serial.println(R0);
delay(1000);
}
همانطور که در کد بالا مشاهده می کنید، در گام اول برای داشتن دیتای پایدار از 100 مقدار اندازه گیری شده توسط سنسور میانگین میگیریم. سپس ولتاژ سنسور را محاسبه می کنیم و بعد از آن با توجه به مقاومت RL روی ماژول(برای ما 5k) میزان Rs را محاسبه می کنیم و در نهایت با توجه به جدول موجود در دیتاشیت ماژول مقدار R0 را می یابیم.
کد
توجه
مقدار R0 در کد زیر را با مقدار بدست آمده در مرحله کالیبراسیون جایگزین کنید.
/*
MQ9
modified on 19 Feb 2019
by Saeed Hosseini
Home
*/
const int LED = 2;
const int DO = 8;
void setup() {
Serial.begin(9600);
pinMode(LED, OUTPUT);
pinMode(DO, INPUT);
}
void loop() {
int alarm = 0;
float sensor_volt;
float RS_gas;
float ratio;
//-Replace the name "R0" with the value of R0 in the demo of First Test -/
float R0 = 0.91;
int sensorValue = analogRead(A0);
sensor_volt = ((float)sensorValue / 1024) * 5.0;
RS_gas = (5.0 - sensor_volt) / sensor_volt; // Depend on RL on yor module
ratio = RS_gas / R0; // ratio = RS/R0
//------------------------------------------------------------/
Serial.print("sensor_volt = ");
Serial.println(sensor_volt);
Serial.print("RS_ratio = ");
Serial.println(RS_gas);
Serial.print("Rs/R0 = ");
Serial.println(ratio);
Serial.print("\n\n");
alarm = digitalRead(DO);
if (alarm == 1) digitalWrite(LED, HIGH);
else if (alarm == 0) digitalWrite(LED, LOW);
delay(1000);
}
یک گام جلوتر
- سعی کنید با توجه به جدول مقدار گاز را برحسب ppm بیان کنید.
- سعی کنید یک هشدار دهنده هوشمند نشتی گاز CO بسازید.
Comments (20)
Best tutorial about using the gas sensor in the whole internet.
Keep up the good work!
Thank you for your kind comment. We always try to do our best.
سلام
خیلی مطلب عالی و کاملی رو گذاشتین، میشه گفت توی اینترنت تکه
در یک مورد کمی گیج شدم ممنون میشم راهنماییم کنید:
شما گفتید “R0 مقدار مقاومت سنسور در غلظت 1000ppm از LPG می باشد و Rs مقدار مقاومت داخلی سنسور است که با شدت گاز تغییر می کند. در یک هوای پاک، پس از preheat کد زیر را برروی آردوینو ریخته و مدتی صبر کنید (چیزی حدود 15 دقیقه) تا مقدار R0 ثابت شود و سپس این مقدار را جایی یادداشت کنید.”
این مقدار R0 یجا گفتید در 1000 ppm از LPG بعد برای گرفتن میزان R0 نوشتید در هوای پاک و چیزی از 1000ppm LPG نگفتید، این مورد بخاطر در دسترس نبودن میزان 1000ppm LPG هستش یا کلا نیازی نیست؟ در کل اگر شخصی این گاز LPG رو با میزان 1000ppm داشته باشه همین آزمایش رو باید انجام بده اما بجای هوای پاک از گاز lpg استفاده کنه؟
با سلام، ممنون از نظرتون
اگر در اختیار دارید بله
سلام این متودی که نوشتید برای سنسور MQ131 هم کاربرد دارد؟ و این که اگر از سنسور MQ131 استفاده شود چه تغییری در کد ایجاد میشود ؟
سلام.
بله نحوه کار سنسورهای سری MQ مشابه همدیگه ست و اگر بخواهید از سنسور MQ131 استفاده کنید باید: مقادیر R0 و Rl را مطابق با دیتاشیت سنسور و شرایط خود تعیین کنید. همچنین نمودار آورده شده در انتهای آموزش را با نمودار خاص سنسور مورد استفاده خود که در دیتاشیت موجود تعویض کنید.
سلام، مقدار RL موجود بر روی ماژولی که من از شما خریداری کردم 1K هست نه 5K، از طرفی بر اساس دیتاشیت سنسورهای MQ9 مقادیر نمودارها با توجه به RL برابر 10K تهیه شده اند. به نظر شما چطور می شه صرفا با تغییر در کد و یا تغییر در مقادیر نمودارها به مقدار PPM صحیح رسید؟ میخوام مجبور به لحیم کاری روی بورد نشم.
سلام
در کد مربوط به کالیبراسیون، خط 30، مربوط به محاسبه RS هست که وابسته به مقدار RL هست. میتونید این خط رو با توجه به مقدار RL ماژول خودتون که 1KOhm هست با ;RS_air = (1.0-sensor_volt)/sensor_volt جایگزین کنید. بقیه مراحل کار مشابه آموزش هست.
سلام مجدد جناب ملکی عزیز
آقا من فکر میکنم در کد مورد نظر اساسا اون عدد 5 در فرمول، میزان Vcc هست که 5 ولت هست نه RL، بهتره ادامه بحث رو در انجمن پیگیری کنم، به نظر من بجز بحث RL که حتما باید سخت افزاری حل بشه بحث محاسبه مقدار ppm هر گاز هم برای علاقمندان مطرحه که جاش اینجا نیست.
بله. میتونید سوالتون رو در انجمن مطرح کنید.
سلام. ینی همیشه قبل از استفاده از سنسور نیازمند 24 ساعت است که هیترش گرم بشه یا همون دفعه اول؟
سلام.
نه فقط برای بار اول و انجام کالیبراسیون سنسور لازم هست که اینا کار انجام بشه.
1-سلام خسته نباشید ببخشید شما گفتید که زمان 24تا48ساعته فقط برای دفعه اول نیاز هست .خب من میخوام این سنسور رادر یک دستگاه بگذارم .
و هرفردی که میخواهد ازان دستگاه میخواهد استفاده کند مکانش نیز قاعدتا تغیر میکند دراون صورت دوباره به اون تایم 24تا48ساعته نیاز داره یا اون کالیبراسونی که مقدار r0رو بذست می اورد؟ممنونم ازتون.
2-سوال دوم این هست که مثلن نوشتید این سنسور توانایی تشخیص گازهای lpg . co. ch4رادارد یعنی با این سنور میشه مقدار ppmهای هرکدوم از این گازهارو باهم حساب کرد؟
سلام
خیر، لازم نیست که هر بار بعد از عوض کردن مکان دوباره سنسور رو کالیبره کرد. فقط برای بار اول استفاده و بدست آوردن R0 لازمه که سنسور کالیبره بشه.
در مورد سوال دومتون هم باید بگم که این سنسور توانایی اندازهگیری میزان غلظت گازهایی غیر از CO رو هم داره ولی نه به صورت همزمان. در صورتی که بخواید باهاش یک گاز قابل اشتعال دیگه رو اندازهگیری کنید لازمه که متناسب با همون گاز سنسور رو کالیبره کنید.
با عرض سلام و خسته نباشید و درود فراوان
با تشکر از مطلاب خیلی خوبی که گذاشتین باید بگم که کد شما در یکجا مشکل داره و در یکجای دیگه در قسمت توضیحات اشتباهی مطلبی رو نوشتین
این اگر اصلاح بشه کار فوق العادتون عالی میشه
دوستان هم به این دو نکته که عرض میکنم توجه کنن :
1 : در قسمت کد کالیبراسیون ، قسمت میانگیری کردن از مقدار آنالوگ اینپوت چون جنس متغییری که اون مقدار داخل حلقه for رو در خودش ذخیره میکنه از جنس float هست ، مقدارش از ماکزیمم حالتش overflow میکنه و از بازه مقدار عدد مجاز متغیر float خارج هست چرا ؟ چون مقدار A0 مقداریست بین 0 تا 1024 در نتیجه شما حد وسط رو در نظر بگیرید 500 ، وقتی که 100 بار 500 + 500 میشه با یه ضرب ساده 100*500 عدد به دست اومده 50,000 میشه در صورتی که ماکزیمم عدد متغیر float تا عدد 65,535 هستش پس اگر با تغییر مقدار A0 به کمی بیش از عدد 500 ، به راحتی این متغییر overflow میشه
2 : RS_gas = (5.0 – sensor_volt) / sensor_volt; // Depend on RL on yor module برای این خط از کد توی توضیحات نوشته شده : بعد از آن با توجه به مقاومت RL روی ماژول(برای ما 5k)
باید عرض کنم اون عدد 5.0 نوشته شده هیچ ربطی به مقدار مقاومت RL نداره و اینکه مقدار مقاومت RL ماژول های mq9 اکثرا 1 کیلو هستش و این فرمول :
RS_gas = (5.0 – sensor_volt) / sensor_volt;
ساده شده یک فرمول ریاضیه برای بدست اوردن مقدار مقاومت mq9 زمانی که RL یک کیلو اهمی با ماژول سری شده و درست هستش
اما توی توضیحات به اشتباه نوشته شده مقاومت RL پنج کیلو !! که آدم رو با 5 توی فرمول به اشتباه میندازه
این فرمول از قانون تقسیم مقاومتی به دست اومده
هرگاه ما دوتا مقاومت سری داشته باشیم
یکی از اون مقاومت ها معلوم و دیگری مجهول باشه
با متصل کردن این مقاومت ها به یک ولتاژی و اندازه گیری افت ولتاژ بین آن ها میتوان مقاومت مجهول رو بدست اورد که این فرمول ساده شده همین حرفیه که زدم
با تشکر
سلام
در قسمت کالیبراسیون به نظرتون نیازی نیست با هر بار میانگین گرفتن مقدار sensorValue را صفر کنیم
مثلا خط 19 را با float sensorValue = 0; جایگزین کنیم
داخل سایت https://electropeak.com هم که فکر کنم مال خودتون باشه یه نفر هم همینو گفته بود
There is an error in the code!
Change this:
float sensorValue;
with:
float sensorValue = 0;
And everything will be fine!
سلام وقت بخیر
بنده فقط نیاز به پایه دیجیتال آن را دارم که با استفاده از میکرو شیر برقی گاز را قطع کند ایا من از همان پایه دیجیتال استفاده کنم و دیگر نیاز به کالیبره نیست؟
با سلام
برای استفاده از تمامی سنسور ها گاز شما نیاز به یک کالیبره جزعی نیز دارید.
در مورد شما توجه کنید بر روی برد یک پیچ قرار داده شده است و در زمانی که گاز های موجود از یک حدی بالاتر برود چراغ روی ماژول روشن می شود.
تایین این حد توسط این پیچ انجام می شود. از این رو شما حدی که نیاز دارید را ایجاد کنید و با قرار دادن سنسور در این حد و تنظیم این پیچ می توانید کاری که میخواهید را انجام بدهید.
سلام کالیبراسیون برای سنسور MQ_4 چگونه است؟