كيفية عمل إنذار غاز باستخدام PIC16F1516

يمكن أن تكون الغازات مثل الغاز الطبيعي خطيرة للغاية على حاة الانسان ، ويمكن أن تؤدي إلى الوفاة إذا لم يتم ضبطها. في هدا المشروع ، سنلقي نظرة على مستشعر الغاز MQ-2 ، ونفهم كيف يعمل ، ونتعلم كيفية إنشاء نظام إنذار PIC بسيط يعرض مستويات الاكتشاف الحالية ويطلق إنذارًا عند وجود مستوى خطير من الغاز مكتشف وسط ما.

 كيف يعمل إنذار الغاز 

المكونان الرئيسيان لهذا المشروع هما مستشعر MQ-2 و PIC16F1516. مستشعر الغاز MQ-2 قادر على اكتشاف أنواع متعددة من الغازات المتفجرة ، مثل الكحول ، ولديه حساسية عالية للغازات بما في ذلك غاز البترول المسال والبروبان والهيدروجين. يوجد في قلب المستشعر SnO2 (أكسيد القصدير) ، والذي يتمتع بمقاومة كبيرة عندما يكون في الهواء النظيف. عندما يتلامس المستشعر مع غاز متفجر ، تقل مقاومة المستشعر. يتم تثبيت هذا المستشعر على لوحة الدوائر المطبوعة التي تحتوي على دائرة مقارنة ، لذلك عندما يتجاوز مستوى الكشف الحد الأقصى ، يتم إنتاج إشارة يمكن قراءتها مباشرة بواسطة PIC (دبوس إخراج المستشعر إما 1 أو 0). ومع ذلك ، تحتوي وحدة المستشعر أيضًا على خرج تناظري ، مما يسمح لنا بإجراء قياسات. لذلك يتم توصيل مستشعر MQ-2 بدبوسين على المنفذ A من PIC16F1516: RA0 و RA1. يعالج RA0 الإشارة الرقمية ، التي تخبر PIC أن مستويات الغاز في مستوى خطير ، بينما يعالج RA1 تحويل ADC ، مما يسمح لنا بعرض القيمة المكتشفة على شاشة LCD.

عند بدء التشغيل ، تقوم PIC بتشغيل التكوين الخاص بها ، والذي يقوم بتكوين منافذ الإدخال والإخراج ، ووحدة ADC ، والمذبذب الداخلي ، وشاشة LCD. مع تكوين النظام وتشغيله بشكل صحيح ، تبدأ الموافقة المسبقة عن علم الحلقة اللانهائية. يتضمن ذلك أخذ قياسات من المستشعر ، وعرض النتائج ، ثم التحقق من مستوى الخطر الناتج الرقمي لمستشعر MQ-2. يتم أخذ القياسات عن طريق تعيين GO bit في وحدة ADC ، في انتظار انتهاء التحويل ، ثم قراءة ADRESH. ثم يتم تحويل هذا الرقم إلى سلسلة ASCII وإرساله إلى وحدة LCD.

إذا اكتشف PIC أن مستوى الغاز أصبح خطيرًا (بفضل الإخراج الرقمي لـ MQ-2) ، فإنه ينتقل إلى روتين إنذار ، والذي يقوم بتشغيل الجرس والصمام الأبيض. على عكس مشروع كاشف الحريق ، لا تحتوي هذه الدائرة على زر إعادة تعيين أو أي طريقة للخروج من حلقة الإنذار (تتضمن إعادة ضبط الإنذار فصل الطاقة وإعادة تمكينها). يتم ذلك لتقليل فرصة إيقاف تشغيل الإنذار في حالة اكتشاف الغاز المتفجر. على عكس النار والدخان ، يمكن أن يؤدي تراكم الغاز إلى حدوث انفجار في أي وقت ، لذا فإن الإخلاء السريع أمر حيوي.


 

كود المشروع:


#include <xc.h>
#include "../include/config.h"


#define true 1
#define false 0

#define gas_digital PORTAbits.RA1
#define gas_analog PORTAbits.RA0
#define alarm LATAbits.LATA2
#define light LATAbits.LATA3
#define e LATBbits.LATB1
#define rs LATBbits.LATB0


