Детектор дыма на Arduino и датчике газа MQ2

Детекторы дыма бывают полезны для обнаружения дыма и огня в зданиях, поэтому они являются важной частью систем обеспечения безопасности. В этой статье мы рассмотрим схему детектора дыма на основе платы Arduino, которая сможет не только обнаруживать наличие дыма в воздухе, но также считывать и отображать уровень дыма в воздухе в PPM (parts per million – частиц на миллион). Когда уровень дыма становится больше чем 1000 ppm схема будет включать зуммер (буззер) – эту границу срабатывания зуммера можно изменить в тексте программы, приведенном в конце статьи. Кроме дыма датчик газа MQ2 может также обнаруживать сжиженный нефтяной газ, алкоголь, метан и другие газы.

Внешний вид детектора дыма на Arduino и датчике газа MQ2

Проектируемое нами устройство можно сделать на макетной или точечной плате, но мы решили сделать его в виде шилда (платы расширения) для Arduino на печатной плате. Для проектирования печатной платы мы использовали онлайн симулятор EasyEDA. Весь процесс проектирования этой печатной платы в виде шилда для Arduino подробно объяснен в статье, но вы можете использовать и свои собственные методы и инструменты для проектирования и изготовления печатной платы.

Внешний вид детектора дыма в виде платы расширения для Arduino

Необходимые компоненты

Плата Arduino Uno
Детектор дыма в виде платы расширения (шилд, Arduino Shield) для Arduino (собственного изготовления)
Источник питания

Компоненты для изготовления детектора дыма в виде платы расширения

Датчик газа (MQ2)
Резисторы (10 кОм и 1 кОм)
Зуммер (буззер)
ЖК дисплей 16х2
Потенциометр 10 кОм
Светодиод
LM358
Соединительные колодки

Проектирование детектора дыма в виде платы расширения для Arduino

Для проектирования детектора дыма в виде платы расширения для Arduino мы использовали симулятор EasyEDA, в котором мы сначала разработали схему и затем конвертировали ее в слой печатной платы с помощью опции автоматической трассировки (Auto Routing feature) печатной платы в симуляторе EasyEDA.

EasyEDA представляет собой бесплатный онлайн инструмент и может значительно упростить процесс создания вами готового устройства. В нем можно нарисовать схему, поработать с программой моделирования с ориентацией на интегральные схемы (программа SPICE), бесплатно сделать дизайн печатной платы и за сравнительно небольшие деньги изготовить потом эту печатную плату. Редактор этого симулятора содержит большое количество библиотек и компонентов, поэтому вы без труда найдете там то, что вам нужно. Полное руководство по использованию симулятора EasyEDA можно прочитать по этой ссылке – оно на английском языке, но если оно вас заинтересует, пишите об этом к комментариях к данной статье и я могу перевести это руководство на русский язык и разместить на нашем сайте.

Схему проектируемого нами детектора дыма в виде платы расширения для Arduino и дизайн печатной платы для него в формате симулятора EasyEDA можно скачать по следующей ссылке. Вид нарисованной схемы нашего детектора дыма в симуляторе EasyEDA показан на следующем рисунке.

Вид нарисованной схемы нашего детектора дыма в симуляторе EasyEDA

А на следующем рисунке представлен скриншот верха нашей печатной платы в симуляторе EasyEDA, но вы на вкладке ‘Layers’ данного симулятора можете посмотреть вид любой стороны печатной платы (верх, низ и т.д.).

Скриншот верха нашей печатной платы в симуляторе EasyEDA

Заказ печатной платы

После завершения работы над дизайном своей печатной платы в симуляторе EasyEDA вы можете нажать на иконку Fabrication output, откуда вас перебросит на страницу заказа печатной платы. Также вы можете скачать Gerber files вашей печатной платы и отослать их любому изготовителю печатных плат чтобы он согласно этим файлам изготовил для вас печатную плату. Но авторы оригинала данной статьи (я думаю вы уже поняли что статья переводная с иностранного сайта) утверждают, что значительно проще и дешевле заказать изготовление печатной платы непосредственно в EasyEDA. На странице заказа печатной платы вы можете выбрать количество экземпляров печатной платы, которые вы хотите заказать, ее толщину, массу меди и даже цвет печатной платы. После того как вы выбрали все опции нажмите “Save to Cart” и завершите свой заказ.

Внешний вид страницы заказа печатной платы в EasyEDA

Авторы статьи-оригинала утверждают, что готовая печатная плата пришла к ним буквально через несколько дней после ее заказа и они были крайне удивлены высоким качеством изготовления печатной платы.

После получения печатной платы авторы статьи-оригинала смонтировали и припаяли к ней все необходимые компоненты, в результате получилась конструкция следующего вида:

Вид сверху на детектора дыма в виде платы расширения для Arduino

После этого необходимо всего лишь подсоединить ЖК дисплей и установить сконструированную нами плату расширения поверх платы Arduino. Подробно все эти процессы показаны в видео в конце статьи.

Работа схемы

Схема устройства представлена на следующем рисунке.

Схема детектора дыма на Arduino и датчике газа MQ2

В проектируемой нами схеме мы использовали датчик газа MQ2, способный определять присутствие дыма в воздухе. ЖК дисплей 16×2 используется для отображения количества дыма в воздухе (в единицах PPM). Микросхема LM358 используется для конвертирования выхода датчика газа в цифровую форму (опционально). Зуммер используется как сигнализация и срабатывает когда содержание дыма в воздухе становится больше 1000 PPM.