char numberASCIIArray[5] = {0,0,0,0,0};

void delay(unsigned char length);
void delay_long(unsigned char length);
void delay_longer(double length);
void cout_lcd(const char* str);
void lcd_cmd(unsigned char cmd);
void lcd_putchr(unsigned char c);
void byteToASCII(unsigned char number);


void main(void)
{
configure();

TRISA = 0b11110011;
TRISB = 0b00;
TRISC = 0x00;

LATA = 0x00;
LATB = 0x00;
LATC = 0x00;

ADCON0bits.CHS = 0b00000;
ADCON0bits.ADON = 1;
ADCON1bits.ADFM = 0;
ADCON1bits.ADCS = 0b100;
ANSELA = 0b00000001;


// Setup the LCD here
light = 1;
delay_longer(1000);
light = 0;

lcd_cmd(0b00111000);
lcd_cmd(0b00001100);
lcd_cmd(0x01);
lcd_cmd(0x02);

cout_lcd("Hello");
delay_longer(8000);

lcd_cmd(0x01);
lcd_cmd(0x02);
cout_lcd("Gas Detector V1");

while(1)
{
delay_longer(5000);
ADCON0bits.GO = 1;
while(ADCON0bits.GO);

// Second line on LCD
lcd_cmd(0b11000000);
cout_lcd(" ");
lcd_cmd(0b11000000);
cout_lcd("Level: ");
byteToASCII(ADRESH);
cout_lcd(numberASCIIArray);

// Check the digital detection line
if(gas_digital == 0)
{
while(1)
{
lcd_cmd(0x01);
lcd_cmd(0x02);
cout_lcd("!!GAS DETECTED!!");
lcd_cmd(0b11000000);
cout_lcd(" ");
lcd_cmd(0b11000000);
cout_lcd(" !!EVACUATE!! ");
// Beep first
for(unsigned char x = 0; x < 4; x ++)
{
delay_longer(3000);
alarm = 1;
delay_longer(1500);
alarm = 0;
}

light = 1;
}
}
}
}



void delay(unsigned char length)
{
for(unsigned char i = 0; i < length; i ++)
{
}
}


void delay_long(unsigned char length)
{
for(unsigned char i = 0; i < length; i ++)
{
delay(255);
}
}


void delay_longer(double length)
{
while(length != 0)
{
length --;
}
}


void cout_lcd(const char* str)
{
unsigned char strPtr = 0;
while(str[strPtr] != 0x00)
{
lcd_putchr(str[strPtr]);
strPtr ++;
}
}


void lcd_cmd(unsigned char cmd)
{
e = 1;
delay(20);
rs = 0;
delay(20);
LATC = cmd;
delay(20);
e = 0;
delay(20);
e = 1;
delay_long(10);
}


void lcd_putchr(unsigned char c)
{
e = 1;
delay(10);
rs = 1;
delay(10);
LATC = c;
delay(10);
e = 0;
delay(10);
e = 1;
delay(10);
}


void byteToASCII(unsigned char number)
{
unsigned char hundreds = 0;
unsigned char tens = 0;
unsigned char units = 0;
unsigned char strPtr = 0;

for(unsigned char i = 0; i < 5; i ++)
{
numberASCIIArray[i] = 0;
}

while(number >= 100)
{
hundreds ++;
number = number - 100;
}

while(number >=10)
{
tens ++;
number = number - 10;
}

units = number;

if(hundreds > 0)
{
hundreds = hundreds + 0x30;
numberASCIIArray[strPtr] = hundreds;
strPtr ++;
}
if(tens > 0)
{
tens = tens + 0x30;
numberASCIIArray[strPtr] = tens;
strPtr ++;
}

number = number + 0x30;
numberASCIIArray[strPtr] = number;
strPtr ++;

while(strPtr < 5)
{
numberASCIIArray[strPtr] = 0;
strPtr ++;
}
}

 
 

 

 

1 تعليقات

  1. لو سمحتم نريد المخطط البياني للتجربه. مع كتابه كل ادوات التجربه. اذا ممكن
    شكرا لتجاوبكم معنا...





    ردحذف
أحدث أقدم