В схеме мы использовали компаратор для сравнения выходного напряжения датчика дыма с заранее определенным значением напряжения, выход компаратора подсоединен к контакту D7 платы Arduino. Также выход датчика дыма подсоединен к аналоговому контакту A0 платы Arduino. Зуммер подключен к контакту D9. Соединения с ЖК дисплеем такие же в примерах среды Arduino IDE (12, 11, 5, 4, 3, 2). Остальные необходимые соединения показаны на приведенной схеме.

Примечание: в схеме нам необходимо замкнуть все три контакта J2 header чтобы вычислять количество PPM дыма.

Исходный код программы

Программа для данного проекта немного сложновата. Пользователю прежде всего необходимо внимательно прочитать даташит на датчик дыма MQ2 чтобы понять вычисления для данного проекта. Вы должны представлять как выглядит кривая концентрации дыма в воздухе по отношению к чистому воздуху. После прочтения даташита мы получили ряд значений которые будут нужны нам в коде программы для вычисления ppm дыма в воздухе.

Кривая для вычисления концентрации газов в датчика дыма MQ2

Здесь мы главным образом должны получить значения с кривой (мы взяли две точки с кривой), сопротивление датчика (будет рассчитано в коде программы), константу чистого воздуха (9.83) и сопротивление нагрузки (мы использовали 10 кОм). Мы можем найти значения кривой из даташита на датчик, использовать сопротивление нагрузки 5-54 кОм и затем мы можем рассчитать сопротивление датчика и образцы дыма.

Возьмите две точки с кривой и возьмите логарифм от этих точек, например: для первой точки (lg200, lg3.4)=(2.3,0.53) и для второй точки (lg10000,lg0.63)=(4,-0.20). Затем рассчитайте наклон кривой по формуле: (y2-y1)/(x2-x1), затем возьмите одну точку и рассчитанное значение наклона кривой (-0.44) и используйте их в программе — (x, y, slope). Дальнейшие необходимые вычисления приведены в коде программы.

В программе мы первым делом должны подключить заголовочный файл для ЖК дисплея и инициализировать необходимые контакты. Затем определить параметры (координаты одной точки и наклон) кривой и сопротивление нагрузки.

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#define buzzer 9
#define sensor A0
#define load_Res 10
#define air_factor 9.83
float SmokeCurve[3] ={2.3,0.53,-0.44};
float Res=0;

Затем в функции void setup() откалибровать наш датчик дыма при помощи функции SensorCalibration.

void setup()
{
lcd.begin(16,2);
lcd.print("Calibrating.....");
Res = SensorCalibration();
lcd.print("Calibration done.");
lcd.setCursor(0,1);
lcd.print("Res=");
lcd.print(Res);
lcd.print("kohm");
delay(2000);
lcd.clear();
pinMode(buzzer, OUTPUT);
}
float SensorCalibration()
{
int i;
float val=0;
val=resistance(50,500);
val = val/air_factor;
return val;
}

Затем в функции void loop() мы будем вычислять PPM дыма используя функцию resistance.

void loop()
{
lcd.setCursor(0,0);
lcd.print("SMOKE:");
float res=resistance(5,50);
res/=Res;
int result=pow(10,(((log(res)-SmokeCurve[1])/SmokeCurve[2]) + SmokeCurve[0]));
lcd.print(result);
lcd.print( " ppm ");
if(result>1000)
{
digitalWrite(buzzer, HIGH);
delay(2000);
}
else
digitalWrite(buzzer, LOW);
delay(500);
}
float resistance(int samples, int interval)
{
int i;
float res=0;
for (i=0;i<samples;i++)
{
int adc_value=analogRead(sensor);
res+=((float)load_Res*(1023-adc_value)/adc_value);
delay(interval);
}
res/=samples;
return res;
}

Примечание: перед тем как начать калибровку модуля, включите устройство в работу на время не менее 10 минут в чистом воздухе и только затем начинайте процесс калибровки. Процесс калибровки займет по меньшей мере 25 секунд.

Таким образом, в этой статье мы разработали схему детектора дыма на основе платы Arduino, которая рассчитывает и отображает на экране ЖК дисплея количество дыма в воздухе в единицах PPM. Также для нашего проекта мы разработали плату расширения для Arduino (на основе печатной платы) с использованием симулятора EasyEDA.

Далее представлен полный текст программы.

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#define buzzer 9
#define sensor A0
#define load_Res 10
#define air_factor 9.83
float SmokeCurve[3] ={2.3,0.53,-0.44}; // (x, y, slope) x,y – координаты одной точки и наклон (slope) между двумя точками
float Res=0;
void setup()
{
lcd.begin(16,2);
lcd.print("Calibrating.....");
Res = SensorCalibration();
lcd.print("Calibration done.");
lcd.setCursor(0,1);
lcd.print("Res=");
lcd.print(Res);
lcd.print("kohm");
delay(2000);
lcd.clear();
pinMode(buzzer, OUTPUT);
}
void loop()
{
lcd.setCursor(0,0);
lcd.print("SMOKE:");
float res=resistance(5,50);
res/=Res;
int result=pow(10,(((log(res)-SmokeCurve[1])/SmokeCurve[2]) + SmokeCurve[0]));
lcd.print(result);
lcd.print( " ppm ");
if(result>1000)
{
digitalWrite(buzzer, HIGH);
delay(2000);
}
else
digitalWrite(buzzer, LOW);
delay(500);
}
float resistance(int samples, int interval)
{
int i;
float res=0;
for (i=0;i<samples;i++)
{
int adc_value=analogRead(sensor);
res+=((float)load_Res*(1023-adc_value)/adc_value);
delay(interval);
}
res/=samples;
return res;
}
float SensorCalibration()
{
int i;
float val=0;
val=resistance(50,500);
val = val/air_factor;
return val;
}

Видео, демонстрирующее работу схемы

(Проголосуй первым!)
Загрузка...
43 просмотров


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *